chia-blockchain 2.4.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1028) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +197 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +147 -0
  9. chia/_tests/blockchain/test_blockchain.py +4100 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1050 -0
  11. chia/_tests/blockchain/test_build_chains.py +61 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +195 -0
  14. chia/_tests/build-init-files.py +93 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +73 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +147 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +57 -0
  26. chia/_tests/clvm/test_program.py +150 -0
  27. chia/_tests/clvm/test_puzzle_compression.py +144 -0
  28. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  29. chia/_tests/clvm/test_puzzles.py +247 -0
  30. chia/_tests/clvm/test_singletons.py +540 -0
  31. chia/_tests/clvm/test_spend_sim.py +181 -0
  32. chia/_tests/cmds/__init__.py +0 -0
  33. chia/_tests/cmds/cmd_test_utils.py +472 -0
  34. chia/_tests/cmds/config.py +3 -0
  35. chia/_tests/cmds/conftest.py +23 -0
  36. chia/_tests/cmds/test_click_types.py +195 -0
  37. chia/_tests/cmds/test_cmd_framework.py +400 -0
  38. chia/_tests/cmds/test_cmds_util.py +97 -0
  39. chia/_tests/cmds/test_daemon.py +92 -0
  40. chia/_tests/cmds/test_farm_cmd.py +67 -0
  41. chia/_tests/cmds/test_show.py +116 -0
  42. chia/_tests/cmds/test_sim.py +207 -0
  43. chia/_tests/cmds/test_timelock_args.py +75 -0
  44. chia/_tests/cmds/test_tx_config_args.py +153 -0
  45. chia/_tests/cmds/testing_classes.py +59 -0
  46. chia/_tests/cmds/wallet/__init__.py +0 -0
  47. chia/_tests/cmds/wallet/test_coins.py +195 -0
  48. chia/_tests/cmds/wallet/test_consts.py +47 -0
  49. chia/_tests/cmds/wallet/test_dao.py +565 -0
  50. chia/_tests/cmds/wallet/test_did.py +403 -0
  51. chia/_tests/cmds/wallet/test_nft.py +470 -0
  52. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  53. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  54. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  55. chia/_tests/cmds/wallet/test_vcs.py +376 -0
  56. chia/_tests/cmds/wallet/test_wallet.py +1126 -0
  57. chia/_tests/cmds/wallet/test_wallet_check.py +111 -0
  58. chia/_tests/conftest.py +1304 -0
  59. chia/_tests/connection_utils.py +124 -0
  60. chia/_tests/core/__init__.py +0 -0
  61. chia/_tests/core/cmds/__init__.py +0 -0
  62. chia/_tests/core/cmds/test_beta.py +382 -0
  63. chia/_tests/core/cmds/test_keys.py +1734 -0
  64. chia/_tests/core/cmds/test_wallet.py +126 -0
  65. chia/_tests/core/config.py +3 -0
  66. chia/_tests/core/consensus/__init__.py +0 -0
  67. chia/_tests/core/consensus/test_block_creation.py +56 -0
  68. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  69. chia/_tests/core/custom_types/__init__.py +0 -0
  70. chia/_tests/core/custom_types/test_coin.py +109 -0
  71. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  72. chia/_tests/core/custom_types/test_spend_bundle.py +71 -0
  73. chia/_tests/core/daemon/__init__.py +0 -0
  74. chia/_tests/core/daemon/config.py +4 -0
  75. chia/_tests/core/daemon/test_daemon.py +2128 -0
  76. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  77. chia/_tests/core/daemon/test_keychain_proxy.py +100 -0
  78. chia/_tests/core/data_layer/__init__.py +0 -0
  79. chia/_tests/core/data_layer/config.py +5 -0
  80. chia/_tests/core/data_layer/conftest.py +105 -0
  81. chia/_tests/core/data_layer/test_data_cli.py +57 -0
  82. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  83. chia/_tests/core/data_layer/test_data_layer_util.py +219 -0
  84. chia/_tests/core/data_layer/test_data_rpc.py +3865 -0
  85. chia/_tests/core/data_layer/test_data_store.py +2423 -0
  86. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  87. chia/_tests/core/data_layer/test_plugin.py +91 -0
  88. chia/_tests/core/data_layer/util.py +232 -0
  89. chia/_tests/core/farmer/__init__.py +0 -0
  90. chia/_tests/core/farmer/config.py +3 -0
  91. chia/_tests/core/farmer/test_farmer_api.py +101 -0
  92. chia/_tests/core/full_node/__init__.py +0 -0
  93. chia/_tests/core/full_node/config.py +4 -0
  94. chia/_tests/core/full_node/dos/__init__.py +0 -0
  95. chia/_tests/core/full_node/dos/config.py +3 -0
  96. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  97. chia/_tests/core/full_node/full_sync/config.py +4 -0
  98. chia/_tests/core/full_node/full_sync/test_full_sync.py +448 -0
  99. chia/_tests/core/full_node/ram_db.py +27 -0
  100. chia/_tests/core/full_node/stores/__init__.py +0 -0
  101. chia/_tests/core/full_node/stores/config.py +4 -0
  102. chia/_tests/core/full_node/stores/test_block_store.py +488 -0
  103. chia/_tests/core/full_node/stores/test_coin_store.py +888 -0
  104. chia/_tests/core/full_node/stores/test_full_node_store.py +1215 -0
  105. chia/_tests/core/full_node/stores/test_hint_store.py +230 -0
  106. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  107. chia/_tests/core/full_node/test_address_manager.py +588 -0
  108. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  109. chia/_tests/core/full_node/test_conditions.py +558 -0
  110. chia/_tests/core/full_node/test_full_node.py +2445 -0
  111. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  112. chia/_tests/core/full_node/test_hint_management.py +104 -0
  113. chia/_tests/core/full_node/test_node_load.py +34 -0
  114. chia/_tests/core/full_node/test_performance.py +182 -0
  115. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  116. chia/_tests/core/full_node/test_transactions.py +203 -0
  117. chia/_tests/core/full_node/test_tx_processing_queue.py +154 -0
  118. chia/_tests/core/large_block.py +2388 -0
  119. chia/_tests/core/make_block_generator.py +72 -0
  120. chia/_tests/core/mempool/__init__.py +0 -0
  121. chia/_tests/core/mempool/config.py +4 -0
  122. chia/_tests/core/mempool/test_mempool.py +3180 -0
  123. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  124. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  125. chia/_tests/core/mempool/test_mempool_item_queries.py +192 -0
  126. chia/_tests/core/mempool/test_mempool_manager.py +2054 -0
  127. chia/_tests/core/mempool/test_mempool_performance.py +65 -0
  128. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  129. chia/_tests/core/node_height.py +28 -0
  130. chia/_tests/core/server/__init__.py +0 -0
  131. chia/_tests/core/server/config.py +3 -0
  132. chia/_tests/core/server/flood.py +82 -0
  133. chia/_tests/core/server/serve.py +132 -0
  134. chia/_tests/core/server/test_capabilities.py +68 -0
  135. chia/_tests/core/server/test_dos.py +320 -0
  136. chia/_tests/core/server/test_event_loop.py +109 -0
  137. chia/_tests/core/server/test_loop.py +290 -0
  138. chia/_tests/core/server/test_node_discovery.py +74 -0
  139. chia/_tests/core/server/test_rate_limits.py +370 -0
  140. chia/_tests/core/server/test_server.py +225 -0
  141. chia/_tests/core/server/test_upnp.py +8 -0
  142. chia/_tests/core/services/__init__.py +0 -0
  143. chia/_tests/core/services/config.py +3 -0
  144. chia/_tests/core/services/test_services.py +166 -0
  145. chia/_tests/core/ssl/__init__.py +0 -0
  146. chia/_tests/core/ssl/config.py +3 -0
  147. chia/_tests/core/ssl/test_ssl.py +198 -0
  148. chia/_tests/core/test_coins.py +33 -0
  149. chia/_tests/core/test_cost_calculation.py +314 -0
  150. chia/_tests/core/test_crawler.py +175 -0
  151. chia/_tests/core/test_crawler_rpc.py +53 -0
  152. chia/_tests/core/test_daemon_rpc.py +24 -0
  153. chia/_tests/core/test_db_conversion.py +129 -0
  154. chia/_tests/core/test_db_validation.py +161 -0
  155. chia/_tests/core/test_farmer_harvester_rpc.py +504 -0
  156. chia/_tests/core/test_filter.py +37 -0
  157. chia/_tests/core/test_full_node_rpc.py +794 -0
  158. chia/_tests/core/test_merkle_set.py +343 -0
  159. chia/_tests/core/test_program.py +49 -0
  160. chia/_tests/core/test_rpc_util.py +87 -0
  161. chia/_tests/core/test_seeder.py +308 -0
  162. chia/_tests/core/test_setproctitle.py +13 -0
  163. chia/_tests/core/util/__init__.py +0 -0
  164. chia/_tests/core/util/config.py +4 -0
  165. chia/_tests/core/util/test_block_cache.py +44 -0
  166. chia/_tests/core/util/test_cached_bls.py +57 -0
  167. chia/_tests/core/util/test_config.py +337 -0
  168. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  169. chia/_tests/core/util/test_files.py +391 -0
  170. chia/_tests/core/util/test_jsonify.py +146 -0
  171. chia/_tests/core/util/test_keychain.py +514 -0
  172. chia/_tests/core/util/test_keyring_wrapper.py +490 -0
  173. chia/_tests/core/util/test_lockfile.py +380 -0
  174. chia/_tests/core/util/test_log_exceptions.py +187 -0
  175. chia/_tests/core/util/test_lru_cache.py +56 -0
  176. chia/_tests/core/util/test_significant_bits.py +40 -0
  177. chia/_tests/core/util/test_streamable.py +883 -0
  178. chia/_tests/db/__init__.py +0 -0
  179. chia/_tests/db/test_db_wrapper.py +565 -0
  180. chia/_tests/environments/__init__.py +0 -0
  181. chia/_tests/environments/common.py +35 -0
  182. chia/_tests/environments/full_node.py +47 -0
  183. chia/_tests/environments/wallet.py +368 -0
  184. chia/_tests/ether.py +19 -0
  185. chia/_tests/farmer_harvester/__init__.py +0 -0
  186. chia/_tests/farmer_harvester/config.py +3 -0
  187. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  188. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  189. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +130 -0
  190. chia/_tests/farmer_harvester/test_third_party_harvesters.py +501 -0
  191. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  192. chia/_tests/fee_estimation/__init__.py +0 -0
  193. chia/_tests/fee_estimation/config.py +3 -0
  194. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  195. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +145 -0
  197. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  198. chia/_tests/generator/__init__.py +0 -0
  199. chia/_tests/generator/puzzles/__init__.py +0 -0
  200. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  201. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  202. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  203. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  204. chia/_tests/generator/test_compression.py +218 -0
  205. chia/_tests/generator/test_generator_types.py +44 -0
  206. chia/_tests/generator/test_rom.py +182 -0
  207. chia/_tests/plot_sync/__init__.py +0 -0
  208. chia/_tests/plot_sync/config.py +3 -0
  209. chia/_tests/plot_sync/test_delta.py +102 -0
  210. chia/_tests/plot_sync/test_plot_sync.py +617 -0
  211. chia/_tests/plot_sync/test_receiver.py +451 -0
  212. chia/_tests/plot_sync/test_sender.py +116 -0
  213. chia/_tests/plot_sync/test_sync_simulated.py +450 -0
  214. chia/_tests/plot_sync/util.py +67 -0
  215. chia/_tests/plotting/__init__.py +0 -0
  216. chia/_tests/plotting/config.py +3 -0
  217. chia/_tests/plotting/test_plot_manager.py +738 -0
  218. chia/_tests/plotting/util.py +13 -0
  219. chia/_tests/pools/__init__.py +0 -0
  220. chia/_tests/pools/config.py +5 -0
  221. chia/_tests/pools/test_pool_cmdline.py +23 -0
  222. chia/_tests/pools/test_pool_config.py +44 -0
  223. chia/_tests/pools/test_pool_puzzles_lifecycle.py +398 -0
  224. chia/_tests/pools/test_pool_rpc.py +1010 -0
  225. chia/_tests/pools/test_pool_wallet.py +201 -0
  226. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  227. chia/_tests/process_junit.py +349 -0
  228. chia/_tests/rpc/__init__.py +0 -0
  229. chia/_tests/rpc/test_rpc_client.py +81 -0
  230. chia/_tests/simulation/__init__.py +0 -0
  231. chia/_tests/simulation/config.py +6 -0
  232. chia/_tests/simulation/test_simulation.py +501 -0
  233. chia/_tests/simulation/test_simulator.py +234 -0
  234. chia/_tests/simulation/test_start_simulator.py +106 -0
  235. chia/_tests/testconfig.py +13 -0
  236. chia/_tests/timelord/__init__.py +0 -0
  237. chia/_tests/timelord/config.py +3 -0
  238. chia/_tests/timelord/test_new_peak.py +437 -0
  239. chia/_tests/timelord/test_timelord.py +11 -0
  240. chia/_tests/tools/1315537.json +170 -0
  241. chia/_tests/tools/1315544.json +160 -0
  242. chia/_tests/tools/1315630.json +150 -0
  243. chia/_tests/tools/300000.json +105 -0
  244. chia/_tests/tools/442734.json +140 -0
  245. chia/_tests/tools/466212.json +130 -0
  246. chia/_tests/tools/__init__.py +0 -0
  247. chia/_tests/tools/config.py +5 -0
  248. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  249. chia/_tests/tools/test_full_sync.py +30 -0
  250. chia/_tests/tools/test_legacy_keyring.py +82 -0
  251. chia/_tests/tools/test_run_block.py +129 -0
  252. chia/_tests/util/__init__.py +0 -0
  253. chia/_tests/util/benchmark_cost.py +170 -0
  254. chia/_tests/util/benchmarks.py +154 -0
  255. chia/_tests/util/bip39_test_vectors.json +148 -0
  256. chia/_tests/util/blockchain.py +133 -0
  257. chia/_tests/util/blockchain_mock.py +132 -0
  258. chia/_tests/util/build_network_protocol_files.py +302 -0
  259. chia/_tests/util/clvm_generator.bin +0 -0
  260. chia/_tests/util/config.py +3 -0
  261. chia/_tests/util/constants.py +20 -0
  262. chia/_tests/util/db_connection.py +36 -0
  263. chia/_tests/util/full_sync.py +245 -0
  264. chia/_tests/util/gen_ssl_certs.py +115 -0
  265. chia/_tests/util/generator_tools_testing.py +47 -0
  266. chia/_tests/util/key_tool.py +37 -0
  267. chia/_tests/util/misc.py +722 -0
  268. chia/_tests/util/network_protocol_data.py +1074 -0
  269. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  270. chia/_tests/util/protocol_messages_json.py +2700 -0
  271. chia/_tests/util/rpc.py +23 -0
  272. chia/_tests/util/run_block.py +163 -0
  273. chia/_tests/util/setup_nodes.py +479 -0
  274. chia/_tests/util/split_managers.py +99 -0
  275. chia/_tests/util/temp_file.py +14 -0
  276. chia/_tests/util/test_action_scope.py +143 -0
  277. chia/_tests/util/test_async_pool.py +366 -0
  278. chia/_tests/util/test_build_job_matrix.py +43 -0
  279. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  280. chia/_tests/util/test_chia_version.py +50 -0
  281. chia/_tests/util/test_collection.py +11 -0
  282. chia/_tests/util/test_condition_tools.py +231 -0
  283. chia/_tests/util/test_config.py +426 -0
  284. chia/_tests/util/test_dump_keyring.py +60 -0
  285. chia/_tests/util/test_errors.py +10 -0
  286. chia/_tests/util/test_full_block_utils.py +271 -0
  287. chia/_tests/util/test_installed.py +20 -0
  288. chia/_tests/util/test_limited_semaphore.py +52 -0
  289. chia/_tests/util/test_logging_filter.py +43 -0
  290. chia/_tests/util/test_misc.py +444 -0
  291. chia/_tests/util/test_network.py +74 -0
  292. chia/_tests/util/test_network_protocol_files.py +579 -0
  293. chia/_tests/util/test_network_protocol_json.py +266 -0
  294. chia/_tests/util/test_network_protocol_test.py +257 -0
  295. chia/_tests/util/test_paginator.py +72 -0
  296. chia/_tests/util/test_pprint.py +17 -0
  297. chia/_tests/util/test_priority_mutex.py +487 -0
  298. chia/_tests/util/test_recursive_replace.py +116 -0
  299. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  300. chia/_tests/util/test_service_groups.py +15 -0
  301. chia/_tests/util/test_ssl_check.py +31 -0
  302. chia/_tests/util/test_testnet_overrides.py +19 -0
  303. chia/_tests/util/test_tests_misc.py +38 -0
  304. chia/_tests/util/test_timing.py +37 -0
  305. chia/_tests/util/test_trusted_peer.py +51 -0
  306. chia/_tests/util/time_out_assert.py +154 -0
  307. chia/_tests/wallet/__init__.py +0 -0
  308. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  309. chia/_tests/wallet/cat_wallet/config.py +4 -0
  310. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  311. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  312. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1738 -0
  313. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  314. chia/_tests/wallet/cat_wallet/test_trades.py +2578 -0
  315. chia/_tests/wallet/clawback/__init__.py +0 -0
  316. chia/_tests/wallet/clawback/config.py +3 -0
  317. chia/_tests/wallet/clawback/test_clawback_decorator.py +80 -0
  318. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  319. chia/_tests/wallet/clawback/test_clawback_metadata.py +51 -0
  320. chia/_tests/wallet/config.py +4 -0
  321. chia/_tests/wallet/conftest.py +217 -0
  322. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  323. chia/_tests/wallet/dao_wallet/config.py +3 -0
  324. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1322 -0
  325. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  326. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  327. chia/_tests/wallet/db_wallet/config.py +3 -0
  328. chia/_tests/wallet/db_wallet/test_db_graftroot.py +143 -0
  329. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  330. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  331. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  332. chia/_tests/wallet/did_wallet/config.py +4 -0
  333. chia/_tests/wallet/did_wallet/test_did.py +1481 -0
  334. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  335. chia/_tests/wallet/nft_wallet/config.py +4 -0
  336. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1492 -0
  337. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1014 -0
  338. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +376 -0
  339. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  340. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  341. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2558 -0
  342. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  343. chia/_tests/wallet/rpc/__init__.py +0 -0
  344. chia/_tests/wallet/rpc/config.py +4 -0
  345. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +287 -0
  346. chia/_tests/wallet/rpc/test_wallet_rpc.py +3106 -0
  347. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  348. chia/_tests/wallet/simple_sync/config.py +3 -0
  349. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +719 -0
  350. chia/_tests/wallet/sync/__init__.py +0 -0
  351. chia/_tests/wallet/sync/config.py +4 -0
  352. chia/_tests/wallet/sync/test_wallet_sync.py +1529 -0
  353. chia/_tests/wallet/test_address_type.py +189 -0
  354. chia/_tests/wallet/test_bech32m.py +45 -0
  355. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  356. chia/_tests/wallet/test_coin_selection.py +589 -0
  357. chia/_tests/wallet/test_conditions.py +388 -0
  358. chia/_tests/wallet/test_debug_spend_bundle.py +76 -0
  359. chia/_tests/wallet/test_new_wallet_protocol.py +1176 -0
  360. chia/_tests/wallet/test_nft_store.py +193 -0
  361. chia/_tests/wallet/test_notifications.py +196 -0
  362. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  363. chia/_tests/wallet/test_puzzle_store.py +133 -0
  364. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  365. chia/_tests/wallet/test_signer_protocol.py +948 -0
  366. chia/_tests/wallet/test_singleton.py +122 -0
  367. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  368. chia/_tests/wallet/test_singleton_store.py +152 -0
  369. chia/_tests/wallet/test_taproot.py +19 -0
  370. chia/_tests/wallet/test_transaction_store.py +941 -0
  371. chia/_tests/wallet/test_util.py +181 -0
  372. chia/_tests/wallet/test_wallet.py +2139 -0
  373. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  374. chia/_tests/wallet/test_wallet_blockchain.py +113 -0
  375. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  376. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  377. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  378. chia/_tests/wallet/test_wallet_node.py +783 -0
  379. chia/_tests/wallet/test_wallet_retry.py +95 -0
  380. chia/_tests/wallet/test_wallet_state_manager.py +252 -0
  381. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  382. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  383. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  384. chia/_tests/wallet/test_wallet_utils.py +155 -0
  385. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  386. chia/_tests/wallet/vc_wallet/config.py +3 -0
  387. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  388. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  389. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +801 -0
  390. chia/_tests/wallet/wallet_block_tools.py +327 -0
  391. chia/_tests/weight_proof/__init__.py +0 -0
  392. chia/_tests/weight_proof/config.py +3 -0
  393. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  394. chia/clvm/__init__.py +0 -0
  395. chia/clvm/spend_sim.py +488 -0
  396. chia/cmds/__init__.py +0 -0
  397. chia/cmds/beta.py +183 -0
  398. chia/cmds/beta_funcs.py +133 -0
  399. chia/cmds/check_wallet_db.py +418 -0
  400. chia/cmds/chia.py +143 -0
  401. chia/cmds/cmd_classes.py +315 -0
  402. chia/cmds/cmds_util.py +498 -0
  403. chia/cmds/coin_funcs.py +260 -0
  404. chia/cmds/coins.py +220 -0
  405. chia/cmds/completion.py +49 -0
  406. chia/cmds/configure.py +331 -0
  407. chia/cmds/dao.py +1008 -0
  408. chia/cmds/dao_funcs.py +576 -0
  409. chia/cmds/data.py +707 -0
  410. chia/cmds/data_funcs.py +380 -0
  411. chia/cmds/db.py +86 -0
  412. chia/cmds/db_backup_func.py +77 -0
  413. chia/cmds/db_upgrade_func.py +452 -0
  414. chia/cmds/db_validate_func.py +184 -0
  415. chia/cmds/dev.py +16 -0
  416. chia/cmds/farm.py +87 -0
  417. chia/cmds/farm_funcs.py +207 -0
  418. chia/cmds/init.py +70 -0
  419. chia/cmds/init_funcs.py +367 -0
  420. chia/cmds/installers.py +129 -0
  421. chia/cmds/keys.py +510 -0
  422. chia/cmds/keys_funcs.py +864 -0
  423. chia/cmds/netspace.py +47 -0
  424. chia/cmds/netspace_funcs.py +53 -0
  425. chia/cmds/options.py +32 -0
  426. chia/cmds/param_types.py +228 -0
  427. chia/cmds/passphrase.py +130 -0
  428. chia/cmds/passphrase_funcs.py +346 -0
  429. chia/cmds/peer.py +50 -0
  430. chia/cmds/peer_funcs.py +129 -0
  431. chia/cmds/plotnft.py +206 -0
  432. chia/cmds/plotnft_funcs.py +374 -0
  433. chia/cmds/plots.py +222 -0
  434. chia/cmds/plotters.py +17 -0
  435. chia/cmds/rpc.py +188 -0
  436. chia/cmds/show.py +71 -0
  437. chia/cmds/show_funcs.py +214 -0
  438. chia/cmds/signer.py +304 -0
  439. chia/cmds/sim.py +217 -0
  440. chia/cmds/sim_funcs.py +509 -0
  441. chia/cmds/start.py +24 -0
  442. chia/cmds/start_funcs.py +112 -0
  443. chia/cmds/stop.py +61 -0
  444. chia/cmds/units.py +11 -0
  445. chia/cmds/wallet.py +1745 -0
  446. chia/cmds/wallet_funcs.py +1800 -0
  447. chia/consensus/__init__.py +0 -0
  448. chia/consensus/block_body_validation.py +515 -0
  449. chia/consensus/block_creation.py +525 -0
  450. chia/consensus/block_header_validation.py +1064 -0
  451. chia/consensus/block_record.py +32 -0
  452. chia/consensus/block_rewards.py +53 -0
  453. chia/consensus/block_root_validation.py +46 -0
  454. chia/consensus/blockchain.py +1100 -0
  455. chia/consensus/blockchain_interface.py +56 -0
  456. chia/consensus/coinbase.py +30 -0
  457. chia/consensus/condition_costs.py +9 -0
  458. chia/consensus/constants.py +49 -0
  459. chia/consensus/cost_calculator.py +15 -0
  460. chia/consensus/default_constants.py +90 -0
  461. chia/consensus/deficit.py +55 -0
  462. chia/consensus/difficulty_adjustment.py +412 -0
  463. chia/consensus/find_fork_point.py +111 -0
  464. chia/consensus/full_block_to_block_record.py +167 -0
  465. chia/consensus/get_block_challenge.py +106 -0
  466. chia/consensus/get_block_generator.py +26 -0
  467. chia/consensus/make_sub_epoch_summary.py +210 -0
  468. chia/consensus/multiprocess_validation.py +365 -0
  469. chia/consensus/pos_quality.py +19 -0
  470. chia/consensus/pot_iterations.py +67 -0
  471. chia/consensus/puzzles/__init__.py +0 -0
  472. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  473. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  474. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  475. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  476. chia/consensus/vdf_info_computation.py +156 -0
  477. chia/daemon/__init__.py +0 -0
  478. chia/daemon/client.py +233 -0
  479. chia/daemon/keychain_proxy.py +501 -0
  480. chia/daemon/keychain_server.py +365 -0
  481. chia/daemon/server.py +1616 -0
  482. chia/daemon/windows_signal.py +56 -0
  483. chia/data_layer/__init__.py +0 -0
  484. chia/data_layer/data_layer.py +1303 -0
  485. chia/data_layer/data_layer_api.py +25 -0
  486. chia/data_layer/data_layer_errors.py +50 -0
  487. chia/data_layer/data_layer_server.py +170 -0
  488. chia/data_layer/data_layer_util.py +985 -0
  489. chia/data_layer/data_layer_wallet.py +1315 -0
  490. chia/data_layer/data_store.py +2267 -0
  491. chia/data_layer/dl_wallet_store.py +407 -0
  492. chia/data_layer/download_data.py +389 -0
  493. chia/data_layer/puzzles/__init__.py +0 -0
  494. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  495. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  496. chia/data_layer/s3_plugin_config.yml +33 -0
  497. chia/data_layer/s3_plugin_service.py +468 -0
  498. chia/data_layer/util/__init__.py +0 -0
  499. chia/data_layer/util/benchmark.py +108 -0
  500. chia/data_layer/util/plugin.py +41 -0
  501. chia/farmer/__init__.py +0 -0
  502. chia/farmer/farmer.py +920 -0
  503. chia/farmer/farmer_api.py +814 -0
  504. chia/full_node/__init__.py +0 -0
  505. chia/full_node/bitcoin_fee_estimator.py +85 -0
  506. chia/full_node/block_height_map.py +271 -0
  507. chia/full_node/block_store.py +570 -0
  508. chia/full_node/bundle_tools.py +19 -0
  509. chia/full_node/coin_store.py +646 -0
  510. chia/full_node/fee_estimate.py +54 -0
  511. chia/full_node/fee_estimate_store.py +24 -0
  512. chia/full_node/fee_estimation.py +93 -0
  513. chia/full_node/fee_estimator.py +90 -0
  514. chia/full_node/fee_estimator_constants.py +38 -0
  515. chia/full_node/fee_estimator_interface.py +42 -0
  516. chia/full_node/fee_history.py +26 -0
  517. chia/full_node/fee_tracker.py +564 -0
  518. chia/full_node/full_node.py +3052 -0
  519. chia/full_node/full_node_api.py +1974 -0
  520. chia/full_node/full_node_store.py +1033 -0
  521. chia/full_node/hint_management.py +56 -0
  522. chia/full_node/hint_store.py +94 -0
  523. chia/full_node/mempool.py +583 -0
  524. chia/full_node/mempool_check_conditions.py +177 -0
  525. chia/full_node/mempool_manager.py +858 -0
  526. chia/full_node/pending_tx_cache.py +112 -0
  527. chia/full_node/puzzles/__init__.py +0 -0
  528. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  529. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  530. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  531. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  532. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  533. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  534. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  535. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  536. chia/full_node/signage_point.py +16 -0
  537. chia/full_node/subscriptions.py +248 -0
  538. chia/full_node/sync_store.py +145 -0
  539. chia/full_node/tx_processing_queue.py +78 -0
  540. chia/full_node/weight_proof.py +1719 -0
  541. chia/harvester/__init__.py +0 -0
  542. chia/harvester/harvester.py +271 -0
  543. chia/harvester/harvester_api.py +374 -0
  544. chia/introducer/__init__.py +0 -0
  545. chia/introducer/introducer.py +120 -0
  546. chia/introducer/introducer_api.py +64 -0
  547. chia/legacy/__init__.py +0 -0
  548. chia/legacy/keyring.py +154 -0
  549. chia/plot_sync/__init__.py +0 -0
  550. chia/plot_sync/delta.py +61 -0
  551. chia/plot_sync/exceptions.py +56 -0
  552. chia/plot_sync/receiver.py +385 -0
  553. chia/plot_sync/sender.py +337 -0
  554. chia/plot_sync/util.py +43 -0
  555. chia/plotters/__init__.py +0 -0
  556. chia/plotters/bladebit.py +388 -0
  557. chia/plotters/chiapos.py +63 -0
  558. chia/plotters/madmax.py +224 -0
  559. chia/plotters/plotters.py +577 -0
  560. chia/plotters/plotters_util.py +131 -0
  561. chia/plotting/__init__.py +0 -0
  562. chia/plotting/cache.py +212 -0
  563. chia/plotting/check_plots.py +283 -0
  564. chia/plotting/create_plots.py +278 -0
  565. chia/plotting/manager.py +436 -0
  566. chia/plotting/util.py +324 -0
  567. chia/pools/__init__.py +0 -0
  568. chia/pools/pool_config.py +110 -0
  569. chia/pools/pool_puzzles.py +459 -0
  570. chia/pools/pool_wallet.py +926 -0
  571. chia/pools/pool_wallet_info.py +118 -0
  572. chia/pools/puzzles/__init__.py +0 -0
  573. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  574. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  575. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  576. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  577. chia/protocols/__init__.py +0 -0
  578. chia/protocols/farmer_protocol.py +102 -0
  579. chia/protocols/full_node_protocol.py +219 -0
  580. chia/protocols/harvester_protocol.py +216 -0
  581. chia/protocols/introducer_protocol.py +26 -0
  582. chia/protocols/pool_protocol.py +177 -0
  583. chia/protocols/protocol_message_types.py +139 -0
  584. chia/protocols/protocol_state_machine.py +87 -0
  585. chia/protocols/protocol_timing.py +7 -0
  586. chia/protocols/shared_protocol.py +86 -0
  587. chia/protocols/timelord_protocol.py +93 -0
  588. chia/protocols/wallet_protocol.py +401 -0
  589. chia/py.typed +0 -0
  590. chia/rpc/__init__.py +0 -0
  591. chia/rpc/crawler_rpc_api.py +75 -0
  592. chia/rpc/data_layer_rpc_api.py +639 -0
  593. chia/rpc/data_layer_rpc_client.py +188 -0
  594. chia/rpc/data_layer_rpc_util.py +62 -0
  595. chia/rpc/farmer_rpc_api.py +360 -0
  596. chia/rpc/farmer_rpc_client.py +86 -0
  597. chia/rpc/full_node_rpc_api.py +954 -0
  598. chia/rpc/full_node_rpc_client.py +292 -0
  599. chia/rpc/harvester_rpc_api.py +136 -0
  600. chia/rpc/harvester_rpc_client.py +54 -0
  601. chia/rpc/rpc_client.py +144 -0
  602. chia/rpc/rpc_server.py +447 -0
  603. chia/rpc/timelord_rpc_api.py +27 -0
  604. chia/rpc/util.py +293 -0
  605. chia/rpc/wallet_request_types.py +688 -0
  606. chia/rpc/wallet_rpc_api.py +4779 -0
  607. chia/rpc/wallet_rpc_client.py +1844 -0
  608. chia/seeder/__init__.py +0 -0
  609. chia/seeder/crawl_store.py +427 -0
  610. chia/seeder/crawler.py +423 -0
  611. chia/seeder/crawler_api.py +129 -0
  612. chia/seeder/dns_server.py +544 -0
  613. chia/seeder/peer_record.py +146 -0
  614. chia/seeder/start_crawler.py +88 -0
  615. chia/server/__init__.py +0 -0
  616. chia/server/address_manager.py +658 -0
  617. chia/server/address_manager_store.py +237 -0
  618. chia/server/api_protocol.py +11 -0
  619. chia/server/capabilities.py +24 -0
  620. chia/server/chia_policy.py +345 -0
  621. chia/server/introducer_peers.py +76 -0
  622. chia/server/node_discovery.py +718 -0
  623. chia/server/outbound_message.py +33 -0
  624. chia/server/rate_limit_numbers.py +204 -0
  625. chia/server/rate_limits.py +113 -0
  626. chia/server/server.py +720 -0
  627. chia/server/signal_handlers.py +117 -0
  628. chia/server/ssl_context.py +32 -0
  629. chia/server/start_data_layer.py +137 -0
  630. chia/server/start_farmer.py +86 -0
  631. chia/server/start_full_node.py +106 -0
  632. chia/server/start_harvester.py +80 -0
  633. chia/server/start_introducer.py +69 -0
  634. chia/server/start_service.py +328 -0
  635. chia/server/start_timelord.py +82 -0
  636. chia/server/start_wallet.py +109 -0
  637. chia/server/upnp.py +117 -0
  638. chia/server/ws_connection.py +752 -0
  639. chia/simulator/__init__.py +0 -0
  640. chia/simulator/block_tools.py +2053 -0
  641. chia/simulator/full_node_simulator.py +802 -0
  642. chia/simulator/keyring.py +128 -0
  643. chia/simulator/setup_services.py +505 -0
  644. chia/simulator/simulator_constants.py +13 -0
  645. chia/simulator/simulator_full_node_rpc_api.py +101 -0
  646. chia/simulator/simulator_full_node_rpc_client.py +62 -0
  647. chia/simulator/simulator_protocol.py +29 -0
  648. chia/simulator/simulator_test_tools.py +163 -0
  649. chia/simulator/socket.py +27 -0
  650. chia/simulator/ssl_certs.py +114 -0
  651. chia/simulator/ssl_certs_1.py +699 -0
  652. chia/simulator/ssl_certs_10.py +699 -0
  653. chia/simulator/ssl_certs_2.py +699 -0
  654. chia/simulator/ssl_certs_3.py +699 -0
  655. chia/simulator/ssl_certs_4.py +699 -0
  656. chia/simulator/ssl_certs_5.py +699 -0
  657. chia/simulator/ssl_certs_6.py +699 -0
  658. chia/simulator/ssl_certs_7.py +699 -0
  659. chia/simulator/ssl_certs_8.py +699 -0
  660. chia/simulator/ssl_certs_9.py +699 -0
  661. chia/simulator/start_simulator.py +135 -0
  662. chia/simulator/wallet_tools.py +245 -0
  663. chia/ssl/__init__.py +0 -0
  664. chia/ssl/chia_ca.crt +19 -0
  665. chia/ssl/chia_ca.key +28 -0
  666. chia/ssl/create_ssl.py +249 -0
  667. chia/ssl/dst_root_ca.pem +20 -0
  668. chia/timelord/__init__.py +0 -0
  669. chia/timelord/iters_from_block.py +50 -0
  670. chia/timelord/timelord.py +1202 -0
  671. chia/timelord/timelord_api.py +132 -0
  672. chia/timelord/timelord_launcher.py +188 -0
  673. chia/timelord/timelord_state.py +244 -0
  674. chia/timelord/types.py +22 -0
  675. chia/types/__init__.py +0 -0
  676. chia/types/aliases.py +35 -0
  677. chia/types/block_protocol.py +20 -0
  678. chia/types/blockchain_format/__init__.py +0 -0
  679. chia/types/blockchain_format/classgroup.py +5 -0
  680. chia/types/blockchain_format/coin.py +28 -0
  681. chia/types/blockchain_format/foliage.py +8 -0
  682. chia/types/blockchain_format/pool_target.py +5 -0
  683. chia/types/blockchain_format/program.py +270 -0
  684. chia/types/blockchain_format/proof_of_space.py +135 -0
  685. chia/types/blockchain_format/reward_chain_block.py +6 -0
  686. chia/types/blockchain_format/serialized_program.py +5 -0
  687. chia/types/blockchain_format/sized_bytes.py +11 -0
  688. chia/types/blockchain_format/slots.py +9 -0
  689. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  690. chia/types/blockchain_format/tree_hash.py +72 -0
  691. chia/types/blockchain_format/vdf.py +86 -0
  692. chia/types/clvm_cost.py +13 -0
  693. chia/types/coin_record.py +43 -0
  694. chia/types/coin_spend.py +115 -0
  695. chia/types/condition_opcodes.py +73 -0
  696. chia/types/condition_with_args.py +17 -0
  697. chia/types/eligible_coin_spends.py +364 -0
  698. chia/types/end_of_slot_bundle.py +5 -0
  699. chia/types/fee_rate.py +38 -0
  700. chia/types/full_block.py +5 -0
  701. chia/types/generator_types.py +14 -0
  702. chia/types/header_block.py +5 -0
  703. chia/types/internal_mempool_item.py +19 -0
  704. chia/types/mempool_inclusion_status.py +9 -0
  705. chia/types/mempool_item.py +85 -0
  706. chia/types/mempool_submission_status.py +30 -0
  707. chia/types/mojos.py +7 -0
  708. chia/types/peer_info.py +64 -0
  709. chia/types/signing_mode.py +29 -0
  710. chia/types/spend_bundle.py +31 -0
  711. chia/types/spend_bundle_conditions.py +7 -0
  712. chia/types/transaction_queue_entry.py +55 -0
  713. chia/types/unfinished_block.py +5 -0
  714. chia/types/unfinished_header_block.py +37 -0
  715. chia/types/weight_proof.py +50 -0
  716. chia/util/__init__.py +0 -0
  717. chia/util/action_scope.py +168 -0
  718. chia/util/api_decorators.py +89 -0
  719. chia/util/async_pool.py +224 -0
  720. chia/util/augmented_chain.py +130 -0
  721. chia/util/batches.py +39 -0
  722. chia/util/bech32m.py +123 -0
  723. chia/util/beta_metrics.py +118 -0
  724. chia/util/block_cache.py +56 -0
  725. chia/util/byte_types.py +10 -0
  726. chia/util/check_fork_next_block.py +32 -0
  727. chia/util/chia_logging.py +124 -0
  728. chia/util/chia_version.py +33 -0
  729. chia/util/collection.py +17 -0
  730. chia/util/condition_tools.py +201 -0
  731. chia/util/config.py +366 -0
  732. chia/util/cpu.py +20 -0
  733. chia/util/db_synchronous.py +21 -0
  734. chia/util/db_version.py +30 -0
  735. chia/util/db_wrapper.py +427 -0
  736. chia/util/default_root.py +10 -0
  737. chia/util/dump_keyring.py +93 -0
  738. chia/util/english.txt +2048 -0
  739. chia/util/errors.py +351 -0
  740. chia/util/file_keyring.py +480 -0
  741. chia/util/files.py +95 -0
  742. chia/util/full_block_utils.py +321 -0
  743. chia/util/generator_tools.py +62 -0
  744. chia/util/hash.py +29 -0
  745. chia/util/initial-config.yaml +675 -0
  746. chia/util/inline_executor.py +24 -0
  747. chia/util/ints.py +19 -0
  748. chia/util/json_util.py +41 -0
  749. chia/util/keychain.py +673 -0
  750. chia/util/keyring_wrapper.py +266 -0
  751. chia/util/limited_semaphore.py +39 -0
  752. chia/util/lock.py +47 -0
  753. chia/util/log_exceptions.py +29 -0
  754. chia/util/logging.py +34 -0
  755. chia/util/lru_cache.py +29 -0
  756. chia/util/math.py +20 -0
  757. chia/util/network.py +240 -0
  758. chia/util/paginator.py +46 -0
  759. chia/util/path.py +29 -0
  760. chia/util/permissions.py +19 -0
  761. chia/util/pprint.py +40 -0
  762. chia/util/prev_transaction_block.py +23 -0
  763. chia/util/priority_mutex.py +92 -0
  764. chia/util/profiler.py +194 -0
  765. chia/util/recursive_replace.py +22 -0
  766. chia/util/safe_cancel_task.py +14 -0
  767. chia/util/service_groups.py +47 -0
  768. chia/util/setproctitle.py +20 -0
  769. chia/util/significant_bits.py +30 -0
  770. chia/util/ssl_check.py +213 -0
  771. chia/util/streamable.py +654 -0
  772. chia/util/task_timing.py +378 -0
  773. chia/util/timing.py +64 -0
  774. chia/util/vdf_prover.py +31 -0
  775. chia/util/ws_message.py +66 -0
  776. chia/wallet/__init__.py +0 -0
  777. chia/wallet/cat_wallet/__init__.py +0 -0
  778. chia/wallet/cat_wallet/cat_constants.py +75 -0
  779. chia/wallet/cat_wallet/cat_info.py +47 -0
  780. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  781. chia/wallet/cat_wallet/cat_utils.py +163 -0
  782. chia/wallet/cat_wallet/cat_wallet.py +869 -0
  783. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  784. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  785. chia/wallet/cat_wallet/lineage_store.py +74 -0
  786. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  787. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  788. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  789. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  790. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  791. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  792. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  793. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  794. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  795. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  796. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  797. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  798. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  799. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  800. chia/wallet/coin_selection.py +188 -0
  801. chia/wallet/conditions.py +1326 -0
  802. chia/wallet/dao_wallet/__init__.py +0 -0
  803. chia/wallet/dao_wallet/dao_info.py +61 -0
  804. chia/wallet/dao_wallet/dao_utils.py +810 -0
  805. chia/wallet/dao_wallet/dao_wallet.py +2121 -0
  806. chia/wallet/db_wallet/__init__.py +0 -0
  807. chia/wallet/db_wallet/db_wallet_puzzles.py +107 -0
  808. chia/wallet/derivation_record.py +30 -0
  809. chia/wallet/derive_keys.py +146 -0
  810. chia/wallet/did_wallet/__init__.py +0 -0
  811. chia/wallet/did_wallet/did_info.py +39 -0
  812. chia/wallet/did_wallet/did_wallet.py +1485 -0
  813. chia/wallet/did_wallet/did_wallet_puzzles.py +220 -0
  814. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  815. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  816. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  817. chia/wallet/driver_protocol.py +26 -0
  818. chia/wallet/key_val_store.py +55 -0
  819. chia/wallet/lineage_proof.py +58 -0
  820. chia/wallet/nft_wallet/__init__.py +0 -0
  821. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  822. chia/wallet/nft_wallet/nft_info.py +120 -0
  823. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  824. chia/wallet/nft_wallet/nft_wallet.py +1686 -0
  825. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  826. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  827. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  828. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  829. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  830. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  831. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  832. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  833. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  834. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  835. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  836. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  837. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  838. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  839. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  840. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  841. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  842. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  843. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  844. chia/wallet/notification_manager.py +117 -0
  845. chia/wallet/notification_store.py +178 -0
  846. chia/wallet/outer_puzzles.py +84 -0
  847. chia/wallet/payment.py +34 -0
  848. chia/wallet/puzzle_drivers.py +118 -0
  849. chia/wallet/puzzles/__init__.py +0 -0
  850. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  851. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  852. chia/wallet/puzzles/clawback/__init__.py +0 -0
  853. chia/wallet/puzzles/clawback/drivers.py +188 -0
  854. chia/wallet/puzzles/clawback/metadata.py +38 -0
  855. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  856. chia/wallet/puzzles/condition_codes.clib +77 -0
  857. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  858. chia/wallet/puzzles/curry.clib +135 -0
  859. chia/wallet/puzzles/curry_by_index.clib +16 -0
  860. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  861. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  862. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  863. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  864. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  865. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  866. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  867. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  868. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  869. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  870. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  871. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  872. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  873. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  874. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  876. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  877. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  878. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  879. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  880. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  881. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  882. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  883. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  884. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  885. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  886. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  887. chia/wallet/puzzles/json.clib +25 -0
  888. chia/wallet/puzzles/load_clvm.py +162 -0
  889. chia/wallet/puzzles/merkle_utils.clib +18 -0
  890. chia/wallet/puzzles/notification.clsp +7 -0
  891. chia/wallet/puzzles/notification.clsp.hex +1 -0
  892. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  893. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  894. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  895. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  896. chia/wallet/puzzles/p2_conditions.py +27 -0
  897. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  898. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  899. chia/wallet/puzzles/p2_delegated_conditions.py +22 -0
  900. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  901. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  902. chia/wallet/puzzles/p2_delegated_puzzle.py +35 -0
  903. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  904. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +161 -0
  906. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  907. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  908. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +22 -0
  909. chia/wallet/puzzles/p2_parent.clsp +19 -0
  910. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  911. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  912. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  913. chia/wallet/puzzles/p2_puzzle_hash.py +28 -0
  914. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  915. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  916. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  917. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  919. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  920. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  921. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  922. chia/wallet/puzzles/puzzle_utils.py +34 -0
  923. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  924. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  925. chia/wallet/puzzles/sha256tree.clib +11 -0
  926. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  927. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  928. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  929. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  930. chia/wallet/puzzles/singleton_top_layer.py +295 -0
  931. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  932. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  933. chia/wallet/puzzles/singleton_top_layer_v1_1.py +344 -0
  934. chia/wallet/puzzles/singleton_truths.clib +21 -0
  935. chia/wallet/puzzles/tails.py +344 -0
  936. chia/wallet/puzzles/utility_macros.clib +48 -0
  937. chia/wallet/signer_protocol.py +126 -0
  938. chia/wallet/singleton.py +106 -0
  939. chia/wallet/singleton_record.py +30 -0
  940. chia/wallet/trade_manager.py +1088 -0
  941. chia/wallet/trade_record.py +67 -0
  942. chia/wallet/trading/__init__.py +0 -0
  943. chia/wallet/trading/offer.py +703 -0
  944. chia/wallet/trading/trade_status.py +13 -0
  945. chia/wallet/trading/trade_store.py +526 -0
  946. chia/wallet/transaction_record.py +143 -0
  947. chia/wallet/transaction_sorting.py +14 -0
  948. chia/wallet/uncurried_puzzle.py +17 -0
  949. chia/wallet/util/__init__.py +0 -0
  950. chia/wallet/util/address_type.py +55 -0
  951. chia/wallet/util/blind_signer_tl.py +168 -0
  952. chia/wallet/util/clvm_streamable.py +203 -0
  953. chia/wallet/util/compute_hints.py +66 -0
  954. chia/wallet/util/compute_memos.py +45 -0
  955. chia/wallet/util/curry_and_treehash.py +90 -0
  956. chia/wallet/util/debug_spend_bundle.py +234 -0
  957. chia/wallet/util/merkle_tree.py +100 -0
  958. chia/wallet/util/merkle_utils.py +102 -0
  959. chia/wallet/util/new_peak_queue.py +82 -0
  960. chia/wallet/util/notifications.py +12 -0
  961. chia/wallet/util/peer_request_cache.py +174 -0
  962. chia/wallet/util/puzzle_compression.py +96 -0
  963. chia/wallet/util/puzzle_decorator.py +100 -0
  964. chia/wallet/util/puzzle_decorator_type.py +7 -0
  965. chia/wallet/util/query_filter.py +60 -0
  966. chia/wallet/util/transaction_type.py +23 -0
  967. chia/wallet/util/tx_config.py +158 -0
  968. chia/wallet/util/wallet_sync_utils.py +348 -0
  969. chia/wallet/util/wallet_types.py +65 -0
  970. chia/wallet/vc_wallet/__init__.py +0 -0
  971. chia/wallet/vc_wallet/cr_cat_drivers.py +663 -0
  972. chia/wallet/vc_wallet/cr_cat_wallet.py +875 -0
  973. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  974. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  975. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  976. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  977. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  978. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  979. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  980. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  981. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  982. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  983. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  984. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  985. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  986. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  987. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  988. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  989. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  990. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  992. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  994. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  996. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  997. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  998. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_store.py +263 -0
  1002. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1003. chia/wallet/wallet.py +698 -0
  1004. chia/wallet/wallet_action_scope.py +95 -0
  1005. chia/wallet/wallet_blockchain.py +244 -0
  1006. chia/wallet/wallet_coin_record.py +72 -0
  1007. chia/wallet/wallet_coin_store.py +351 -0
  1008. chia/wallet/wallet_info.py +36 -0
  1009. chia/wallet/wallet_interested_store.py +188 -0
  1010. chia/wallet/wallet_nft_store.py +279 -0
  1011. chia/wallet/wallet_node.py +1769 -0
  1012. chia/wallet/wallet_node_api.py +201 -0
  1013. chia/wallet/wallet_pool_store.py +120 -0
  1014. chia/wallet/wallet_protocol.py +90 -0
  1015. chia/wallet/wallet_puzzle_store.py +365 -0
  1016. chia/wallet/wallet_retry_store.py +70 -0
  1017. chia/wallet/wallet_singleton_store.py +258 -0
  1018. chia/wallet/wallet_spend_bundle.py +41 -0
  1019. chia/wallet/wallet_state_manager.py +2820 -0
  1020. chia/wallet/wallet_transaction_store.py +470 -0
  1021. chia/wallet/wallet_user_store.py +110 -0
  1022. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1023. chia_blockchain-2.4.4.dist-info/LICENSE +201 -0
  1024. chia_blockchain-2.4.4.dist-info/METADATA +161 -0
  1025. chia_blockchain-2.4.4.dist-info/RECORD +1028 -0
  1026. chia_blockchain-2.4.4.dist-info/WHEEL +4 -0
  1027. chia_blockchain-2.4.4.dist-info/entry_points.txt +17 -0
  1028. mozilla-ca/cacert.pem +3666 -0
