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,1123 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import contextlib
5
+ import logging
6
+ import tempfile
7
+ from collections.abc import AsyncIterator
8
+ from dataclasses import dataclass
9
+ from pathlib import Path
10
+ from shutil import rmtree
11
+ from typing import Any, Union
12
+
13
+ import pytest
14
+
15
+ # TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469
16
+ from _pytest.fixtures import SubRequest
17
+ from chia_rs import G1Element
18
+
19
+ from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
20
+ from chia._tests.util.setup_nodes import setup_simulators_and_wallets_service
21
+ from chia._tests.util.time_out_assert import time_out_assert
22
+ from chia.consensus.constants import ConsensusConstants
23
+ from chia.pools.pool_puzzles import SINGLETON_LAUNCHER_HASH
24
+ from chia.pools.pool_wallet_info import PoolSingletonState, PoolWalletInfo
25
+ from chia.rpc.wallet_rpc_client import WalletRpcClient
26
+ from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
27
+ from chia.simulator.block_tools import BlockTools, get_plot_dir
28
+ from chia.simulator.full_node_simulator import FullNodeSimulator
29
+ from chia.simulator.simulator_protocol import ReorgProtocol
30
+ from chia.simulator.start_simulator import SimulatorFullNodeService
31
+ from chia.types.aliases import WalletService
32
+ from chia.types.blockchain_format.sized_bytes import bytes32
33
+ from chia.types.peer_info import PeerInfo
34
+ from chia.util.bech32m import encode_puzzle_hash
35
+ from chia.util.byte_types import hexstr_to_bytes
36
+ from chia.util.config import load_config
37
+ from chia.util.ints import uint32, uint64
38
+ from chia.wallet.derive_keys import find_authentication_sk, find_owner_sk
39
+ from chia.wallet.transaction_record import TransactionRecord
40
+ from chia.wallet.util.transaction_type import TransactionType
41
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
42
+ from chia.wallet.util.wallet_types import WalletType
43
+ from chia.wallet.wallet_node import WalletNode
44
+ from chia.wallet.wallet_state_manager import WalletStateManager
45
+
46
+ # TODO: Compare deducted fees in all tests against reported total_fee
47
+
48
+ # limit to plain consensus mode for all tests
49
+ pytestmark = [pytest.mark.limit_consensus_modes(reason="irrelevant")]
50
+
51
+ log = logging.getLogger(__name__)
52
+ FEE_AMOUNT = uint64(29_000)
53
+ MAX_WAIT_SECS = 30 # A high value for WAIT_SECS is useful when paused in the debugger
54
+ LOCK_HEIGHT = uint32(5)
55
+
56
+
57
+ def get_pool_plot_dir() -> Path:
58
+ return get_plot_dir() / Path("pool_tests")
59
+
60
+
61
+ @dataclass(frozen=True)
62
+ class TemporaryPoolPlot:
63
+ bt: BlockTools
64
+ p2_singleton_puzzle_hash: bytes32
65
+ plot_id: bytes32
66
+
67
+
68
+ @contextlib.asynccontextmanager
69
+ async def manage_temporary_pool_plot(
70
+ bt: BlockTools,
71
+ p2_singleton_puzzle_hash: bytes32,
72
+ ) -> AsyncIterator[TemporaryPoolPlot]:
73
+ with tempfile.TemporaryDirectory() as tmpdir:
74
+ tmp_path: Path = Path(tmpdir)
75
+ bt.add_plot_directory(tmp_path)
76
+ bt_plot = await bt.new_plot(p2_singleton_puzzle_hash, tmp_path, tmp_dir=tmp_path)
77
+ try:
78
+ await bt.refresh_plots()
79
+
80
+ plot = TemporaryPoolPlot(bt=bt, p2_singleton_puzzle_hash=p2_singleton_puzzle_hash, plot_id=bt_plot.plot_id)
81
+
82
+ yield plot
83
+ finally:
84
+ await bt.delete_plot(bt_plot.plot_id)
85
+
86
+
87
+ PREFARMED_BLOCKS = 4
88
+
89
+
90
+ @pytest.fixture(scope="function", params=[False, True])
91
+ def trusted(request: SubRequest) -> bool:
92
+ return request.param # type: ignore[no-any-return]
93
+
94
+
95
+ @pytest.fixture(scope="function")
96
+ def fee(trusted: bool) -> uint64:
97
+ if trusted:
98
+ return FEE_AMOUNT
99
+
100
+ return uint64(0)
101
+
102
+
103
+ OneWalletNodeAndRpc = tuple[WalletRpcClient, Any, FullNodeSimulator, int, BlockTools]
104
+
105
+
106
+ @pytest.fixture(scope="function")
107
+ async def one_wallet_node_and_rpc(
108
+ trusted: bool, self_hostname: str, blockchain_constants: ConsensusConstants
109
+ ) -> AsyncIterator[OneWalletNodeAndRpc]:
110
+ rmtree(get_pool_plot_dir(), ignore_errors=True)
111
+ async with setup_simulators_and_wallets_service(1, 1, blockchain_constants) as nodes:
112
+ full_nodes, wallets, bt = nodes
113
+ full_node_api: FullNodeSimulator = full_nodes[0]._api
114
+ wallet_service = wallets[0]
115
+ wallet_node = wallet_service._node
116
+ wallet = wallet_node.wallet_state_manager.main_wallet
117
+
118
+ if trusted:
119
+ wallet_node.config["trusted_peers"] = {
120
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
121
+ }
122
+ else:
123
+ wallet_node.config["trusted_peers"] = {}
124
+
125
+ await wallet_node.server.start_client(PeerInfo(self_hostname, full_node_api.full_node.server.get_port()), None)
126
+
127
+ balance = await full_node_api.farm_rewards_to_wallet(amount=8_000_000_000_000, wallet=wallet)
128
+ assert wallet_service.rpc_server is not None
129
+ client = await WalletRpcClient.create(
130
+ self_hostname, wallet_service.rpc_server.listen_port, wallet_service.root_path, wallet_service.config
131
+ )
132
+
133
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
134
+
135
+ yield client, wallet_node, full_node_api, balance, bt
136
+
137
+ client.close()
138
+ await client.await_closed()
139
+
140
+
141
+ Setup = tuple[FullNodeSimulator, WalletNode, bytes32, int, WalletRpcClient]
142
+
143
+
144
+ @pytest.fixture(scope="function")
145
+ async def setup(
146
+ one_wallet_and_one_simulator_services: tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools],
147
+ trusted: bool,
148
+ self_hostname: str,
149
+ ) -> AsyncIterator[Setup]:
150
+ rmtree(get_pool_plot_dir(), ignore_errors=True)
151
+ [full_node_service], [wallet_service], _bt = one_wallet_and_one_simulator_services
152
+ full_node_api: FullNodeSimulator = full_node_service._api
153
+ wallet_node = wallet_service._node
154
+ our_ph_record = await wallet_node.wallet_state_manager.get_unused_derivation_record(uint32(1), hardened=True)
155
+ our_ph = our_ph_record.puzzle_hash
156
+
157
+ wallet_server = wallet_service.rpc_server
158
+ assert wallet_server is not None
159
+
160
+ client = await WalletRpcClient.create(
161
+ self_hostname, wallet_server.listen_port, wallet_service.root_path, wallet_service.config
162
+ )
163
+
164
+ if trusted:
165
+ wallet_node.config["trusted_peers"] = {
166
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
167
+ }
168
+ else:
169
+ wallet_node.config["trusted_peers"] = {}
170
+
171
+ await wallet_node.server.start_client(PeerInfo(self_hostname, full_node_api.full_node.server.get_port()), None)
172
+
173
+ assert wallet_node._wallet_state_manager is not None
174
+ wallet = wallet_node._wallet_state_manager.main_wallet
175
+ total_block_rewards = await full_node_api.farm_rewards_to_wallet(amount=8_000_000_000_000, wallet=wallet)
176
+ await full_node_api.farm_blocks_to_wallet(count=3, wallet=wallet)
177
+
178
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
179
+
180
+ yield (
181
+ full_node_api,
182
+ wallet_node,
183
+ our_ph,
184
+ total_block_rewards,
185
+ client, # wallet rpc client
186
+ )
187
+
188
+ client.close()
189
+ await client.await_closed()
190
+
191
+
192
+ async def verify_pool_state(wallet_rpc: WalletRpcClient, w_id: int, expected_state: PoolSingletonState) -> bool:
193
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(w_id))[0]
194
+ return pw_status.current.state == expected_state.value
195
+
196
+
197
+ async def process_plotnft_create(
198
+ wallet_test_framework: WalletTestFramework, expected_state: PoolSingletonState, second_nft: bool = False
199
+ ) -> int:
200
+ wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
201
+
202
+ pre_block_balance_updates: dict[Union[int, str], dict[str, int]] = {
203
+ 1: {
204
+ "confirmed_wallet_balance": 0,
205
+ "unconfirmed_wallet_balance": -1,
206
+ "<=#spendable_balance": 1,
207
+ "<=#max_send_amount": 1,
208
+ ">=#pending_change": 1, # any amount increase
209
+ "pending_coin_removal_count": 1,
210
+ }
211
+ }
212
+
213
+ post_block_balance_updates: dict[Union[int, str], dict[str, int]] = {
214
+ 1: {
215
+ "confirmed_wallet_balance": -1,
216
+ "unconfirmed_wallet_balance": 0,
217
+ ">=#spendable_balance": 1,
218
+ ">=#max_send_amount": 1,
219
+ "<=#pending_change": 1, # any amount decrease
220
+ "<=#pending_coin_removal_count": 1,
221
+ },
222
+ }
223
+
224
+ if second_nft:
225
+ post_block = post_block_balance_updates | {
226
+ 2: {
227
+ "set_remainder": True, # TODO: sometimes this fails with pending_coin_removal_count
228
+ },
229
+ 3: {"init": True, "unspent_coin_count": 1},
230
+ }
231
+ else:
232
+ post_block = post_block_balance_updates | {2: {"init": True, "unspent_coin_count": 1}}
233
+
234
+ await wallet_test_framework.process_pending_states(
235
+ [
236
+ WalletStateTransition(
237
+ pre_block_balance_updates=pre_block_balance_updates,
238
+ post_block_balance_updates=post_block,
239
+ )
240
+ ]
241
+ )
242
+
243
+ summaries_response = await wallet_rpc.get_wallets(WalletType.POOLING_WALLET)
244
+ assert len(summaries_response) == 2 if second_nft else 1
245
+ wallet_id: int = summaries_response[-1]["id"]
246
+
247
+ await verify_pool_state(wallet_rpc, wallet_id, expected_state=expected_state)
248
+ return wallet_id
249
+
250
+
251
+ async def create_new_plotnft(
252
+ wallet_test_framework: WalletTestFramework, self_pool: bool = False, second_nft: bool = False
253
+ ) -> int:
254
+ wallet_state_manager: WalletStateManager = wallet_test_framework.environments[0].wallet_state_manager
255
+ wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
256
+
257
+ our_ph = await wallet_state_manager.main_wallet.get_new_puzzlehash()
258
+
259
+ await wallet_rpc.create_new_pool_wallet(
260
+ target_puzzlehash=our_ph,
261
+ backup_host="",
262
+ mode="new",
263
+ relative_lock_height=uint32(0) if self_pool else LOCK_HEIGHT,
264
+ state="SELF_POOLING" if self_pool else "FARMING_TO_POOL",
265
+ pool_url="" if self_pool else "http://pool.example.com",
266
+ fee=uint64(0),
267
+ )
268
+
269
+ return await process_plotnft_create(
270
+ wallet_test_framework=wallet_test_framework,
271
+ expected_state=PoolSingletonState.SELF_POOLING if self_pool else PoolSingletonState.FARMING_TO_POOL,
272
+ second_nft=second_nft,
273
+ )
274
+
275
+
276
+ class TestPoolWalletRpc:
277
+ @pytest.mark.anyio
278
+ async def test_create_new_pool_wallet_self_farm(
279
+ self,
280
+ one_wallet_node_and_rpc: OneWalletNodeAndRpc,
281
+ fee: uint64,
282
+ self_hostname: str,
283
+ ) -> None:
284
+ client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
285
+ wallet = wallet_node.wallet_state_manager.main_wallet
286
+
287
+ our_ph = await wallet.get_new_puzzlehash()
288
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
289
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
290
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
291
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
292
+ )
293
+ await full_node_api.process_transaction_records(records=[creation_tx])
294
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=30)
295
+
296
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
297
+ assert len(summaries_response) == 1
298
+ wallet_id: int = summaries_response[0]["id"]
299
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
300
+
301
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
302
+ assert status.target is None
303
+ assert status.current.owner_pubkey == G1Element.from_bytes(
304
+ bytes.fromhex(
305
+ "b286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
306
+ )
307
+ )
308
+ assert status.current.pool_url == ""
309
+ assert status.current.relative_lock_height == 0
310
+ assert status.current.version == 1
311
+ # Check that config has been written properly
312
+ full_config: dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
313
+ pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
314
+ assert len(pool_list) == 1
315
+ pool_config = pool_list[0]
316
+ assert (
317
+ pool_config["owner_public_key"]
318
+ == "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
319
+ )
320
+ # It can be one of multiple launcher IDs, due to selecting a different coin
321
+ launcher_id = None
322
+ for addition in creation_tx.additions:
323
+ if addition.puzzle_hash == SINGLETON_LAUNCHER_HASH:
324
+ launcher_id = addition.name()
325
+ break
326
+ assert hexstr_to_bytes(pool_config["launcher_id"]) == launcher_id
327
+ assert pool_config["pool_url"] == ""
328
+
329
+ @pytest.mark.anyio
330
+ async def test_create_new_pool_wallet_farm_to_pool(
331
+ self,
332
+ one_wallet_node_and_rpc: OneWalletNodeAndRpc,
333
+ fee: uint64,
334
+ self_hostname: str,
335
+ ) -> None:
336
+ client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
337
+ wallet = wallet_node.wallet_state_manager.main_wallet
338
+
339
+ our_ph = await wallet.get_new_puzzlehash()
340
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
341
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
342
+
343
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
344
+ our_ph, "http://pool.example.com", uint32(10), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
345
+ )
346
+ await full_node_api.process_transaction_records(records=[creation_tx])
347
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
348
+
349
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
350
+ assert len(summaries_response) == 1
351
+ wallet_id: int = summaries_response[0]["id"]
352
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
353
+
354
+ assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
355
+ assert status.target is None
356
+ assert status.current.owner_pubkey == G1Element.from_bytes(
357
+ bytes.fromhex(
358
+ "b286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
359
+ )
360
+ )
361
+ assert status.current.pool_url == "http://pool.example.com"
362
+ assert status.current.relative_lock_height == 10
363
+ assert status.current.version == 1
364
+ # Check that config has been written properly
365
+ full_config: dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
366
+ pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
367
+ assert len(pool_list) == 1
368
+ pool_config = pool_list[0]
369
+ assert (
370
+ pool_config["owner_public_key"]
371
+ == "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
372
+ )
373
+ # It can be one of multiple launcher IDs, due to selecting a different coin
374
+ launcher_id = None
375
+ for addition in creation_tx.additions:
376
+ if addition.puzzle_hash == SINGLETON_LAUNCHER_HASH:
377
+ launcher_id = addition.name()
378
+ break
379
+ assert hexstr_to_bytes(pool_config["launcher_id"]) == launcher_id
380
+ assert pool_config["pool_url"] == "http://pool.example.com"
381
+
382
+ @pytest.mark.anyio
383
+ async def test_create_multiple_pool_wallets(
384
+ self,
385
+ one_wallet_node_and_rpc: OneWalletNodeAndRpc,
386
+ trusted: bool,
387
+ fee: uint64,
388
+ self_hostname: str,
389
+ ) -> None:
390
+ client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
391
+
392
+ wallet = wallet_node.wallet_state_manager.main_wallet
393
+
394
+ our_ph_1 = await wallet.get_new_puzzlehash()
395
+ our_ph_2 = await wallet.get_new_puzzlehash()
396
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
397
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
398
+
399
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
400
+ our_ph_1, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
401
+ )
402
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
403
+ creation_tx_2: TransactionRecord = await client.create_new_pool_wallet(
404
+ our_ph_1, self_hostname, uint32(12), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
405
+ )
406
+
407
+ await full_node_api.process_transaction_records(records=[creation_tx, creation_tx_2])
408
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
409
+
410
+ async def pw_created(check_wallet_id: int) -> bool:
411
+ try:
412
+ await client.pw_status(check_wallet_id)
413
+ return True
414
+ except ValueError:
415
+ return False
416
+
417
+ await time_out_assert(10, pw_created, True, 2)
418
+ await time_out_assert(10, pw_created, True, 3)
419
+ status_2: PoolWalletInfo = (await client.pw_status(2))[0]
420
+ status_3: PoolWalletInfo = (await client.pw_status(3))[0]
421
+
422
+ if status_2.current.state == PoolSingletonState.SELF_POOLING.value:
423
+ assert status_3.current.state == PoolSingletonState.FARMING_TO_POOL.value
424
+ else:
425
+ assert status_2.current.state == PoolSingletonState.FARMING_TO_POOL.value
426
+ assert status_3.current.state == PoolSingletonState.SELF_POOLING.value
427
+
428
+ full_config = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
429
+ pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
430
+ assert len(pool_list) == 2
431
+
432
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
433
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(3)) == 0
434
+ # Doing a reorg reverts and removes the pool wallets
435
+ await full_node_api.reorg_from_index_to_new_index(ReorgProtocol(uint32(0), uint32(20), our_ph_2, None))
436
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=30)
437
+ summaries_response = await client.get_wallets()
438
+ assert len(summaries_response) == 1
439
+
440
+ with pytest.raises(ValueError):
441
+ await client.pw_status(2)
442
+ with pytest.raises(ValueError):
443
+ await client.pw_status(3)
444
+
445
+ # Create some CAT wallets to increase wallet IDs
446
+ def mempool_empty() -> bool:
447
+ return full_node_api.full_node.mempool_manager.mempool.size() == 0
448
+
449
+ await client.delete_unconfirmed_transactions(1)
450
+ await full_node_api.process_all_wallet_transactions(wallet=wallet)
451
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
452
+
453
+ for i in range(5):
454
+ await time_out_assert(10, mempool_empty)
455
+ res = await client.create_new_cat_and_wallet(uint64(20), test=True)
456
+ assert res["success"]
457
+ cat_0_id = res["wallet_id"]
458
+ asset_id = bytes.fromhex(res["asset_id"])
459
+ assert len(asset_id) > 0
460
+ await full_node_api.process_all_wallet_transactions(wallet=wallet)
461
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
462
+ bal_0 = await client.get_wallet_balance(cat_0_id)
463
+ assert bal_0["confirmed_wallet_balance"] == 20
464
+
465
+ # Test creation of many pool wallets. Use untrusted since that is the more complicated protocol, but don't
466
+ # run this code more than once, since it's slow.
467
+ if not trusted:
468
+ for i in range(22):
469
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
470
+ creation_tx_3: TransactionRecord = await client.create_new_pool_wallet(
471
+ our_ph_1, self_hostname, uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
472
+ )
473
+ await full_node_api.process_transaction_records(records=[creation_tx_3])
474
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
475
+
476
+ full_config = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
477
+ pool_list = full_config["pool"]["pool_list"]
478
+ assert len(pool_list) == i + 3
479
+ if i == 0:
480
+ # Ensures that the CAT creation does not cause pool wallet IDs to increment
481
+ for some_wallet in wallet_node.wallet_state_manager.wallets.values():
482
+ if some_wallet.type() == WalletType.POOLING_WALLET:
483
+ status: PoolWalletInfo = (await client.pw_status(some_wallet.id()))[0]
484
+ assert (await some_wallet.get_pool_wallet_index()) < 5
485
+ auth_sk = find_authentication_sk(
486
+ [some_wallet.wallet_state_manager.get_master_private_key()], status.current.owner_pubkey
487
+ )
488
+ assert auth_sk is not None
489
+ owner_sk = find_owner_sk(
490
+ [some_wallet.wallet_state_manager.get_master_private_key()], status.current.owner_pubkey
491
+ )
492
+ assert owner_sk is not None
493
+ assert owner_sk[0] != auth_sk
494
+
495
+ @pytest.mark.anyio
496
+ async def test_absorb_self(
497
+ self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
498
+ ) -> None:
499
+ client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
500
+ bt = full_node_api.bt
501
+
502
+ wallet = wallet_node.wallet_state_manager.main_wallet
503
+
504
+ our_ph = await wallet.get_new_puzzlehash()
505
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
506
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
507
+
508
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
509
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
510
+ )
511
+ await full_node_api.process_transaction_records(records=[creation_tx])
512
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
513
+ status: PoolWalletInfo = (await client.pw_status(2))[0]
514
+
515
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
516
+ async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
517
+ all_blocks = await full_node_api.get_all_full_blocks()
518
+ blocks = bt.get_consecutive_blocks(
519
+ 3,
520
+ block_list_input=all_blocks,
521
+ force_plot_id=pool_plot.plot_id,
522
+ farmer_reward_puzzle_hash=our_ph,
523
+ guarantee_transaction_block=True,
524
+ )
525
+
526
+ await add_blocks_in_batches(blocks[-3:], full_node_api.full_node)
527
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
528
+
529
+ bal = await client.get_wallet_balance(2)
530
+ assert bal["confirmed_wallet_balance"] == 2 * 1_750_000_000_000
531
+
532
+ # Claim 2 * 1.75, and farm a new 1.75
533
+ absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
534
+ await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs)
535
+ await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
536
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
537
+ await full_node_api.check_transactions_confirmed(wallet_node.wallet_state_manager, absorb_txs)
538
+ assert (
539
+ len(
540
+ [
541
+ tx
542
+ for tx in await wallet_node.wallet_state_manager.tx_store.get_all_transactions()
543
+ if TransactionType(tx.type) is TransactionType.INCOMING_TX and tx.amount == 1_750_000_000_000
544
+ ]
545
+ )
546
+ == 2
547
+ )
548
+ new_status: PoolWalletInfo = (await client.pw_status(2))[0]
549
+ assert status.current == new_status.current
550
+ assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
551
+ bal = await client.get_wallet_balance(2)
552
+ assert bal["confirmed_wallet_balance"] == 1 * 1_750_000_000_000
553
+
554
+ # Claim another 1.75
555
+ absorb_txs1: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
556
+
557
+ await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs1)
558
+
559
+ await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
560
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
561
+ bal = await client.get_wallet_balance(2)
562
+ assert bal["confirmed_wallet_balance"] == 0
563
+
564
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
565
+
566
+ tr: TransactionRecord = (
567
+ await client.send_transaction(
568
+ 1, uint64(100), encode_puzzle_hash(status.p2_singleton_puzzle_hash, "txch"), DEFAULT_TX_CONFIG
569
+ )
570
+ ).transaction
571
+
572
+ await full_node_api.wait_transaction_records_entered_mempool(records=[tr])
573
+ await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
574
+
575
+ # Balance ignores non coinbase TX
576
+ bal = await client.get_wallet_balance(2)
577
+ assert bal["confirmed_wallet_balance"] == 0
578
+
579
+ with pytest.raises(ValueError):
580
+ await client.pw_absorb_rewards(2, uint64(fee))
581
+
582
+ tx1 = await client.get_transactions(1)
583
+ assert (250_000_000_000 + fee) in [tx.amount for tx in tx1]
584
+
585
+ @pytest.mark.anyio
586
+ async def test_absorb_self_multiple_coins(
587
+ self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
588
+ ) -> None:
589
+ client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
590
+ bt = full_node_api.bt
591
+
592
+ wallet = wallet_node.wallet_state_manager.main_wallet
593
+
594
+ our_ph = await wallet.get_new_puzzlehash()
595
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
596
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
597
+
598
+ main_expected_confirmed_balance = total_block_rewards
599
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
600
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
601
+ )
602
+ await full_node_api.process_transaction_records(records=[creation_tx])
603
+ main_expected_confirmed_balance -= fee
604
+ main_expected_confirmed_balance -= 1
605
+ pool_expected_confirmed_balance = 0
606
+
607
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
608
+ main_bal = await client.get_wallet_balance(1)
609
+ assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance
610
+
611
+ status: PoolWalletInfo = (await client.pw_status(2))[0]
612
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
613
+
614
+ async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
615
+ all_blocks = await full_node_api.get_all_full_blocks()
616
+ blocks = bt.get_consecutive_blocks(
617
+ 3,
618
+ block_list_input=all_blocks,
619
+ force_plot_id=pool_plot.plot_id,
620
+ farmer_reward_puzzle_hash=our_ph,
621
+ guarantee_transaction_block=True,
622
+ )
623
+
624
+ block_count = 3
625
+ await add_blocks_in_batches(blocks[-block_count:], full_node_api.full_node)
626
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
627
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
628
+
629
+ pool_expected_confirmed_balance += block_count * 1_750_000_000_000
630
+ main_expected_confirmed_balance += block_count * 250_000_000_000
631
+
632
+ main_bal = await client.get_wallet_balance(1)
633
+ assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance
634
+ bal = await client.get_wallet_balance(2)
635
+ assert bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
636
+
637
+ # Claim
638
+ absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee), 1))["transactions"]
639
+ await full_node_api.process_transaction_records(records=absorb_txs)
640
+ main_expected_confirmed_balance -= fee
641
+ main_expected_confirmed_balance += 1_750_000_000_000
642
+ pool_expected_confirmed_balance -= 1_750_000_000_000
643
+
644
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
645
+ new_status: PoolWalletInfo = (await client.pw_status(2))[0]
646
+ assert status.current == new_status.current
647
+ assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
648
+ main_bal = await client.get_wallet_balance(1)
649
+ pool_bal = await client.get_wallet_balance(2)
650
+ assert pool_bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
651
+ assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance # 10499999999999
652
+
653
+ @pytest.mark.anyio
654
+ async def test_absorb_pooling(
655
+ self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
656
+ ) -> None:
657
+ client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
658
+ bt = full_node_api.bt
659
+
660
+ main_expected_confirmed_balance = total_block_rewards
661
+
662
+ wallet = wallet_node.wallet_state_manager.main_wallet
663
+
664
+ our_ph = await wallet.get_new_puzzlehash()
665
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
666
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
667
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
668
+ our_ph, "http://123.45.67.89", uint32(10), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
669
+ )
670
+ await full_node_api.process_transaction_records(records=[creation_tx])
671
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
672
+ main_expected_confirmed_balance -= 1
673
+ main_expected_confirmed_balance -= fee
674
+
675
+ async def farming_to_pool() -> bool:
676
+ try:
677
+ status: PoolWalletInfo = (await client.pw_status(2))[0]
678
+ return status.current.state == PoolSingletonState.FARMING_TO_POOL.value
679
+ except ValueError:
680
+ return False
681
+
682
+ await time_out_assert(20, farming_to_pool)
683
+
684
+ status: PoolWalletInfo = (await client.pw_status(2))[0]
685
+ async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
686
+ all_blocks = await full_node_api.get_all_full_blocks()
687
+ blocks = bt.get_consecutive_blocks(
688
+ 3,
689
+ block_list_input=all_blocks,
690
+ force_plot_id=pool_plot.plot_id,
691
+ farmer_reward_puzzle_hash=our_ph,
692
+ guarantee_transaction_block=True,
693
+ )
694
+
695
+ block_count = 3
696
+ await add_blocks_in_batches(blocks[-block_count:], full_node_api.full_node)
697
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
698
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
699
+ # Pooled plots don't have balance
700
+ main_expected_confirmed_balance += block_count * 250_000_000_000
701
+ bal = await client.get_wallet_balance(2)
702
+ assert bal["confirmed_wallet_balance"] == 0
703
+
704
+ # Claim block_count * 1.75
705
+ ret = await client.pw_absorb_rewards(2, uint64(fee))
706
+ absorb_txs: list[TransactionRecord] = ret["transactions"]
707
+ if fee == 0:
708
+ assert ret["fee_transaction"] is None
709
+ else:
710
+ assert ret["fee_transaction"].fee_amount == fee
711
+ for tx in absorb_txs:
712
+ assert tx.fee_amount == fee
713
+ await full_node_api.process_transaction_records(records=absorb_txs)
714
+ main_expected_confirmed_balance -= fee
715
+ main_expected_confirmed_balance += block_count * 1_750_000_000_000
716
+
717
+ async def status_updated() -> bool:
718
+ new_st: PoolWalletInfo = (await client.pw_status(2))[0]
719
+ return status.current == new_st.current and status.tip_singleton_coin_id != new_st.tip_singleton_coin_id
720
+
721
+ await time_out_assert(20, status_updated)
722
+ new_status = (await client.pw_status(2))[0]
723
+ bal = await client.get_wallet_balance(2)
724
+ assert bal["confirmed_wallet_balance"] == 0
725
+
726
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
727
+ bal = await client.get_wallet_balance(2)
728
+ assert bal["confirmed_wallet_balance"] == 0
729
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
730
+ peak = full_node_api.full_node.blockchain.get_peak()
731
+ assert peak is not None
732
+ assert await wallet_node.wallet_state_manager.blockchain.get_finished_sync_up_to() == peak.height
733
+ assert (await wallet.get_confirmed_balance()) == main_expected_confirmed_balance
734
+
735
+ num_trials = 3
736
+ status = new_status
737
+
738
+ if fee == 0:
739
+ for i in range(num_trials):
740
+ all_blocks = await full_node_api.get_all_full_blocks()
741
+ # Farm one block using our pool plot
742
+ blocks = bt.get_consecutive_blocks(
743
+ 1,
744
+ block_list_input=all_blocks,
745
+ force_plot_id=pool_plot.plot_id,
746
+ farmer_reward_puzzle_hash=our_ph,
747
+ guarantee_transaction_block=True,
748
+ )
749
+ # Farm one more block to include the reward of the previous one
750
+ blocks = bt.get_consecutive_blocks(
751
+ 1,
752
+ block_list_input=blocks,
753
+ guarantee_transaction_block=True,
754
+ )
755
+ await add_blocks_in_batches(blocks[-2:], full_node_api.full_node)
756
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
757
+
758
+ # Absorb the farmed reward
759
+ ret = await client.pw_absorb_rewards(2, fee)
760
+ absorb_tx = ret["transaction"]
761
+ await full_node_api.process_transaction_records(records=[absorb_tx])
762
+
763
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
764
+ await time_out_assert(20, status_updated)
765
+ status = (await client.pw_status(2))[0]
766
+ assert ret["fee_transaction"] is None
767
+
768
+ bal2 = await client.get_wallet_balance(2)
769
+ assert bal2["confirmed_wallet_balance"] == 0
770
+
771
+ @pytest.mark.anyio
772
+ async def test_self_pooling_to_pooling(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
773
+ """
774
+ This tests self-pooling -> pooling
775
+ TODO: Fix this test for a positive fee value
776
+ """
777
+
778
+ if fee != 0:
779
+ pytest.skip("need to fix this test for non-zero fees")
780
+
781
+ full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
782
+ pool_ph = bytes32.zeros
783
+
784
+ assert wallet_node._wallet_state_manager is not None
785
+
786
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
787
+
788
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
789
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
790
+ )
791
+ await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
792
+ creation_tx_2: TransactionRecord = await client.create_new_pool_wallet(
793
+ our_ph, "", uint32(0), f"{self_hostname}:5001", "new", "SELF_POOLING", fee
794
+ )
795
+
796
+ for r in creation_tx.removals:
797
+ assert r not in creation_tx_2.removals
798
+
799
+ await full_node_api.process_transaction_records(records=[creation_tx_2])
800
+
801
+ assert not full_node_api.txs_in_mempool(txs=[creation_tx])
802
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
803
+
804
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
805
+ assert len(summaries_response) == 2
806
+ wallet_id: int = summaries_response[0]["id"]
807
+ wallet_id_2: int = summaries_response[1]["id"]
808
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
809
+ status_2: PoolWalletInfo = (await client.pw_status(wallet_id_2))[0]
810
+
811
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
812
+ assert status_2.current.state == PoolSingletonState.SELF_POOLING.value
813
+ assert status.target is None
814
+ assert status_2.target is None
815
+
816
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
817
+ join_pool: dict[str, Any] = await client.pw_join_pool(
818
+ wallet_id,
819
+ pool_ph,
820
+ "https://pool.example.com",
821
+ uint32(10),
822
+ uint64(fee),
823
+ )
824
+ assert join_pool["success"]
825
+ join_pool_tx: TransactionRecord = join_pool["transaction"]
826
+ assert join_pool_tx is not None
827
+ await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx])
828
+
829
+ join_pool_2: dict[str, Any] = await client.pw_join_pool(
830
+ wallet_id_2, pool_ph, "https://pool.example.com", uint32(10), uint64(fee)
831
+ )
832
+ assert join_pool_2["success"]
833
+ join_pool_tx_2: TransactionRecord = join_pool_2["transaction"]
834
+ for r in join_pool_tx.removals:
835
+ assert r not in join_pool_tx_2.removals
836
+ assert join_pool_tx_2 is not None
837
+ await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx_2])
838
+
839
+ status = (await client.pw_status(wallet_id))[0]
840
+ status_2 = (await client.pw_status(wallet_id_2))[0]
841
+
842
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
843
+ assert status.target is not None
844
+ assert status.target.state == PoolSingletonState.FARMING_TO_POOL.value
845
+ assert status_2.current.state == PoolSingletonState.SELF_POOLING.value
846
+ assert status_2.target is not None
847
+ assert status_2.target.state == PoolSingletonState.FARMING_TO_POOL.value
848
+
849
+ await full_node_api.process_transaction_records(records=[join_pool_tx, join_pool_tx_2])
850
+
851
+ async def status_is_farming_to_pool(w_id: int) -> bool:
852
+ pw_status: PoolWalletInfo = (await client.pw_status(w_id))[0]
853
+ return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
854
+
855
+ await time_out_assert(20, status_is_farming_to_pool, True, wallet_id)
856
+ await time_out_assert(20, status_is_farming_to_pool, True, wallet_id_2)
857
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
858
+
859
+ @pytest.mark.anyio
860
+ async def test_leave_pool(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
861
+ """This tests self-pooling -> pooling -> escaping -> self pooling"""
862
+ full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
863
+ pool_ph = bytes32.zeros
864
+
865
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
866
+
867
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
868
+
869
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
870
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
871
+ )
872
+
873
+ await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
874
+
875
+ await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
876
+ assert not full_node_api.txs_in_mempool(txs=[creation_tx])
877
+
878
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
879
+
880
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
881
+ assert len(summaries_response) == 1
882
+ wallet_id: int = summaries_response[0]["id"]
883
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
884
+
885
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
886
+ assert status.target is None
887
+
888
+ join_pool_tx: TransactionRecord = (
889
+ await client.pw_join_pool(
890
+ wallet_id,
891
+ pool_ph,
892
+ "https://pool.example.com",
893
+ uint32(5),
894
+ fee,
895
+ )
896
+ )["transaction"]
897
+ assert join_pool_tx is not None
898
+
899
+ status = (await client.pw_status(wallet_id))[0]
900
+
901
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
902
+ assert status.current.pool_url == ""
903
+ assert status.current.relative_lock_height == 0
904
+ assert status.current.state == 1
905
+ assert status.current.version == 1
906
+
907
+ assert status.target
908
+ assert status.target.pool_url == "https://pool.example.com"
909
+ assert status.target.relative_lock_height == 5
910
+ assert status.target.state == 3
911
+ assert status.target.version == 1
912
+
913
+ async def status_is_farming_to_pool() -> bool:
914
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
915
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
916
+ return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
917
+
918
+ await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_farming_to_pool)
919
+
920
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
921
+
922
+ leave_pool_tx: dict[str, Any] = await client.pw_self_pool(wallet_id, uint64(fee))
923
+ assert leave_pool_tx["transaction"].wallet_id == wallet_id
924
+ assert leave_pool_tx["transaction"].amount == 1
925
+ await full_node_api.wait_transaction_records_entered_mempool(records=leave_pool_tx["transactions"])
926
+
927
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
928
+
929
+ async def status_is_leaving() -> bool:
930
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
931
+ return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
932
+
933
+ await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_leaving)
934
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
935
+
936
+ async def status_is_self_pooling() -> bool:
937
+ # Farm enough blocks to wait for relative_lock_height
938
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
939
+ log.warning(f"PW status state: {pw_status.current}")
940
+ return pw_status.current.state == PoolSingletonState.SELF_POOLING.value
941
+
942
+ # pass the relative lock height, this will trigger a tx.
943
+ await full_node_api.farm_blocks_to_puzzlehash(count=4, farm_to=our_ph, guarantee_transaction_blocks=True)
944
+
945
+ # Farm the TX
946
+ for i in range(20):
947
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
948
+ await asyncio.sleep(1)
949
+ if await status_is_self_pooling():
950
+ break
951
+
952
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
953
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
954
+
955
+ await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_self_pooling)
956
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
957
+
958
+ @pytest.mark.parametrize(
959
+ "wallet_environments",
960
+ [
961
+ {
962
+ "num_environments": 1,
963
+ "blocks_needed": [10],
964
+ }
965
+ ],
966
+ indirect=True,
967
+ )
968
+ @pytest.mark.anyio
969
+ async def test_change_pools(
970
+ self,
971
+ fee: uint64,
972
+ wallet_environments: WalletTestFramework,
973
+ ) -> None:
974
+ """This tests Pool A -> escaping -> Pool B"""
975
+
976
+ wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
977
+ wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
978
+
979
+ wallet_state_manager.config["reuse_public_key_for_change"][
980
+ str(wallet_state_manager.root_pubkey.get_fingerprint())
981
+ ] = wallet_environments.tx_config.reuse_puzhash
982
+
983
+ # Create a farming plotnft to url http://pool.example.com
984
+ wallet_id = await create_new_plotnft(wallet_environments)
985
+
986
+ # Join a different pool
987
+ join_pool_tx: TransactionRecord = (
988
+ await wallet_rpc.pw_join_pool(
989
+ wallet_id,
990
+ bytes32.zeros,
991
+ "https://pool-b.org",
992
+ LOCK_HEIGHT,
993
+ uint64(fee),
994
+ )
995
+ )["transaction"]
996
+ assert join_pool_tx is not None
997
+
998
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
999
+ await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.LEAVING_POOL)
1000
+ await wallet_environments.full_node.farm_blocks_to_puzzlehash(
1001
+ count=LOCK_HEIGHT + 2, guarantee_transaction_blocks=True
1002
+ )
1003
+ await wallet_environments.full_node.wait_for_wallet_synced(
1004
+ wallet_node=wallet_environments.environments[0].node, timeout=20
1005
+ )
1006
+
1007
+ async def farm_blocks_until_state(
1008
+ state: PoolSingletonState,
1009
+ wallet_rpc: WalletRpcClient,
1010
+ wallet_id: int,
1011
+ full_node: FullNodeSimulator,
1012
+ wallet_node: WalletNode,
1013
+ max_blocks: int = 10 * (LOCK_HEIGHT + 2),
1014
+ ) -> bool:
1015
+ block_chunk = LOCK_HEIGHT + 2
1016
+ total_blocks_farmed = 0
1017
+ while total_blocks_farmed < max_blocks:
1018
+ await full_node.farm_blocks_to_puzzlehash(count=block_chunk, guarantee_transaction_blocks=True)
1019
+ total_blocks_farmed += block_chunk
1020
+ print(f"Checking state after {total_blocks_farmed} blocks")
1021
+
1022
+ await full_node.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
1023
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
1024
+ if pw_status.current.state == state.value:
1025
+ return True
1026
+ return False
1027
+
1028
+ assert await farm_blocks_until_state(
1029
+ PoolSingletonState.FARMING_TO_POOL,
1030
+ wallet_rpc,
1031
+ wallet_id,
1032
+ wallet_environments.full_node,
1033
+ wallet_environments.environments[0].node,
1034
+ )
1035
+
1036
+ pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
1037
+ assert pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
1038
+ assert pw_status.current.pool_url == "https://pool-b.org"
1039
+ assert pw_status.current.relative_lock_height == LOCK_HEIGHT
1040
+
1041
+ @pytest.mark.anyio
1042
+ async def test_change_pools_reorg(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
1043
+ """This tests Pool A -> escaping -> reorg -> escaping -> Pool B"""
1044
+ full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
1045
+ pool_a_ph = bytes32.zeros
1046
+ pool_b_ph = bytes32.zeros
1047
+ WAIT_SECS = 30
1048
+
1049
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
1050
+
1051
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
1052
+
1053
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
1054
+ pool_a_ph, "https://pool-a.org", uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", uint64(fee)
1055
+ )
1056
+
1057
+ await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
1058
+
1059
+ await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
1060
+ assert not full_node_api.txs_in_mempool(txs=[creation_tx])
1061
+
1062
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
1063
+
1064
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
1065
+ assert len(summaries_response) == 1
1066
+ wallet_id: int = summaries_response[0]["id"]
1067
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
1068
+
1069
+ assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
1070
+ assert status.target is None
1071
+
1072
+ async def status_is_farming_to_pool() -> bool:
1073
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
1074
+ return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
1075
+
1076
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_farming_to_pool)
1077
+
1078
+ pw_info: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
1079
+ assert pw_info.current.pool_url == "https://pool-a.org"
1080
+ assert pw_info.current.relative_lock_height == 5
1081
+
1082
+ join_pool_txs: list[TransactionRecord] = (
1083
+ await client.pw_join_pool(
1084
+ wallet_id,
1085
+ pool_b_ph,
1086
+ "https://pool-b.org",
1087
+ uint32(10),
1088
+ uint64(fee),
1089
+ )
1090
+ )["transactions"]
1091
+ await full_node_api.wait_transaction_records_entered_mempool(records=join_pool_txs)
1092
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
1093
+
1094
+ async def status_is_leaving_no_blocks() -> bool:
1095
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
1096
+ return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
1097
+
1098
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
1099
+
1100
+ current_blocks = await full_node_api.get_all_full_blocks()
1101
+ more_blocks = full_node_api.bt.get_consecutive_blocks(
1102
+ 3,
1103
+ farmer_reward_puzzle_hash=pool_a_ph,
1104
+ pool_reward_puzzle_hash=pool_b_ph,
1105
+ block_list_input=current_blocks[:-1],
1106
+ force_overflow=True,
1107
+ guarantee_transaction_block=True,
1108
+ seed=32 * b"4",
1109
+ transaction_data=next(tx.spend_bundle for tx in join_pool_txs if tx.spend_bundle is not None),
1110
+ )
1111
+
1112
+ await add_blocks_in_batches(more_blocks[-3:], full_node_api.full_node)
1113
+
1114
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
1115
+
1116
+ for i in range(50):
1117
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
1118
+ await asyncio.sleep(1)
1119
+ if await status_is_farming_to_pool():
1120
+ break
1121
+
1122
+ # Eventually, leaves pool
1123
+ assert await status_is_farming_to_pool()