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,617 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import contextlib
5
+ import functools
6
+ from dataclasses import dataclass, field, replace
7
+ from pathlib import Path
8
+ from shutil import copy
9
+ from typing import Any, AsyncIterator, Callable, List, Optional, Tuple
10
+
11
+ import pytest
12
+ from chia_rs import G1Element
13
+
14
+ from chia._tests.plot_sync.util import start_harvester_service
15
+ from chia._tests.plotting.test_plot_manager import Directory, MockPlotInfo
16
+ from chia._tests.plotting.util import get_test_plots
17
+ from chia._tests.util.split_managers import SplitAsyncManager, split_async_manager
18
+ from chia._tests.util.time_out_assert import time_out_assert
19
+ from chia.farmer.farmer import Farmer
20
+ from chia.harvester.harvester import Harvester
21
+ from chia.plot_sync.delta import Delta, PathListDelta, PlotListDelta
22
+ from chia.plot_sync.receiver import Receiver
23
+ from chia.plot_sync.sender import Sender
24
+ from chia.plot_sync.util import Constants, State
25
+ from chia.plotting.manager import PlotManager
26
+ from chia.plotting.util import add_plot_directory, remove_plot_directory
27
+ from chia.protocols.harvester_protocol import Plot
28
+ from chia.protocols.protocol_message_types import ProtocolMessageTypes
29
+ from chia.simulator.block_tools import BlockTools
30
+ from chia.types.aliases import FarmerService, HarvesterService
31
+ from chia.types.blockchain_format.sized_bytes import bytes32
32
+ from chia.util.config import create_default_chia_config, lock_and_load_config, save_config
33
+ from chia.util.ints import uint8, uint32, uint64
34
+ from chia.util.streamable import _T_Streamable
35
+
36
+
37
+ def synced(sender: Sender, receiver: Receiver, previous_last_sync_id: int) -> bool:
38
+ return (
39
+ sender._last_sync_id != previous_last_sync_id
40
+ and sender._last_sync_id == receiver._last_sync.sync_id != 0
41
+ and receiver.current_sync().state == State.idle
42
+ and not sender.sync_active()
43
+ )
44
+
45
+
46
+ def assert_path_list_matches(expected_list: List[str], actual_list: List[str]) -> None:
47
+ assert len(expected_list) == len(actual_list)
48
+ for item in expected_list:
49
+ assert str(item) in actual_list
50
+
51
+
52
+ @dataclass
53
+ class ExpectedResult:
54
+ valid_count: int = 0
55
+ valid_delta: PlotListDelta = field(default_factory=PlotListDelta)
56
+ invalid_count: int = 0
57
+ invalid_delta: PathListDelta = field(default_factory=PathListDelta)
58
+ keys_missing_count: int = 0
59
+ keys_missing_delta: PathListDelta = field(default_factory=PathListDelta)
60
+ duplicates_count: int = 0
61
+ duplicates_delta: PathListDelta = field(default_factory=PathListDelta)
62
+ callback_passed: bool = False
63
+
64
+ def add_valid(self, list_plots: List[MockPlotInfo]) -> None:
65
+ def create_mock_plot(info: MockPlotInfo) -> Plot:
66
+ return Plot(
67
+ info.prover.get_filename(),
68
+ uint8(0),
69
+ bytes32(b"\x00" * 32),
70
+ None,
71
+ None,
72
+ G1Element(),
73
+ uint64(0),
74
+ uint64(0),
75
+ uint8(0),
76
+ )
77
+
78
+ self.valid_count += len(list_plots)
79
+ self.valid_delta.additions.update({x.prover.get_filename(): create_mock_plot(x) for x in list_plots})
80
+
81
+ def remove_valid(self, list_paths: List[Path]) -> None:
82
+ self.valid_count -= len(list_paths)
83
+ self.valid_delta.removals += [str(x) for x in list_paths]
84
+
85
+ def add_invalid(self, list_paths: List[Path]) -> None:
86
+ self.invalid_count += len(list_paths)
87
+ self.invalid_delta.additions += [str(x) for x in list_paths]
88
+
89
+ def remove_invalid(self, list_paths: List[Path]) -> None:
90
+ self.invalid_count -= len(list_paths)
91
+ self.invalid_delta.removals += [str(x) for x in list_paths]
92
+
93
+ def add_keys_missing(self, list_paths: List[Path]) -> None:
94
+ self.keys_missing_count += len(list_paths)
95
+ self.keys_missing_delta.additions += [str(x) for x in list_paths]
96
+
97
+ def remove_keys_missing(self, list_paths: List[Path]) -> None:
98
+ self.keys_missing_count -= len(list_paths)
99
+ self.keys_missing_delta.removals += [str(x) for x in list_paths]
100
+
101
+ def add_duplicates(self, list_paths: List[Path]) -> None:
102
+ self.duplicates_count += len(list_paths)
103
+ self.duplicates_delta.additions += [str(x) for x in list_paths]
104
+
105
+ def remove_duplicates(self, list_paths: List[Path]) -> None:
106
+ self.duplicates_count -= len(list_paths)
107
+ self.duplicates_delta.removals += [str(x) for x in list_paths]
108
+
109
+
110
+ @dataclass
111
+ class Environment:
112
+ root_path: Path
113
+ harvester_services: List[HarvesterService]
114
+ farmer_service: FarmerService
115
+ harvesters: List[Harvester]
116
+ farmer: Farmer
117
+ dir_1: Directory
118
+ dir_2: Directory
119
+ dir_3: Directory
120
+ dir_4: Directory
121
+ dir_invalid: Directory
122
+ dir_keys_missing: Directory
123
+ dir_duplicates: Directory
124
+ expected: List[ExpectedResult]
125
+ split_farmer_service_manager: SplitAsyncManager[FarmerService]
126
+ split_harvester_managers: List[SplitAsyncManager[Harvester]]
127
+
128
+ def get_harvester(self, peer_id: bytes32) -> Optional[Harvester]:
129
+ for harvester in self.harvesters:
130
+ assert harvester.server is not None
131
+ if harvester.server.node_id == peer_id:
132
+ return harvester
133
+ return None
134
+
135
+ def add_directory(self, harvester_index: int, directory: Directory, state: State = State.loaded) -> None:
136
+ try:
137
+ add_plot_directory(self.harvesters[harvester_index].root_path, str(directory.path))
138
+ except ValueError:
139
+ pass
140
+ if state == State.loaded:
141
+ self.expected[harvester_index].add_valid(directory.plot_info_list())
142
+ elif state == State.invalid:
143
+ self.expected[harvester_index].add_invalid(directory.path_list())
144
+ elif state == State.keys_missing:
145
+ self.expected[harvester_index].add_keys_missing(directory.path_list())
146
+ elif state == State.duplicates:
147
+ self.expected[harvester_index].add_duplicates(directory.path_list())
148
+ else:
149
+ assert False, "Invalid state"
150
+
151
+ def remove_directory(self, harvester_index: int, directory: Directory, state: State = State.removed) -> None:
152
+ remove_plot_directory(self.harvesters[harvester_index].root_path, str(directory.path))
153
+ if state == State.removed:
154
+ self.expected[harvester_index].remove_valid(directory.path_list())
155
+ elif state == State.invalid:
156
+ self.expected[harvester_index].remove_invalid(directory.path_list())
157
+ elif state == State.keys_missing:
158
+ self.expected[harvester_index].remove_keys_missing(directory.path_list())
159
+ elif state == State.duplicates:
160
+ self.expected[harvester_index].remove_duplicates(directory.path_list())
161
+ else:
162
+ assert False, "Invalid state"
163
+
164
+ def add_all_directories(self, harvester_index: int) -> None:
165
+ self.add_directory(harvester_index, self.dir_1)
166
+ self.add_directory(harvester_index, self.dir_2)
167
+ self.add_directory(harvester_index, self.dir_3)
168
+ self.add_directory(harvester_index, self.dir_4)
169
+ self.add_directory(harvester_index, self.dir_keys_missing, State.keys_missing)
170
+ self.add_directory(harvester_index, self.dir_invalid, State.invalid)
171
+ # Note: This does not add dir_duplicates since its important that the duplicated plots are loaded after the
172
+ # the original ones.
173
+ # self.add_directory(harvester_index, self.dir_duplicates, State.duplicates)
174
+
175
+ def remove_all_directories(self, harvester_index: int) -> None:
176
+ self.remove_directory(harvester_index, self.dir_1)
177
+ self.remove_directory(harvester_index, self.dir_2)
178
+ self.remove_directory(harvester_index, self.dir_3)
179
+ self.remove_directory(harvester_index, self.dir_4)
180
+ self.remove_directory(harvester_index, self.dir_keys_missing, State.keys_missing)
181
+ self.remove_directory(harvester_index, self.dir_invalid, State.invalid)
182
+ self.remove_directory(harvester_index, self.dir_duplicates, State.duplicates)
183
+
184
+ async def plot_sync_callback(self, peer_id: bytes32, delta: Optional[Delta]) -> None:
185
+ if delta is None:
186
+ return
187
+ harvester: Optional[Harvester] = self.get_harvester(peer_id)
188
+ assert harvester is not None
189
+ expected = self.expected[self.harvesters.index(harvester)]
190
+ assert len(expected.valid_delta.additions) == len(delta.valid.additions)
191
+ for path, plot_info in expected.valid_delta.additions.items():
192
+ assert path in delta.valid.additions
193
+ plot = harvester.plot_manager.plots.get(Path(path), None)
194
+ assert plot is not None
195
+ assert plot.prover.get_filename() == delta.valid.additions[path].filename
196
+ assert plot.prover.get_size() == delta.valid.additions[path].size
197
+ assert plot.prover.get_id() == delta.valid.additions[path].plot_id
198
+ assert plot.prover.get_compression_level() == delta.valid.additions[path].compression_level
199
+ assert plot.pool_public_key == delta.valid.additions[path].pool_public_key
200
+ assert plot.pool_contract_puzzle_hash == delta.valid.additions[path].pool_contract_puzzle_hash
201
+ assert plot.plot_public_key == delta.valid.additions[path].plot_public_key
202
+ assert plot.file_size == delta.valid.additions[path].file_size
203
+ assert int(plot.time_modified) == delta.valid.additions[path].time_modified
204
+
205
+ assert_path_list_matches(expected.valid_delta.removals, delta.valid.removals)
206
+ assert_path_list_matches(expected.invalid_delta.additions, delta.invalid.additions)
207
+ assert_path_list_matches(expected.invalid_delta.removals, delta.invalid.removals)
208
+ assert_path_list_matches(expected.keys_missing_delta.additions, delta.keys_missing.additions)
209
+ assert_path_list_matches(expected.keys_missing_delta.removals, delta.keys_missing.removals)
210
+ assert_path_list_matches(expected.duplicates_delta.additions, delta.duplicates.additions)
211
+ assert_path_list_matches(expected.duplicates_delta.removals, delta.duplicates.removals)
212
+ expected.valid_delta.clear()
213
+ expected.invalid_delta.clear()
214
+ expected.keys_missing_delta.clear()
215
+ expected.duplicates_delta.clear()
216
+ expected.callback_passed = True
217
+
218
+ async def run_sync_test(self) -> None:
219
+ plot_manager: PlotManager
220
+ assert len(self.harvesters) == len(self.expected)
221
+ last_sync_ids: List[uint64] = []
222
+ # Run the test in two steps, first trigger the refresh on both harvesters
223
+ for harvester in self.harvesters:
224
+ plot_manager = harvester.plot_manager
225
+ assert harvester.server is not None
226
+ receiver = self.farmer.plot_sync_receivers[harvester.server.node_id]
227
+ # Make sure to reset the passed flag always before a new run
228
+ self.expected[self.harvesters.index(harvester)].callback_passed = False
229
+ receiver._update_callback = self.plot_sync_callback
230
+ assert harvester.plot_sync_sender._last_sync_id == receiver._last_sync.sync_id
231
+ last_sync_ids.append(harvester.plot_sync_sender._last_sync_id)
232
+ plot_manager.start_refreshing()
233
+ plot_manager.trigger_refresh()
234
+ # Then wait for them to be synced with the farmer and validate them
235
+ for harvester in self.harvesters:
236
+ plot_manager = harvester.plot_manager
237
+ assert harvester.server is not None
238
+ receiver = self.farmer.plot_sync_receivers[harvester.server.node_id]
239
+ await time_out_assert(20, plot_manager.needs_refresh, value=False)
240
+ harvester_index = self.harvesters.index(harvester)
241
+ await time_out_assert(
242
+ 10, synced, True, harvester.plot_sync_sender, receiver, last_sync_ids[harvester_index]
243
+ )
244
+ expected = self.expected[harvester_index]
245
+ assert plot_manager.plot_count() == len(receiver.plots()) == expected.valid_count
246
+ assert len(plot_manager.failed_to_open_filenames) == len(receiver.invalid()) == expected.invalid_count
247
+ assert len(plot_manager.no_key_filenames) == len(receiver.keys_missing()) == expected.keys_missing_count
248
+ assert len(plot_manager.get_duplicates()) == len(receiver.duplicates()) == expected.duplicates_count
249
+ assert expected.callback_passed
250
+ assert expected.valid_delta.empty()
251
+ assert expected.invalid_delta.empty()
252
+ assert expected.keys_missing_delta.empty()
253
+ assert expected.duplicates_delta.empty()
254
+ for path, plot_info in plot_manager.plots.items():
255
+ assert str(path) in receiver.plots()
256
+ assert plot_info.prover.get_filename() == receiver.plots()[str(path)].filename
257
+ assert plot_info.prover.get_size() == receiver.plots()[str(path)].size
258
+ assert plot_info.prover.get_id() == receiver.plots()[str(path)].plot_id
259
+ assert plot_info.prover.get_compression_level() == receiver.plots()[str(path)].compression_level
260
+ assert plot_info.pool_public_key == receiver.plots()[str(path)].pool_public_key
261
+ assert plot_info.pool_contract_puzzle_hash == receiver.plots()[str(path)].pool_contract_puzzle_hash
262
+ assert plot_info.plot_public_key == receiver.plots()[str(path)].plot_public_key
263
+ assert plot_info.file_size == receiver.plots()[str(path)].file_size
264
+ assert int(plot_info.time_modified) == receiver.plots()[str(path)].time_modified
265
+ for path in plot_manager.failed_to_open_filenames:
266
+ assert str(path) in receiver.invalid()
267
+ for path in plot_manager.no_key_filenames:
268
+ assert str(path) in receiver.keys_missing()
269
+ for path in plot_manager.get_duplicates():
270
+ assert str(path) in receiver.duplicates()
271
+
272
+ async def handshake_done(self, index: int) -> bool:
273
+ return (
274
+ self.harvesters[index].plot_manager._refresh_thread is not None
275
+ and len(self.harvesters[index].plot_manager.farmer_public_keys) > 0
276
+ )
277
+
278
+
279
+ @pytest.fixture(scope="function")
280
+ async def environment(
281
+ tmp_path: Path,
282
+ farmer_two_harvester_not_started: Tuple[List[HarvesterService], FarmerService, BlockTools],
283
+ ) -> AsyncIterator[Environment]:
284
+ def new_test_dir(name: str, plot_list: List[Path]) -> Directory:
285
+ return Directory(tmp_path / "plots" / name, plot_list)
286
+
287
+ plots: List[Path] = get_test_plots()
288
+ plots_invalid: List[Path] = get_test_plots()[0:3]
289
+ plots_keys_missing: List[Path] = get_test_plots("not_in_keychain")
290
+ # Create 4 directories where: dir_n contains n plots
291
+ directories: List[Directory] = []
292
+ offset: int = 0
293
+ while len(directories) < 4:
294
+ dir_number = len(directories) + 1
295
+ directories.append(new_test_dir(f"{dir_number}", plots[offset : offset + dir_number]))
296
+ offset += dir_number
297
+
298
+ dir_invalid: Directory = new_test_dir("invalid", plots_invalid)
299
+ dir_keys_missing: Directory = new_test_dir("keys_missing", plots_keys_missing)
300
+ dir_duplicates: Directory = new_test_dir("duplicates", directories[3].plots)
301
+ create_default_chia_config(tmp_path)
302
+
303
+ # Invalidate the plots in `dir_invalid`
304
+ for path in dir_invalid.path_list():
305
+ with open(path, "wb") as file:
306
+ file.write(bytes(100))
307
+
308
+ harvester_services, farmer_service, bt = farmer_two_harvester_not_started
309
+ farmer_service.reconnect_retry_seconds = 1
310
+ farmer: Farmer = farmer_service._node
311
+ async with split_async_manager(manager=farmer_service.manage(), object=farmer_service) as split_farmer_manager:
312
+ await split_farmer_manager.enter()
313
+ async with contextlib.AsyncExitStack() as async_exit_stack:
314
+ split_harvester_managers = [
315
+ await async_exit_stack.enter_async_context(start_harvester_service(service, farmer_service))
316
+ for service in harvester_services
317
+ ]
318
+ harvesters = [manager.object for manager in split_harvester_managers]
319
+ for harvester in harvesters:
320
+ # Remove default plot directory for this tests
321
+ with lock_and_load_config(harvester.root_path, "config.yaml") as config:
322
+ config["harvester"]["plot_directories"] = []
323
+ save_config(harvester.root_path, "config.yaml", config)
324
+ harvester.plot_manager.set_public_keys(
325
+ bt.plot_manager.farmer_public_keys.copy(), bt.plot_manager.pool_public_keys.copy()
326
+ )
327
+
328
+ assert len(farmer.plot_sync_receivers) == 2
329
+
330
+ yield Environment(
331
+ tmp_path,
332
+ harvester_services,
333
+ farmer_service,
334
+ harvesters,
335
+ farmer,
336
+ directories[0],
337
+ directories[1],
338
+ directories[2],
339
+ directories[3],
340
+ dir_invalid,
341
+ dir_keys_missing,
342
+ dir_duplicates,
343
+ [ExpectedResult() for _ in harvesters],
344
+ split_farmer_service_manager=split_farmer_manager,
345
+ split_harvester_managers=split_harvester_managers,
346
+ )
347
+
348
+
349
+ @pytest.mark.anyio
350
+ async def test_sync_valid(environment: Environment) -> None:
351
+ env: Environment = environment
352
+ env.add_directory(0, env.dir_1)
353
+ env.add_directory(1, env.dir_2)
354
+ await env.run_sync_test()
355
+ # Run again two times to make sure we still get the same results in repeated refresh intervals
356
+ env.expected[0].valid_delta.clear()
357
+ env.expected[1].valid_delta.clear()
358
+ await env.run_sync_test()
359
+ await env.run_sync_test()
360
+ env.add_directory(0, env.dir_3)
361
+ env.add_directory(1, env.dir_4)
362
+ await env.run_sync_test()
363
+ while len(env.dir_3.path_list()):
364
+ drop_plot = env.dir_3.path_list()[0]
365
+ drop_plot.unlink()
366
+ env.dir_3.drop(drop_plot)
367
+ env.expected[0].remove_valid([drop_plot])
368
+ await env.run_sync_test()
369
+ env.remove_directory(0, env.dir_3)
370
+ await env.run_sync_test()
371
+ env.remove_directory(1, env.dir_4)
372
+ await env.run_sync_test()
373
+ env.remove_directory(0, env.dir_1)
374
+ env.remove_directory(1, env.dir_2)
375
+ await env.run_sync_test()
376
+
377
+
378
+ @pytest.mark.anyio
379
+ async def test_sync_invalid(environment: Environment) -> None:
380
+ env: Environment = environment
381
+ assert len(env.farmer.plot_sync_receivers) == 2
382
+ # Use dir_3 and dir_4 in this test because the invalid plots are copies from dir_1 + dir_2
383
+ env.add_directory(0, env.dir_3)
384
+ env.add_directory(0, env.dir_invalid, State.invalid)
385
+ env.add_directory(1, env.dir_4)
386
+ await env.run_sync_test()
387
+ # Run again two times to make sure we still get the same results in repeated refresh intervals
388
+ await env.run_sync_test()
389
+ await env.run_sync_test()
390
+ # Drop all but two of the invalid plots
391
+ assert len(env.dir_invalid) > 2
392
+ for _ in range(len(env.dir_invalid) - 2):
393
+ drop_plot = env.dir_invalid.path_list()[0]
394
+ drop_plot.unlink()
395
+ env.dir_invalid.drop(drop_plot)
396
+ env.expected[0].remove_invalid([drop_plot])
397
+ await env.run_sync_test()
398
+ assert len(env.dir_invalid) == 2
399
+ # Add the directory to the first harvester too
400
+ env.add_directory(1, env.dir_invalid, State.invalid)
401
+ await env.run_sync_test()
402
+ # Recover one the remaining invalid plot
403
+ for path in get_test_plots():
404
+ if path.name == env.dir_invalid.path_list()[0].name:
405
+ copy(path, env.dir_invalid.path)
406
+ for i in range(len(env.harvesters)):
407
+ env.expected[i].add_valid([env.dir_invalid.plot_info_list()[0]])
408
+ env.expected[i].remove_invalid([env.dir_invalid.path_list()[0]])
409
+ env.harvesters[i].plot_manager.refresh_parameter = replace(
410
+ env.harvesters[i].plot_manager.refresh_parameter, retry_invalid_seconds=uint32(0)
411
+ )
412
+ await env.run_sync_test()
413
+ for i in [0, 1]:
414
+ remove_plot_directory(env.harvesters[i].root_path, str(env.dir_invalid.path))
415
+ env.expected[i].remove_valid([env.dir_invalid.path_list()[0]])
416
+ env.expected[i].remove_invalid([env.dir_invalid.path_list()[1]])
417
+ await env.run_sync_test()
418
+
419
+
420
+ @pytest.mark.anyio
421
+ async def test_sync_keys_missing(environment: Environment) -> None:
422
+ env: Environment = environment
423
+ env.add_directory(0, env.dir_1)
424
+ env.add_directory(0, env.dir_keys_missing, State.keys_missing)
425
+ env.add_directory(1, env.dir_2)
426
+ await env.run_sync_test()
427
+ # Run again two times to make sure we still get the same results in repeated refresh intervals
428
+ await env.run_sync_test()
429
+ await env.run_sync_test()
430
+ # Drop all but 2 plots with missing keys and test sync inbetween
431
+ assert len(env.dir_keys_missing) > 2
432
+ for _ in range(len(env.dir_keys_missing) - 2):
433
+ drop_plot = env.dir_keys_missing.path_list()[0]
434
+ drop_plot.unlink()
435
+ env.dir_keys_missing.drop(drop_plot)
436
+ env.expected[0].remove_keys_missing([drop_plot])
437
+ await env.run_sync_test()
438
+ assert len(env.dir_keys_missing) == 2
439
+ # Add the plots with missing keys to the other harvester
440
+ env.add_directory(0, env.dir_3)
441
+ env.add_directory(1, env.dir_keys_missing, State.keys_missing)
442
+ await env.run_sync_test()
443
+ # Add the missing keys to the first harvester's plot manager
444
+ env.harvesters[0].plot_manager.farmer_public_keys.append(G1Element())
445
+ env.harvesters[0].plot_manager.pool_public_keys.append(G1Element())
446
+ # And validate they become valid now
447
+ env.expected[0].add_valid(env.dir_keys_missing.plot_info_list())
448
+ env.expected[0].remove_keys_missing(env.dir_keys_missing.path_list())
449
+ await env.run_sync_test()
450
+ # Drop the valid plots from one harvester and the keys missing plots from the other harvester
451
+ env.remove_directory(0, env.dir_keys_missing)
452
+ env.remove_directory(1, env.dir_keys_missing, State.keys_missing)
453
+ await env.run_sync_test()
454
+
455
+
456
+ @pytest.mark.anyio
457
+ async def test_sync_duplicates(environment: Environment) -> None:
458
+ env: Environment = environment
459
+ # dir_4 and then dir_duplicates contain the same plots. Load dir_4 first to make sure the plots seen as duplicates
460
+ # are from dir_duplicates.
461
+ env.add_directory(0, env.dir_4)
462
+ await env.run_sync_test()
463
+ env.add_directory(0, env.dir_duplicates, State.duplicates)
464
+ env.add_directory(1, env.dir_2)
465
+ await env.run_sync_test()
466
+ # Run again two times to make sure we still get the same results in repeated refresh intervals
467
+ await env.run_sync_test()
468
+ await env.run_sync_test()
469
+ # Drop all but 1 duplicates and test sync in-between
470
+ assert len(env.dir_duplicates) > 2
471
+ for _ in range(len(env.dir_duplicates) - 2):
472
+ drop_plot = env.dir_duplicates.path_list()[0]
473
+ drop_plot.unlink()
474
+ env.dir_duplicates.drop(drop_plot)
475
+ env.expected[0].remove_duplicates([drop_plot])
476
+ await env.run_sync_test()
477
+ assert len(env.dir_duplicates) == 2
478
+ # Removing dir_4 now leads to the plots in dir_duplicates to become loaded instead
479
+ env.remove_directory(0, env.dir_4)
480
+ env.expected[0].remove_duplicates(env.dir_duplicates.path_list())
481
+ env.expected[0].add_valid(env.dir_duplicates.plot_info_list())
482
+ await env.run_sync_test()
483
+
484
+
485
+ async def add_and_validate_all_directories(env: Environment) -> None:
486
+ # Add all available directories to both harvesters and make sure they load and get synced
487
+ env.add_all_directories(0)
488
+ env.add_all_directories(1)
489
+ await env.run_sync_test()
490
+ env.add_directory(0, env.dir_duplicates, State.duplicates)
491
+ env.add_directory(1, env.dir_duplicates, State.duplicates)
492
+ await env.run_sync_test()
493
+
494
+
495
+ async def remove_and_validate_all_directories(env: Environment) -> None:
496
+ # Remove all available directories to both harvesters and make sure they are removed and get synced
497
+ env.remove_all_directories(0)
498
+ env.remove_all_directories(1)
499
+ await env.run_sync_test()
500
+
501
+
502
+ @pytest.mark.anyio
503
+ async def test_add_and_remove_all_directories(environment: Environment) -> None:
504
+ await add_and_validate_all_directories(environment)
505
+ await remove_and_validate_all_directories(environment)
506
+
507
+
508
+ @pytest.mark.anyio
509
+ async def test_harvester_restart(environment: Environment) -> None:
510
+ env: Environment = environment
511
+ # Load all directories for both harvesters
512
+ await add_and_validate_all_directories(env)
513
+ # Stop the harvester and make sure the receiver gets dropped on the farmer and refreshing gets stopped
514
+ await env.split_harvester_managers[0].exit()
515
+ assert len(env.farmer.plot_sync_receivers) == 1
516
+ assert not env.harvesters[0].plot_manager._refreshing_enabled
517
+ assert not env.harvesters[0].plot_manager.needs_refresh()
518
+ # Start the harvester, wait for the handshake and make sure the receiver comes back
519
+ async with start_harvester_service(env.harvester_services[0], env.farmer_service):
520
+ await time_out_assert(5, env.handshake_done, True, 0)
521
+ assert len(env.farmer.plot_sync_receivers) == 2
522
+ # Remove the duplicates dir to avoid conflicts with the original plots
523
+ env.remove_directory(0, env.dir_duplicates)
524
+ # Reset the expected data for harvester 0 and re-add all directories because of the restart
525
+ env.expected[0] = ExpectedResult()
526
+ env.add_all_directories(0)
527
+ # Run the refresh two times and make sure everything recovers and stays recovered after harvester restart
528
+ await env.run_sync_test()
529
+ env.add_directory(0, env.dir_duplicates, State.duplicates)
530
+ await env.run_sync_test()
531
+
532
+
533
+ @pytest.mark.anyio
534
+ async def test_farmer_restart(environment: Environment) -> None:
535
+ env: Environment = environment
536
+ # Load all directories for both harvesters
537
+ await add_and_validate_all_directories(env)
538
+ last_sync_ids: List[uint64] = []
539
+ for i in range(0, len(env.harvesters)):
540
+ last_sync_ids.append(env.harvesters[i].plot_sync_sender._last_sync_id)
541
+ # Stop the farmer and make sure both receivers get dropped and refreshing gets stopped on the harvesters
542
+ await env.split_farmer_service_manager.exit()
543
+ assert len(env.farmer.plot_sync_receivers) == 0
544
+ assert not env.harvesters[0].plot_manager._refreshing_enabled
545
+ assert not env.harvesters[1].plot_manager._refreshing_enabled
546
+ # Start the farmer, wait for the handshake and make sure the receivers come back
547
+ async with env.farmer_service.manage():
548
+ await time_out_assert(5, env.handshake_done, True, 0)
549
+ await time_out_assert(5, env.handshake_done, True, 1)
550
+ assert len(env.farmer.plot_sync_receivers) == 2
551
+ # Do not use run_sync_test here, to have a more realistic test scenario just
552
+ # wait for the harvesters to be synced. The handshake should trigger re-sync.
553
+ for i in range(0, len(env.harvesters)):
554
+ harvester: Harvester = env.harvesters[i]
555
+ assert harvester.server is not None
556
+ receiver = env.farmer.plot_sync_receivers[harvester.server.node_id]
557
+ await time_out_assert(20, synced, True, harvester.plot_sync_sender, receiver, last_sync_ids[i])
558
+ # Validate the sync
559
+ for harvester in env.harvesters:
560
+ plot_manager: PlotManager = harvester.plot_manager
561
+ assert harvester.server is not None
562
+ receiver = env.farmer.plot_sync_receivers[harvester.server.node_id]
563
+ expected = env.expected[env.harvesters.index(harvester)]
564
+ assert plot_manager.plot_count() == len(receiver.plots()) == expected.valid_count
565
+ assert len(plot_manager.failed_to_open_filenames) == len(receiver.invalid()) == expected.invalid_count
566
+ assert len(plot_manager.no_key_filenames) == len(receiver.keys_missing()) == expected.keys_missing_count
567
+ assert len(plot_manager.get_duplicates()) == len(receiver.duplicates()) == expected.duplicates_count
568
+
569
+
570
+ @pytest.mark.anyio
571
+ async def test_sync_start_and_disconnect_while_sync_is_active(
572
+ farmer_one_harvester: Tuple[List[HarvesterService], FarmerService, BlockTools]
573
+ ) -> None:
574
+ harvesters, farmer_service, _ = farmer_one_harvester
575
+ harvester_service = harvesters[0]
576
+ harvester = harvester_service._node
577
+ farmer: Farmer = farmer_service._node
578
+ Constants.message_timeout = 3
579
+
580
+ async def receiver_available() -> bool:
581
+ return harvester.server.node_id in farmer.plot_sync_receivers
582
+
583
+ async def disconnecting_process(
584
+ self: Receiver, method: Callable[[_T_Streamable], Any], message_type: ProtocolMessageTypes, message: Any
585
+ ) -> None:
586
+ if self.current_sync().state == State.loaded:
587
+ harvester.plot_manager.trigger_refresh()
588
+ await asyncio.sleep(2)
589
+ await self.connection().close()
590
+ return
591
+ await original_process(method, message_type, message)
592
+
593
+ # Wait for the receiver to show up
594
+ await time_out_assert(20, receiver_available)
595
+ receiver = farmer.plot_sync_receivers[harvester.server.node_id]
596
+ # And wait until the first sync from the harvester to the farmer is done
597
+ await time_out_assert(20, receiver.initial_sync, False)
598
+ # Replace the `Receiver._process` with `disconnecting_process` which triggers a plot manager refresh and disconnects
599
+ # the farmer from the harvester during an active sync.
600
+ original_process = receiver._process
601
+ receiver._process = functools.partial(disconnecting_process, receiver) # type: ignore[method-assign]
602
+ # Trigger the refresh which leads to a new sync_start being triggered during the active sync.
603
+ harvester.plot_manager.trigger_refresh()
604
+ await time_out_assert(20, harvester.plot_sync_sender.sync_active)
605
+ # Now wait until the receiver disappears from the farmer's plot_sync_receivers which means its disconnected.
606
+ await time_out_assert(20, receiver_available, False)
607
+ # Wait until the sync was aborted
608
+ await time_out_assert(20, harvester.plot_sync_sender.sync_active, False)
609
+ # And then wait for the harvester to reconnect and the receiver to re-appear.
610
+ await time_out_assert(20, receiver_available, True)
611
+ # Make sure the receiver object has been changed because of the disconnect
612
+ assert farmer.plot_sync_receivers[harvester.server.node_id] is not receiver
613
+ receiver = farmer.plot_sync_receivers[harvester.server.node_id]
614
+ current_last_sync_id = receiver.last_sync().sync_id
615
+ # Now start another sync and wait for it to be done to make sure everything still works fine
616
+ harvester.plot_manager.trigger_refresh()
617
+ await time_out_assert(20, synced, True, harvester.plot_sync_sender, receiver, current_last_sync_id)