@@ -0,0 +1,1010 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import contextlib
5
+ import logging
6
+ import tempfile
7
+ from dataclasses import dataclass
8
+ from pathlib import Path
9
+ from shutil import rmtree
10
+ from typing import Any, AsyncIterator, Dict, List, Tuple
11
+
12
+ import pytest
13
+
14
+ # TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469
15
+ from _pytest.fixtures import SubRequest
16
+ from chia_rs import G1Element
17
+
18
+ from chia._tests.util.setup_nodes import setup_simulators_and_wallets_service
19
+ from chia._tests.util.time_out_assert import time_out_assert
20
+ from chia.consensus.constants import ConsensusConstants
21
+ from chia.pools.pool_puzzles import SINGLETON_LAUNCHER_HASH
22
+ from chia.pools.pool_wallet_info import PoolSingletonState, PoolWalletInfo
23
+ from chia.rpc.wallet_rpc_client import WalletRpcClient
24
+ from chia.simulator.block_tools import BlockTools, get_plot_dir
25
+ from chia.simulator.full_node_simulator import FullNodeSimulator
26
+ from chia.simulator.simulator_protocol import ReorgProtocol
27
+ from chia.simulator.start_simulator import SimulatorFullNodeService
28
+ from chia.types.aliases import WalletService
29
+ from chia.types.blockchain_format.sized_bytes import bytes32
30
+ from chia.types.peer_info import PeerInfo
31
+ from chia.util.bech32m import encode_puzzle_hash
32
+ from chia.util.byte_types import hexstr_to_bytes
33
+ from chia.util.config import load_config
34
+ from chia.util.ints import uint32, uint64
35
+ from chia.wallet.derive_keys import find_authentication_sk, find_owner_sk
36
+ from chia.wallet.transaction_record import TransactionRecord
37
+ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
38
+ from chia.wallet.util.wallet_types import WalletType
39
+ from chia.wallet.wallet_node import WalletNode
40
+
41
+ # TODO: Compare deducted fees in all tests against reported total_fee
42
+
43
+ log = logging.getLogger(__name__)
44
+ FEE_AMOUNT = uint64(29_000)
45
+ MAX_WAIT_SECS = 30 # A high value for WAIT_SECS is useful when paused in the debugger
46
+
47
+
48
+ def get_pool_plot_dir() -> Path:
49
+ return get_plot_dir() / Path("pool_tests")
50
+
51
+
52
+ @dataclass(frozen=True)
53
+ class TemporaryPoolPlot:
54
+ bt: BlockTools
55
+ p2_singleton_puzzle_hash: bytes32
56
+ plot_id: bytes32
57
+
58
+
59
+ @contextlib.asynccontextmanager
60
+ async def manage_temporary_pool_plot(
61
+ bt: BlockTools,
62
+ p2_singleton_puzzle_hash: bytes32,
63
+ ) -> AsyncIterator[TemporaryPoolPlot]:
64
+ with tempfile.TemporaryDirectory() as tmpdir:
65
+ tmp_path: Path = Path(tmpdir)
66
+ bt.add_plot_directory(tmp_path)
67
+ bt_plot = await bt.new_plot(p2_singleton_puzzle_hash, tmp_path, tmp_dir=tmp_path)
68
+ try:
69
+ await bt.refresh_plots()
70
+
71
+ plot = TemporaryPoolPlot(bt=bt, p2_singleton_puzzle_hash=p2_singleton_puzzle_hash, plot_id=bt_plot.plot_id)
72
+
73
+ yield plot
74
+ finally:
75
+ await bt.delete_plot(bt_plot.plot_id)
76
+
77
+
78
+ PREFARMED_BLOCKS = 4
79
+
80
+
81
+ @pytest.fixture(scope="function", params=[False, True])
82
+ def trusted(request: SubRequest) -> bool:
83
+ return request.param # type: ignore[no-any-return]
84
+
85
+
86
+ @pytest.fixture(scope="function")
87
+ def fee(trusted: bool) -> uint64:
88
+ if trusted:
89
+ return FEE_AMOUNT
90
+
91
+ return uint64(0)
92
+
93
+
94
+ OneWalletNodeAndRpc = Tuple[WalletRpcClient, Any, FullNodeSimulator, int, BlockTools]
95
+
96
+
97
+ @pytest.fixture(scope="function")
98
+ async def one_wallet_node_and_rpc(
99
+ trusted: bool, self_hostname: str, blockchain_constants: ConsensusConstants
100
+ ) -> AsyncIterator[OneWalletNodeAndRpc]:
101
+ rmtree(get_pool_plot_dir(), ignore_errors=True)
102
+ async with setup_simulators_and_wallets_service(1, 1, blockchain_constants) as nodes:
103
+ full_nodes, wallets, bt = nodes
104
+ full_node_api: FullNodeSimulator = full_nodes[0]._api
105
+ wallet_service = wallets[0]
106
+ wallet_node = wallet_service._node
107
+ wallet = wallet_node.wallet_state_manager.main_wallet
108
+
109
+ if trusted:
110
+ wallet_node.config["trusted_peers"] = {
111
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
112
+ }
113
+ else:
114
+ wallet_node.config["trusted_peers"] = {}
115
+
116
+ await wallet_node.server.start_client(PeerInfo(self_hostname, full_node_api.full_node.server.get_port()), None)
117
+
118
+ balance = await full_node_api.farm_rewards_to_wallet(amount=8_000_000_000_000, wallet=wallet)
119
+ assert wallet_service.rpc_server is not None
120
+ client = await WalletRpcClient.create(
121
+ self_hostname, wallet_service.rpc_server.listen_port, wallet_service.root_path, wallet_service.config
122
+ )
123
+
124
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
125
+
126
+ yield client, wallet_node, full_node_api, balance, bt
127
+
128
+ client.close()
129
+ await client.await_closed()
130
+
131
+
132
+ Setup = Tuple[FullNodeSimulator, WalletNode, bytes32, int, WalletRpcClient]
133
+
134
+
135
+ @pytest.fixture(scope="function")
136
+ async def setup(
137
+ one_wallet_and_one_simulator_services: Tuple[List[SimulatorFullNodeService], List[WalletService], BlockTools],
138
+ trusted: bool,
139
+ self_hostname: str,
140
+ ) -> AsyncIterator[Setup]:
141
+ rmtree(get_pool_plot_dir(), ignore_errors=True)
142
+ [full_node_service], [wallet_service], bt = one_wallet_and_one_simulator_services
143
+ full_node_api: FullNodeSimulator = full_node_service._api
144
+ wallet_node = wallet_service._node
145
+ our_ph_record = await wallet_node.wallet_state_manager.get_unused_derivation_record(uint32(1), hardened=True)
146
+ our_ph = our_ph_record.puzzle_hash
147
+
148
+ wallet_server = wallet_service.rpc_server
149
+ assert wallet_server is not None
150
+
151
+ client = await WalletRpcClient.create(
152
+ self_hostname, wallet_server.listen_port, wallet_service.root_path, wallet_service.config
153
+ )
154
+
155
+ if trusted:
156
+ wallet_node.config["trusted_peers"] = {
157
+ full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
158
+ }
159
+ else:
160
+ wallet_node.config["trusted_peers"] = {}
161
+
162
+ await wallet_node.server.start_client(PeerInfo(self_hostname, full_node_api.full_node.server.get_port()), None)
163
+
164
+ assert wallet_node._wallet_state_manager is not None
165
+ wallet = wallet_node._wallet_state_manager.main_wallet
166
+ total_block_rewards = await full_node_api.farm_rewards_to_wallet(amount=8_000_000_000_000, wallet=wallet)
167
+ await full_node_api.farm_blocks_to_wallet(count=3, wallet=wallet)
168
+
169
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
170
+
171
+ yield (
172
+ full_node_api,
173
+ wallet_node,
174
+ our_ph,
175
+ total_block_rewards,
176
+ client, # wallet rpc client
177
+ )
178
+
179
+ client.close()
180
+ await client.await_closed()
181
+
182
+
183
+ class TestPoolWalletRpc:
184
+ @pytest.mark.anyio
185
+ async def test_create_new_pool_wallet_self_farm(
186
+ self,
187
+ one_wallet_node_and_rpc: OneWalletNodeAndRpc,
188
+ fee: uint64,
189
+ self_hostname: str,
190
+ ) -> None:
191
+ client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
192
+ wallet = wallet_node.wallet_state_manager.main_wallet
193
+
194
+ our_ph = await wallet.get_new_puzzlehash()
195
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
196
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
197
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
198
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
199
+ )
200
+ await full_node_api.process_transaction_records(records=[creation_tx])
201
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=30)
202
+
203
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
204
+ assert len(summaries_response) == 1
205
+ wallet_id: int = summaries_response[0]["id"]
206
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
207
+
208
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
209
+ assert status.target is None
210
+ assert status.current.owner_pubkey == G1Element.from_bytes(
211
+ bytes.fromhex(
212
+ "b286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
213
+ )
214
+ )
215
+ assert status.current.pool_url == ""
216
+ assert status.current.relative_lock_height == 0
217
+ assert status.current.version == 1
218
+ # Check that config has been written properly
219
+ full_config: Dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
220
+ pool_list: List[Dict[str, Any]] = full_config["pool"]["pool_list"]
221
+ assert len(pool_list) == 1
222
+ pool_config = pool_list[0]
223
+ assert (
224
+ pool_config["owner_public_key"]
225
+ == "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
226
+ )
227
+ # It can be one of multiple launcher IDs, due to selecting a different coin
228
+ launcher_id = None
229
+ for addition in creation_tx.additions:
230
+ if addition.puzzle_hash == SINGLETON_LAUNCHER_HASH:
231
+ launcher_id = addition.name()
232
+ break
233
+ assert hexstr_to_bytes(pool_config["launcher_id"]) == launcher_id
234
+ assert pool_config["pool_url"] == ""
235
+
236
+ @pytest.mark.anyio
237
+ async def test_create_new_pool_wallet_farm_to_pool(
238
+ self,
239
+ one_wallet_node_and_rpc: OneWalletNodeAndRpc,
240
+ fee: uint64,
241
+ self_hostname: str,
242
+ ) -> None:
243
+ client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
244
+ wallet = wallet_node.wallet_state_manager.main_wallet
245
+
246
+ our_ph = await wallet.get_new_puzzlehash()
247
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
248
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
249
+
250
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
251
+ our_ph, "http://pool.example.com", uint32(10), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
252
+ )
253
+ await full_node_api.process_transaction_records(records=[creation_tx])
254
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
255
+
256
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
257
+ assert len(summaries_response) == 1
258
+ wallet_id: int = summaries_response[0]["id"]
259
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
260
+
261
+ assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
262
+ assert status.target is None
263
+ assert status.current.owner_pubkey == G1Element.from_bytes(
264
+ bytes.fromhex(
265
+ "b286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
266
+ )
267
+ )
268
+ assert status.current.pool_url == "http://pool.example.com"
269
+ assert status.current.relative_lock_height == 10
270
+ assert status.current.version == 1
271
+ # Check that config has been written properly
272
+ full_config: Dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
273
+ pool_list: List[Dict[str, Any]] = full_config["pool"]["pool_list"]
274
+ assert len(pool_list) == 1
275
+ pool_config = pool_list[0]
276
+ assert (
277
+ pool_config["owner_public_key"]
278
+ == "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
279
+ )
280
+ # It can be one of multiple launcher IDs, due to selecting a different coin
281
+ launcher_id = None
282
+ for addition in creation_tx.additions:
283
+ if addition.puzzle_hash == SINGLETON_LAUNCHER_HASH:
284
+ launcher_id = addition.name()
285
+ break
286
+ assert hexstr_to_bytes(pool_config["launcher_id"]) == launcher_id
287
+ assert pool_config["pool_url"] == "http://pool.example.com"
288
+
289
+ @pytest.mark.anyio
290
+ async def test_create_multiple_pool_wallets(
291
+ self,
292
+ one_wallet_node_and_rpc: OneWalletNodeAndRpc,
293
+ trusted: bool,
294
+ fee: uint64,
295
+ self_hostname: str,
296
+ ) -> None:
297
+ client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
298
+
299
+ wallet = wallet_node.wallet_state_manager.main_wallet
300
+
301
+ our_ph_1 = await wallet.get_new_puzzlehash()
302
+ our_ph_2 = await wallet.get_new_puzzlehash()
303
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
304
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
305
+
306
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
307
+ our_ph_1, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
308
+ )
309
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
310
+ creation_tx_2: TransactionRecord = await client.create_new_pool_wallet(
311
+ our_ph_1, self_hostname, uint32(12), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
312
+ )
313
+
314
+ await full_node_api.process_transaction_records(records=[creation_tx, creation_tx_2])
315
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
316
+
317
+ async def pw_created(check_wallet_id: int) -> bool:
318
+ try:
319
+ await client.pw_status(check_wallet_id)
320
+ return True
321
+ except ValueError:
322
+ return False
323
+
324
+ await time_out_assert(10, pw_created, True, 2)
325
+ await time_out_assert(10, pw_created, True, 3)
326
+ status_2: PoolWalletInfo = (await client.pw_status(2))[0]
327
+ status_3: PoolWalletInfo = (await client.pw_status(3))[0]
328
+
329
+ if status_2.current.state == PoolSingletonState.SELF_POOLING.value:
330
+ assert status_3.current.state == PoolSingletonState.FARMING_TO_POOL.value
331
+ else:
332
+ assert status_2.current.state == PoolSingletonState.FARMING_TO_POOL.value
333
+ assert status_3.current.state == PoolSingletonState.SELF_POOLING.value
334
+
335
+ full_config = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
336
+ pool_list: List[Dict[str, Any]] = full_config["pool"]["pool_list"]
337
+ assert len(pool_list) == 2
338
+
339
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
340
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(3)) == 0
341
+ # Doing a reorg reverts and removes the pool wallets
342
+ await full_node_api.reorg_from_index_to_new_index(ReorgProtocol(uint32(0), uint32(20), our_ph_2, None))
343
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=30)
344
+ summaries_response = await client.get_wallets()
345
+ assert len(summaries_response) == 1
346
+
347
+ with pytest.raises(ValueError):
348
+ await client.pw_status(2)
349
+ with pytest.raises(ValueError):
350
+ await client.pw_status(3)
351
+
352
+ # Create some CAT wallets to increase wallet IDs
353
+ def mempool_empty() -> bool:
354
+ return full_node_api.full_node.mempool_manager.mempool.size() == 0
355
+
356
+ await client.delete_unconfirmed_transactions(1)
357
+ await full_node_api.process_all_wallet_transactions(wallet=wallet)
358
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
359
+
360
+ for i in range(5):
361
+ await time_out_assert(10, mempool_empty)
362
+ res = await client.create_new_cat_and_wallet(uint64(20), test=True)
363
+ assert res["success"]
364
+ cat_0_id = res["wallet_id"]
365
+ asset_id = bytes.fromhex(res["asset_id"])
366
+ assert len(asset_id) > 0
367
+ await full_node_api.process_all_wallet_transactions(wallet=wallet)
368
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
369
+ bal_0 = await client.get_wallet_balance(cat_0_id)
370
+ assert bal_0["confirmed_wallet_balance"] == 20
371
+
372
+ # Test creation of many pool wallets. Use untrusted since that is the more complicated protocol, but don't
373
+ # run this code more than once, since it's slow.
374
+ if not trusted:
375
+ for i in range(22):
376
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
377
+ creation_tx_3: TransactionRecord = await client.create_new_pool_wallet(
378
+ our_ph_1, self_hostname, uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
379
+ )
380
+ await full_node_api.process_transaction_records(records=[creation_tx_3])
381
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
382
+
383
+ full_config = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
384
+ pool_list = full_config["pool"]["pool_list"]
385
+ assert len(pool_list) == i + 3
386
+ if i == 0:
387
+ # Ensures that the CAT creation does not cause pool wallet IDs to increment
388
+ for some_wallet in wallet_node.wallet_state_manager.wallets.values():
389
+ if some_wallet.type() == WalletType.POOLING_WALLET:
390
+ status: PoolWalletInfo = (await client.pw_status(some_wallet.id()))[0]
391
+ assert (await some_wallet.get_pool_wallet_index()) < 5
392
+ auth_sk = find_authentication_sk(
393
+ [some_wallet.wallet_state_manager.get_master_private_key()], status.current.owner_pubkey
394
+ )
395
+ assert auth_sk is not None
396
+ owner_sk = find_owner_sk(
397
+ [some_wallet.wallet_state_manager.get_master_private_key()], status.current.owner_pubkey
398
+ )
399
+ assert owner_sk is not None
400
+ assert owner_sk[0] != auth_sk
401
+
402
+ @pytest.mark.anyio
403
+ async def test_absorb_self(
404
+ self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
405
+ ) -> None:
406
+ client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
407
+ bt = full_node_api.bt
408
+
409
+ wallet = wallet_node.wallet_state_manager.main_wallet
410
+
411
+ our_ph = await wallet.get_new_puzzlehash()
412
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
413
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
414
+
415
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
416
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
417
+ )
418
+ await full_node_api.process_transaction_records(records=[creation_tx])
419
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
420
+ status: PoolWalletInfo = (await client.pw_status(2))[0]
421
+
422
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
423
+ async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
424
+ all_blocks = await full_node_api.get_all_full_blocks()
425
+ blocks = bt.get_consecutive_blocks(
426
+ 3,
427
+ block_list_input=all_blocks,
428
+ force_plot_id=pool_plot.plot_id,
429
+ farmer_reward_puzzle_hash=our_ph,
430
+ guarantee_transaction_block=True,
431
+ )
432
+
433
+ for block in blocks[-3:]:
434
+ await full_node_api.full_node.add_block(block)
435
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
436
+
437
+ bal = await client.get_wallet_balance(2)
438
+ assert bal["confirmed_wallet_balance"] == 2 * 1_750_000_000_000
439
+
440
+ # Claim 2 * 1.75, and farm a new 1.75
441
+ absorb_txs: List[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
442
+ await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs)
443
+ await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
444
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
445
+ await full_node_api.check_transactions_confirmed(wallet_node.wallet_state_manager, absorb_txs)
446
+ new_status: PoolWalletInfo = (await client.pw_status(2))[0]
447
+ assert status.current == new_status.current
448
+ assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
449
+ bal = await client.get_wallet_balance(2)
450
+ assert bal["confirmed_wallet_balance"] == 1 * 1_750_000_000_000
451
+
452
+ # Claim another 1.75
453
+ absorb_txs1: List[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
454
+
455
+ await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs1)
456
+
457
+ await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
458
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
459
+ bal = await client.get_wallet_balance(2)
460
+ assert bal["confirmed_wallet_balance"] == 0
461
+
462
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
463
+
464
+ tr: TransactionRecord = (
465
+ await client.send_transaction(
466
+ 1, uint64(100), encode_puzzle_hash(status.p2_singleton_puzzle_hash, "txch"), DEFAULT_TX_CONFIG
467
+ )
468
+ ).transaction
469
+
470
+ await full_node_api.wait_transaction_records_entered_mempool(records=[tr])
471
+ await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
472
+
473
+ # Balance ignores non coinbase TX
474
+ bal = await client.get_wallet_balance(2)
475
+ assert bal["confirmed_wallet_balance"] == 0
476
+
477
+ with pytest.raises(ValueError):
478
+ await client.pw_absorb_rewards(2, uint64(fee))
479
+
480
+ tx1 = await client.get_transactions(1)
481
+ assert (250_000_000_000 + fee) in [tx.amount for tx in tx1]
482
+
483
+ @pytest.mark.anyio
484
+ async def test_absorb_self_multiple_coins(
485
+ self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
486
+ ) -> None:
487
+ client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
488
+ bt = full_node_api.bt
489
+
490
+ wallet = wallet_node.wallet_state_manager.main_wallet
491
+
492
+ our_ph = await wallet.get_new_puzzlehash()
493
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
494
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
495
+
496
+ main_expected_confirmed_balance = total_block_rewards
497
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
498
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
499
+ )
500
+ await full_node_api.process_transaction_records(records=[creation_tx])
501
+ main_expected_confirmed_balance -= fee
502
+ main_expected_confirmed_balance -= 1
503
+ pool_expected_confirmed_balance = 0
504
+
505
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
506
+ main_bal = await client.get_wallet_balance(1)
507
+ assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance
508
+
509
+ status: PoolWalletInfo = (await client.pw_status(2))[0]
510
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
511
+
512
+ async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
513
+ all_blocks = await full_node_api.get_all_full_blocks()
514
+ blocks = bt.get_consecutive_blocks(
515
+ 3,
516
+ block_list_input=all_blocks,
517
+ force_plot_id=pool_plot.plot_id,
518
+ farmer_reward_puzzle_hash=our_ph,
519
+ guarantee_transaction_block=True,
520
+ )
521
+
522
+ block_count = 3
523
+ for block in blocks[-block_count:]:
524
+ await full_node_api.full_node.add_block(block)
525
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
526
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
527
+
528
+ pool_expected_confirmed_balance += block_count * 1_750_000_000_000
529
+ main_expected_confirmed_balance += block_count * 250_000_000_000
530
+
531
+ main_bal = await client.get_wallet_balance(1)
532
+ assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance
533
+ bal = await client.get_wallet_balance(2)
534
+ assert bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
535
+
536
+ # Claim
537
+ absorb_txs: List[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee), 1))["transactions"]
538
+ await full_node_api.process_transaction_records(records=absorb_txs)
539
+ main_expected_confirmed_balance -= fee
540
+ main_expected_confirmed_balance += 1_750_000_000_000
541
+ pool_expected_confirmed_balance -= 1_750_000_000_000
542
+
543
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
544
+ new_status: PoolWalletInfo = (await client.pw_status(2))[0]
545
+ assert status.current == new_status.current
546
+ assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
547
+ main_bal = await client.get_wallet_balance(1)
548
+ pool_bal = await client.get_wallet_balance(2)
549
+ assert pool_bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
550
+ assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance # 10499999999999
551
+
552
+ @pytest.mark.anyio
553
+ async def test_absorb_pooling(
554
+ self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
555
+ ) -> None:
556
+ client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
557
+ bt = full_node_api.bt
558
+
559
+ main_expected_confirmed_balance = total_block_rewards
560
+
561
+ wallet = wallet_node.wallet_state_manager.main_wallet
562
+
563
+ our_ph = await wallet.get_new_puzzlehash()
564
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
565
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
566
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
567
+ our_ph, "http://123.45.67.89", uint32(10), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
568
+ )
569
+ await full_node_api.process_transaction_records(records=[creation_tx])
570
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
571
+ main_expected_confirmed_balance -= 1
572
+ main_expected_confirmed_balance -= fee
573
+
574
+ async def farming_to_pool() -> bool:
575
+ try:
576
+ status: PoolWalletInfo = (await client.pw_status(2))[0]
577
+ return status.current.state == PoolSingletonState.FARMING_TO_POOL.value
578
+ except ValueError:
579
+ return False
580
+
581
+ await time_out_assert(20, farming_to_pool)
582
+
583
+ status: PoolWalletInfo = (await client.pw_status(2))[0]
584
+ async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
585
+ all_blocks = await full_node_api.get_all_full_blocks()
586
+ blocks = bt.get_consecutive_blocks(
587
+ 3,
588
+ block_list_input=all_blocks,
589
+ force_plot_id=pool_plot.plot_id,
590
+ farmer_reward_puzzle_hash=our_ph,
591
+ guarantee_transaction_block=True,
592
+ )
593
+
594
+ block_count = 3
595
+ for block in blocks[-block_count:]:
596
+ await full_node_api.full_node.add_block(block)
597
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
598
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
599
+ # Pooled plots don't have balance
600
+ main_expected_confirmed_balance += block_count * 250_000_000_000
601
+ bal = await client.get_wallet_balance(2)
602
+ assert bal["confirmed_wallet_balance"] == 0
603
+
604
+ # Claim block_count * 1.75
605
+ ret = await client.pw_absorb_rewards(2, uint64(fee))
606
+ absorb_txs: List[TransactionRecord] = ret["transactions"]
607
+ if fee == 0:
608
+ assert ret["fee_transaction"] is None
609
+ else:
610
+ assert ret["fee_transaction"].fee_amount == fee
611
+ for tx in absorb_txs:
612
+ assert tx.fee_amount == fee
613
+ await full_node_api.process_transaction_records(records=absorb_txs)
614
+ main_expected_confirmed_balance -= fee
615
+ main_expected_confirmed_balance += block_count * 1_750_000_000_000
616
+
617
+ async def status_updated() -> bool:
618
+ new_st: PoolWalletInfo = (await client.pw_status(2))[0]
619
+ return status.current == new_st.current and status.tip_singleton_coin_id != new_st.tip_singleton_coin_id
620
+
621
+ await time_out_assert(20, status_updated)
622
+ new_status = (await client.pw_status(2))[0]
623
+ bal = await client.get_wallet_balance(2)
624
+ assert bal["confirmed_wallet_balance"] == 0
625
+
626
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
627
+ bal = await client.get_wallet_balance(2)
628
+ assert bal["confirmed_wallet_balance"] == 0
629
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
630
+ peak = full_node_api.full_node.blockchain.get_peak()
631
+ assert peak is not None
632
+ assert await wallet_node.wallet_state_manager.blockchain.get_finished_sync_up_to() == peak.height
633
+ assert (await wallet.get_confirmed_balance()) == main_expected_confirmed_balance
634
+
635
+ num_trials = 3
636
+ status = new_status
637
+
638
+ if fee == 0:
639
+ for i in range(num_trials):
640
+ all_blocks = await full_node_api.get_all_full_blocks()
641
+ # Farm one block using our pool plot
642
+ blocks = bt.get_consecutive_blocks(
643
+ 1,
644
+ block_list_input=all_blocks,
645
+ force_plot_id=pool_plot.plot_id,
646
+ farmer_reward_puzzle_hash=our_ph,
647
+ guarantee_transaction_block=True,
648
+ )
649
+ # Farm one more block to include the reward of the previous one
650
+ blocks = bt.get_consecutive_blocks(
651
+ 1,
652
+ block_list_input=blocks,
653
+ guarantee_transaction_block=True,
654
+ )
655
+ for block in blocks[-2:]:
656
+ await full_node_api.full_node.add_block(block)
657
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
658
+
659
+ # Absorb the farmed reward
660
+ ret = await client.pw_absorb_rewards(2, fee)
661
+ absorb_tx = ret["transaction"]
662
+ await full_node_api.process_transaction_records(records=[absorb_tx])
663
+
664
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
665
+ await time_out_assert(20, status_updated)
666
+ status = (await client.pw_status(2))[0]
667
+ assert ret["fee_transaction"] is None
668
+
669
+ bal2 = await client.get_wallet_balance(2)
670
+ assert bal2["confirmed_wallet_balance"] == 0
671
+
672
+ @pytest.mark.anyio
673
+ async def test_self_pooling_to_pooling(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
674
+ """
675
+ This tests self-pooling -> pooling
676
+ TODO: Fix this test for a positive fee value
677
+ """
678
+
679
+ if fee != 0:
680
+ pytest.skip("need to fix this test for non-zero fees")
681
+
682
+ full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
683
+ pool_ph = bytes32([0] * 32)
684
+
685
+ assert wallet_node._wallet_state_manager is not None
686
+
687
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
688
+
689
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
690
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
691
+ )
692
+ await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
693
+ creation_tx_2: TransactionRecord = await client.create_new_pool_wallet(
694
+ our_ph, "", uint32(0), f"{self_hostname}:5001", "new", "SELF_POOLING", fee
695
+ )
696
+
697
+ for r in creation_tx.removals:
698
+ assert r not in creation_tx_2.removals
699
+
700
+ await full_node_api.process_transaction_records(records=[creation_tx_2])
701
+
702
+ assert not full_node_api.txs_in_mempool(txs=[creation_tx])
703
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
704
+
705
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
706
+ assert len(summaries_response) == 2
707
+ wallet_id: int = summaries_response[0]["id"]
708
+ wallet_id_2: int = summaries_response[1]["id"]
709
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
710
+ status_2: PoolWalletInfo = (await client.pw_status(wallet_id_2))[0]
711
+
712
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
713
+ assert status_2.current.state == PoolSingletonState.SELF_POOLING.value
714
+ assert status.target is None
715
+ assert status_2.target is None
716
+
717
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
718
+ join_pool: Dict[str, Any] = await client.pw_join_pool(
719
+ wallet_id,
720
+ pool_ph,
721
+ "https://pool.example.com",
722
+ uint32(10),
723
+ uint64(fee),
724
+ )
725
+ assert join_pool["success"]
726
+ join_pool_tx: TransactionRecord = join_pool["transaction"]
727
+ assert join_pool_tx is not None
728
+ await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx])
729
+
730
+ join_pool_2: Dict[str, Any] = await client.pw_join_pool(
731
+ wallet_id_2, pool_ph, "https://pool.example.com", uint32(10), uint64(fee)
732
+ )
733
+ assert join_pool_2["success"]
734
+ join_pool_tx_2: TransactionRecord = join_pool_2["transaction"]
735
+ for r in join_pool_tx.removals:
736
+ assert r not in join_pool_tx_2.removals
737
+ assert join_pool_tx_2 is not None
738
+ await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx_2])
739
+
740
+ status = (await client.pw_status(wallet_id))[0]
741
+ status_2 = (await client.pw_status(wallet_id_2))[0]
742
+
743
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
744
+ assert status.target is not None
745
+ assert status.target.state == PoolSingletonState.FARMING_TO_POOL.value
746
+ assert status_2.current.state == PoolSingletonState.SELF_POOLING.value
747
+ assert status_2.target is not None
748
+ assert status_2.target.state == PoolSingletonState.FARMING_TO_POOL.value
749
+
750
+ await full_node_api.process_transaction_records(records=[join_pool_tx, join_pool_tx_2])
751
+
752
+ async def status_is_farming_to_pool(w_id: int) -> bool:
753
+ pw_status: PoolWalletInfo = (await client.pw_status(w_id))[0]
754
+ return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
755
+
756
+ await time_out_assert(20, status_is_farming_to_pool, True, wallet_id)
757
+ await time_out_assert(20, status_is_farming_to_pool, True, wallet_id_2)
758
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
759
+
760
+ @pytest.mark.anyio
761
+ async def test_leave_pool(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
762
+ """This tests self-pooling -> pooling -> escaping -> self pooling"""
763
+ full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
764
+ pool_ph = bytes32([0] * 32)
765
+
766
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
767
+
768
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
769
+
770
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
771
+ our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
772
+ )
773
+
774
+ await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
775
+
776
+ await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
777
+ assert not full_node_api.txs_in_mempool(txs=[creation_tx])
778
+
779
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
780
+
781
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
782
+ assert len(summaries_response) == 1
783
+ wallet_id: int = summaries_response[0]["id"]
784
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
785
+
786
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
787
+ assert status.target is None
788
+
789
+ join_pool_tx: TransactionRecord = (
790
+ await client.pw_join_pool(
791
+ wallet_id,
792
+ pool_ph,
793
+ "https://pool.example.com",
794
+ uint32(5),
795
+ fee,
796
+ )
797
+ )["transaction"]
798
+ assert join_pool_tx is not None
799
+
800
+ status = (await client.pw_status(wallet_id))[0]
801
+
802
+ assert status.current.state == PoolSingletonState.SELF_POOLING.value
803
+ assert status.current.pool_url == ""
804
+ assert status.current.relative_lock_height == 0
805
+ assert status.current.state == 1
806
+ assert status.current.version == 1
807
+
808
+ assert status.target
809
+ assert status.target.pool_url == "https://pool.example.com"
810
+ assert status.target.relative_lock_height == 5
811
+ assert status.target.state == 3
812
+ assert status.target.version == 1
813
+
814
+ async def status_is_farming_to_pool() -> bool:
815
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
816
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
817
+ return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
818
+
819
+ await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_farming_to_pool)
820
+
821
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
822
+
823
+ leave_pool_tx: Dict[str, Any] = await client.pw_self_pool(wallet_id, uint64(fee))
824
+ assert leave_pool_tx["transaction"].wallet_id == wallet_id
825
+ assert leave_pool_tx["transaction"].amount == 1
826
+ await full_node_api.wait_transaction_records_entered_mempool(records=leave_pool_tx["transactions"])
827
+
828
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
829
+
830
+ async def status_is_leaving() -> bool:
831
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
832
+ return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
833
+
834
+ await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_leaving)
835
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
836
+
837
+ async def status_is_self_pooling() -> bool:
838
+ # Farm enough blocks to wait for relative_lock_height
839
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
840
+ log.warning(f"PW status state: {pw_status.current}")
841
+ return pw_status.current.state == PoolSingletonState.SELF_POOLING.value
842
+
843
+ # pass the relative lock height, this will trigger a tx.
844
+ await full_node_api.farm_blocks_to_puzzlehash(count=4, farm_to=our_ph, guarantee_transaction_blocks=True)
845
+
846
+ # Farm the TX
847
+ for i in range(20):
848
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
849
+ await asyncio.sleep(1)
850
+ if await status_is_self_pooling():
851
+ break
852
+
853
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
854
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
855
+
856
+ await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_self_pooling)
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_change_pools(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
861
+ """This tests Pool A -> escaping -> Pool B"""
862
+ full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
863
+ pool_a_ph = bytes32([0] * 32)
864
+ pool_b_ph = bytes32([0] * 32)
865
+
866
+ WAIT_SECS = 200
867
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
868
+
869
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
870
+
871
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
872
+ pool_a_ph, "https://pool-a.org", uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
873
+ )
874
+
875
+ await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
876
+
877
+ await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
878
+ assert not full_node_api.txs_in_mempool(txs=[creation_tx])
879
+
880
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
881
+
882
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
883
+ assert len(summaries_response) == 1
884
+ wallet_id: int = summaries_response[0]["id"]
885
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
886
+
887
+ assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
888
+ assert status.target is None
889
+
890
+ async def status_is_farming_to_pool() -> bool:
891
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
892
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
893
+ return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
894
+
895
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_farming_to_pool)
896
+
897
+ pw_info: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
898
+ assert pw_info.current.pool_url == "https://pool-a.org"
899
+ assert pw_info.current.relative_lock_height == 5
900
+
901
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
902
+ join_pool_tx: TransactionRecord = (
903
+ await client.pw_join_pool(
904
+ wallet_id,
905
+ pool_b_ph,
906
+ "https://pool-b.org",
907
+ uint32(10),
908
+ uint64(fee),
909
+ )
910
+ )["transaction"]
911
+ assert join_pool_tx is not None
912
+
913
+ async def status_is_leaving() -> 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.LEAVING_POOL.value
917
+
918
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving)
919
+ pw_info = (await client.pw_status(wallet_id))[0]
920
+
921
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_farming_to_pool)
922
+ pw_info = (await client.pw_status(wallet_id))[0]
923
+ assert pw_info.current.pool_url == "https://pool-b.org"
924
+ assert pw_info.current.relative_lock_height == 10
925
+ assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
926
+
927
+ @pytest.mark.anyio
928
+ async def test_change_pools_reorg(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
929
+ """This tests Pool A -> escaping -> reorg -> escaping -> Pool B"""
930
+ full_node_api, wallet_node, our_ph, total_block_rewards, client = setup
931
+ pool_a_ph = bytes32([0] * 32)
932
+ pool_b_ph = bytes32([0] * 32)
933
+ WAIT_SECS = 30
934
+
935
+ assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
936
+
937
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
938
+
939
+ creation_tx: TransactionRecord = await client.create_new_pool_wallet(
940
+ pool_a_ph, "https://pool-a.org", uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", uint64(fee)
941
+ )
942
+
943
+ await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
944
+
945
+ await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
946
+ assert not full_node_api.txs_in_mempool(txs=[creation_tx])
947
+
948
+ await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
949
+
950
+ summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
951
+ assert len(summaries_response) == 1
952
+ wallet_id: int = summaries_response[0]["id"]
953
+ status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
954
+
955
+ assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
956
+ assert status.target is None
957
+
958
+ async def status_is_farming_to_pool() -> bool:
959
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
960
+ return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
961
+
962
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_farming_to_pool)
963
+
964
+ pw_info: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
965
+ assert pw_info.current.pool_url == "https://pool-a.org"
966
+ assert pw_info.current.relative_lock_height == 5
967
+
968
+ join_pool_txs: List[TransactionRecord] = (
969
+ await client.pw_join_pool(
970
+ wallet_id,
971
+ pool_b_ph,
972
+ "https://pool-b.org",
973
+ uint32(10),
974
+ uint64(fee),
975
+ )
976
+ )["transactions"]
977
+ await full_node_api.wait_transaction_records_entered_mempool(records=join_pool_txs)
978
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
979
+
980
+ async def status_is_leaving_no_blocks() -> bool:
981
+ pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
982
+ return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
983
+
984
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
985
+
986
+ current_blocks = await full_node_api.get_all_full_blocks()
987
+ more_blocks = full_node_api.bt.get_consecutive_blocks(
988
+ 3,
989
+ farmer_reward_puzzle_hash=pool_a_ph,
990
+ pool_reward_puzzle_hash=pool_b_ph,
991
+ block_list_input=current_blocks[:-1],
992
+ force_overflow=True,
993
+ guarantee_transaction_block=True,
994
+ seed=32 * b"4",
995
+ transaction_data=next(tx.spend_bundle for tx in join_pool_txs if tx.spend_bundle is not None),
996
+ )
997
+
998
+ for block in more_blocks[-3:]:
999
+ await full_node_api.full_node.add_block(block)
1000
+
1001
+ await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
1002
+
1003
+ for i in range(50):
1004
+ await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
1005
+ await asyncio.sleep(1)
1006
+ if await status_is_farming_to_pool():
1007
+ break
1008
+
1009
+ # Eventually, leaves pool
1010
+ assert await status_is_farming_to_pool()