chia-blockchain 2.5.1rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -0,0 +1,781 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import sys
5
+ import time
6
+ from collections.abc import Iterator
7
+ from dataclasses import dataclass, replace
8
+ from os import unlink
9
+ from pathlib import Path
10
+ from shutil import copy, move
11
+ from typing import Callable, Optional, cast
12
+
13
+ import pytest
14
+ from chia_rs import G1Element
15
+
16
+ from chia._tests.plotting.util import get_test_plots
17
+ from chia._tests.util.misc import boolean_datacases
18
+ from chia._tests.util.time_out_assert import time_out_assert
19
+ from chia.plotting.cache import CURRENT_VERSION, CacheDataV1
20
+ from chia.plotting.manager import Cache, PlotManager
21
+ from chia.plotting.util import (
22
+ PlotInfo,
23
+ PlotRefreshEvents,
24
+ PlotRefreshResult,
25
+ add_plot_directory,
26
+ get_plot_directories,
27
+ remove_plot,
28
+ remove_plot_directory,
29
+ )
30
+ from chia.simulator.block_tools import get_plot_dir
31
+ from chia.util.config import create_default_chia_config, lock_and_load_config, save_config
32
+ from chia.util.ints import uint16, uint32
33
+ from chia.util.streamable import VersionedBlob
34
+
35
+ log = logging.getLogger(__name__)
36
+
37
+ # These tests are not dependent on consensus rules
38
+ pytestmark = [pytest.mark.limit_consensus_modes(reason="does not depend on consensus rules")]
39
+
40
+
41
+ @dataclass
42
+ class MockDiskProver:
43
+ filename: str
44
+
45
+ def get_filename(self) -> str:
46
+ return self.filename
47
+
48
+
49
+ @dataclass
50
+ class MockPlotInfo:
51
+ prover: MockDiskProver
52
+
53
+
54
+ class Directory:
55
+ path: Path
56
+ plots: list[Path]
57
+
58
+ def __init__(self, path: Path, plots_origin: list[Path]):
59
+ self.path = path
60
+ path.mkdir(parents=True, exist_ok=True)
61
+ # Drop the existing files in the test directories
62
+ for plot in path.iterdir():
63
+ unlink(plot)
64
+ # Copy over the original plots
65
+ for plot in plots_origin:
66
+ if not Path(path / plot.name).exists():
67
+ copy(plot, path)
68
+ # Adjust the paths to reflect the testing plots
69
+ self.plots = [path / plot.name for plot in plots_origin]
70
+
71
+ def __len__(self):
72
+ return len(self.plots)
73
+
74
+ def plot_info_list(self) -> list[MockPlotInfo]:
75
+ return [MockPlotInfo(MockDiskProver(str(x))) for x in self.plots]
76
+
77
+ def path_list(self) -> list[Path]:
78
+ return self.plots
79
+
80
+ def drop(self, path: Path):
81
+ assert self.path / path.name
82
+ del self.plots[self.plots.index(self.path / path.name)]
83
+
84
+
85
+ class PlotRefreshTester:
86
+ plot_manager: PlotManager
87
+ expected_result: PlotRefreshResult
88
+ expected_result_matched: bool
89
+
90
+ def __init__(self, root_path: Path):
91
+ self.plot_manager = PlotManager(root_path, self.refresh_callback)
92
+ # Set a very high refresh interval here to avoid unintentional refresh cycles
93
+ self.plot_manager.refresh_parameter = replace(
94
+ self.plot_manager.refresh_parameter, interval_seconds=uint32(10000)
95
+ )
96
+ # Set to the current time to avoid automated refresh after we start below.
97
+ self.plot_manager.last_refresh_time = time.time()
98
+ self.plot_manager.start_refreshing()
99
+
100
+ def refresh_callback(self, event: PlotRefreshEvents, refresh_result: PlotRefreshResult):
101
+ if event != PlotRefreshEvents.done:
102
+ # Only validate the final results for this tests
103
+ return
104
+ for name in ["loaded", "removed", "processed", "remaining"]:
105
+ try:
106
+ actual_value = refresh_result.__getattribute__(name)
107
+ if type(actual_value) is list:
108
+ expected_list = self.expected_result.__getattribute__(name)
109
+ if len(expected_list) != len(actual_value):
110
+ return
111
+ values_found = 0
112
+ for value in actual_value:
113
+ if type(value) is PlotInfo:
114
+ for plot_info in expected_list:
115
+ if plot_info.prover.get_filename() == value.prover.get_filename():
116
+ values_found += 1
117
+ continue
118
+ else:
119
+ if value in expected_list:
120
+ values_found += 1
121
+ continue
122
+ if values_found != len(expected_list):
123
+ log.error(f"{name} invalid: values_found {values_found} expected {len(expected_list)}")
124
+ return
125
+ else:
126
+ expected_value = self.expected_result.__getattribute__(name)
127
+ if actual_value != expected_value:
128
+ log.error(f"{name} invalid: actual {actual_value} expected {expected_value}")
129
+ return
130
+
131
+ except AttributeError as error:
132
+ log.error(f"{error}")
133
+ return
134
+
135
+ self.expected_result_matched = True
136
+
137
+ async def run(self, expected_result: PlotRefreshResult):
138
+ self.expected_result = expected_result
139
+ self.expected_result_matched = False
140
+ self.plot_manager.trigger_refresh()
141
+ await time_out_assert(5, self.plot_manager.needs_refresh, value=False)
142
+ assert self.expected_result_matched
143
+
144
+
145
+ @dataclass
146
+ class Environment:
147
+ root_path: Path
148
+ refresh_tester: PlotRefreshTester
149
+ dir_1: Directory
150
+ dir_2: Directory
151
+
152
+
153
+ @pytest.fixture(scope="function")
154
+ def environment(tmp_path, bt) -> Iterator[Environment]:
155
+ dir_1_count: int = 7
156
+ dir_2_count: int = 3
157
+ plots: list[Path] = get_test_plots()
158
+ assert len(plots) >= dir_1_count + dir_2_count
159
+
160
+ dir_1: Directory = Directory(tmp_path / "plots" / "1", plots[0:dir_1_count])
161
+ dir_2: Directory = Directory(tmp_path / "plots" / "2", plots[dir_1_count : dir_1_count + dir_2_count])
162
+ create_default_chia_config(tmp_path)
163
+
164
+ refresh_tester = PlotRefreshTester(tmp_path)
165
+ refresh_tester.plot_manager.set_public_keys(bt.plot_manager.farmer_public_keys, bt.plot_manager.pool_public_keys)
166
+
167
+ yield Environment(tmp_path, refresh_tester, dir_1, dir_2)
168
+
169
+ refresh_tester.plot_manager.stop_refreshing()
170
+
171
+
172
+ # Wrap `remove_plot` to give it the same interface as the other triggers, e.g. `add_plot_directory(Path, str)`.
173
+ def trigger_remove_plot(_: Path, plot_path: str):
174
+ remove_plot(Path(plot_path))
175
+
176
+
177
+ @pytest.mark.limit_consensus_modes(reason="not dependent on consensus, does not support parallel execution")
178
+ @pytest.mark.anyio
179
+ async def test_plot_refreshing(environment):
180
+ env: Environment = environment
181
+ expected_result = PlotRefreshResult()
182
+ dir_duplicates: Directory = Directory(get_plot_dir().resolve() / "duplicates", env.dir_1.plots)
183
+
184
+ async def run_test_case(
185
+ *,
186
+ trigger: Callable,
187
+ test_path: Path,
188
+ expect_loaded: list[MockPlotInfo],
189
+ expect_removed: list[Path],
190
+ expect_processed: int,
191
+ expect_duplicates: int,
192
+ expected_directories: int,
193
+ expect_total_plots: int,
194
+ ):
195
+ expected_result.loaded = cast(list[PlotInfo], expect_loaded)
196
+ expected_result.removed = expect_removed
197
+ expected_result.processed = expect_processed
198
+ trigger(env.root_path, str(test_path))
199
+ assert len(get_plot_directories(env.root_path)) == expected_directories
200
+ await env.refresh_tester.run(expected_result)
201
+ assert len(env.refresh_tester.plot_manager.plots) == expect_total_plots
202
+ assert len(env.refresh_tester.plot_manager.get_duplicates()) == expect_duplicates
203
+ assert len(env.refresh_tester.plot_manager.failed_to_open_filenames) == 0
204
+
205
+ # Add dir_1
206
+ await run_test_case(
207
+ trigger=add_plot_directory,
208
+ test_path=env.dir_1.path,
209
+ expect_loaded=env.dir_1.plot_info_list(),
210
+ expect_removed=[],
211
+ expect_processed=len(env.dir_1),
212
+ expect_duplicates=0,
213
+ expected_directories=1,
214
+ expect_total_plots=len(env.dir_1),
215
+ )
216
+
217
+ # Add dir_2
218
+ await run_test_case(
219
+ trigger=add_plot_directory,
220
+ test_path=env.dir_2.path,
221
+ expect_loaded=env.dir_2.plot_info_list(),
222
+ expect_removed=[],
223
+ expect_processed=len(env.dir_1) + len(env.dir_2),
224
+ expect_duplicates=0,
225
+ expected_directories=2,
226
+ expect_total_plots=len(env.dir_1) + len(env.dir_2),
227
+ )
228
+
229
+ # Add dir_duplicates
230
+ await run_test_case(
231
+ trigger=add_plot_directory,
232
+ test_path=dir_duplicates.path,
233
+ expect_loaded=[],
234
+ expect_removed=[],
235
+ expect_processed=len(env.dir_1) + len(env.dir_2) + len(dir_duplicates),
236
+ expect_duplicates=len(dir_duplicates),
237
+ expected_directories=3,
238
+ expect_total_plots=len(env.dir_1) + len(env.dir_2),
239
+ )
240
+ for item in dir_duplicates.path.iterdir():
241
+ assert item.is_file() and item in env.refresh_tester.plot_manager.get_duplicates()
242
+
243
+ # Drop the duplicated plot we remove in the next test case from the test directory upfront so that the numbers match
244
+ # the expected below
245
+ drop_path = dir_duplicates.plots[0]
246
+ dir_duplicates.drop(drop_path)
247
+ # Delete one duplicated plot
248
+ await run_test_case(
249
+ trigger=trigger_remove_plot,
250
+ test_path=drop_path,
251
+ expect_loaded=[],
252
+ expect_removed=[],
253
+ expect_processed=len(env.dir_1) + len(env.dir_2) + len(dir_duplicates),
254
+ expect_duplicates=len(dir_duplicates),
255
+ expected_directories=3,
256
+ expect_total_plots=len(env.dir_1) + len(env.dir_2),
257
+ )
258
+ # Drop the duplicated plot we remove in the next test case from the test directory upfront so that the numbers match
259
+ # the expected below
260
+ drop_path = env.dir_1.plots[0]
261
+ env.dir_1.drop(drop_path)
262
+ # Delete one duplicated plot
263
+ await run_test_case(
264
+ trigger=trigger_remove_plot,
265
+ test_path=drop_path,
266
+ expect_loaded=[],
267
+ expect_removed=[drop_path],
268
+ expect_processed=len(env.dir_1) + len(env.dir_2) + len(dir_duplicates),
269
+ expect_duplicates=len(dir_duplicates),
270
+ expected_directories=3,
271
+ expect_total_plots=len(env.dir_1) + len(env.dir_2),
272
+ )
273
+ # Remove directory with the duplicates
274
+ await run_test_case(
275
+ trigger=remove_plot_directory,
276
+ test_path=dir_duplicates.path,
277
+ expect_loaded=[],
278
+ expect_removed=[],
279
+ expect_processed=len(env.dir_1) + len(env.dir_2),
280
+ expect_duplicates=0,
281
+ expected_directories=2,
282
+ expect_total_plots=len(env.dir_1) + len(env.dir_2),
283
+ )
284
+ for item in dir_duplicates.path.iterdir():
285
+ assert item.is_file() and item not in env.refresh_tester.plot_manager.get_duplicates()
286
+
287
+ # Re-add the directory with the duplicates for other tests
288
+ await run_test_case(
289
+ trigger=add_plot_directory,
290
+ test_path=dir_duplicates.path,
291
+ expect_loaded=[],
292
+ expect_removed=[],
293
+ expect_processed=len(env.dir_1) + len(env.dir_2) + len(dir_duplicates),
294
+ expect_duplicates=len(dir_duplicates),
295
+ expected_directories=3,
296
+ expect_total_plots=len(env.dir_1) + len(env.dir_2),
297
+ )
298
+
299
+ # Remove dir_1 from which the duplicated plots are loaded. This removes the duplicates of dir_1
300
+ # and in the same run loads them from dir_duplicates.
301
+ await run_test_case(
302
+ trigger=remove_plot_directory,
303
+ test_path=env.dir_1.path,
304
+ expect_loaded=dir_duplicates.plot_info_list(),
305
+ expect_removed=env.dir_1.path_list(),
306
+ expect_processed=len(env.dir_2) + len(dir_duplicates),
307
+ expect_duplicates=0,
308
+ expected_directories=2,
309
+ expect_total_plots=len(env.dir_2) + len(dir_duplicates),
310
+ )
311
+
312
+ # Re-add the directory. Now the plot seen as duplicate is from dir_1, not from dir_duplicates like before
313
+ await run_test_case(
314
+ trigger=add_plot_directory,
315
+ test_path=env.dir_1.path,
316
+ expect_loaded=[],
317
+ expect_removed=[],
318
+ expect_processed=len(env.dir_1) + len(env.dir_2) + len(dir_duplicates),
319
+ expect_duplicates=len(dir_duplicates),
320
+ expected_directories=3,
321
+ expect_total_plots=len(env.dir_1) + len(env.dir_2),
322
+ )
323
+ # Drop the duplicated plot we remove in the next test case from the test directory upfront so that the numbers match
324
+ # the expected below
325
+ drop_path = env.dir_1.plots[2]
326
+ env.dir_1.drop(drop_path)
327
+ # Remove the duplicated plot
328
+ await run_test_case(
329
+ trigger=trigger_remove_plot,
330
+ test_path=drop_path,
331
+ expect_loaded=[],
332
+ expect_removed=[],
333
+ expect_processed=len(env.dir_1) + len(env.dir_2) + len(dir_duplicates),
334
+ expect_duplicates=len(env.dir_1),
335
+ expected_directories=3,
336
+ expect_total_plots=len(env.dir_2) + len(dir_duplicates),
337
+ )
338
+ # Remove dir_duplicates, this drops the duplicates and loads all plots from dir_1
339
+ await run_test_case(
340
+ trigger=remove_plot_directory,
341
+ test_path=dir_duplicates.path,
342
+ expect_loaded=env.dir_1.plot_info_list(),
343
+ expect_removed=dir_duplicates.path_list(),
344
+ expect_processed=len(env.dir_1) + len(env.dir_2),
345
+ expect_duplicates=0,
346
+ expected_directories=2,
347
+ expect_total_plots=len(env.dir_1) + len(env.dir_2),
348
+ )
349
+ # Remove dir_2
350
+ await run_test_case(
351
+ trigger=remove_plot_directory,
352
+ test_path=env.dir_2.path,
353
+ expect_loaded=[],
354
+ expect_removed=env.dir_2.path_list(),
355
+ expect_processed=len(env.dir_1),
356
+ expect_duplicates=0,
357
+ expected_directories=1,
358
+ expect_total_plots=len(env.dir_1),
359
+ )
360
+ # Remove dir_1
361
+ await run_test_case(
362
+ trigger=remove_plot_directory,
363
+ test_path=env.dir_1.path,
364
+ expect_loaded=[],
365
+ expect_removed=env.dir_1.path_list(),
366
+ expect_processed=0,
367
+ expect_duplicates=0,
368
+ expected_directories=0,
369
+ expect_total_plots=0,
370
+ )
371
+
372
+
373
+ @pytest.mark.anyio
374
+ async def test_initial_refresh_flag(environment: Environment) -> None:
375
+ env: Environment = environment
376
+ assert env.refresh_tester.plot_manager.initial_refresh()
377
+ for _ in range(2):
378
+ await env.refresh_tester.run(PlotRefreshResult())
379
+ assert not env.refresh_tester.plot_manager.initial_refresh()
380
+ env.refresh_tester.plot_manager.reset()
381
+ assert env.refresh_tester.plot_manager.initial_refresh()
382
+
383
+
384
+ @pytest.mark.anyio
385
+ async def test_invalid_plots(environment):
386
+ env: Environment = environment
387
+ expected_result = PlotRefreshResult()
388
+ # Test re-trying if processing a plot failed
389
+ # First create a backup of the plot
390
+ retry_test_plot = env.dir_1.path_list()[0].resolve()
391
+ retry_test_plot_save = Path(env.dir_1.path / ".backup").resolve()
392
+ copy(retry_test_plot, retry_test_plot_save)
393
+ # Invalidate the plot
394
+ with open(retry_test_plot, "r+b") as file:
395
+ file.write(bytes(100))
396
+ # Add it and validate it fails to load
397
+ add_plot_directory(env.root_path, str(env.dir_1.path))
398
+ expected_result.loaded = env.dir_1.plot_info_list()[1:]
399
+ expected_result.removed = []
400
+ expected_result.processed = len(env.dir_1)
401
+ expected_result.remaining = 0
402
+ await env.refresh_tester.run(expected_result)
403
+ assert len(env.refresh_tester.plot_manager.failed_to_open_filenames) == 1
404
+ assert retry_test_plot in env.refresh_tester.plot_manager.failed_to_open_filenames
405
+ # Give it a non .plot ending and make sure it gets removed from the invalid list on the next refresh
406
+ retry_test_plot_unload = Path(env.dir_1.path / ".unload").resolve()
407
+ move(retry_test_plot, retry_test_plot_unload)
408
+ expected_result.processed -= 1
409
+ expected_result.loaded = []
410
+ await env.refresh_tester.run(expected_result)
411
+ assert len(env.refresh_tester.plot_manager.failed_to_open_filenames) == 0
412
+ assert retry_test_plot not in env.refresh_tester.plot_manager.failed_to_open_filenames
413
+ # Recover the name and make sure it reappears in the invalid list
414
+ move(retry_test_plot_unload, retry_test_plot)
415
+ expected_result.processed += 1
416
+ await env.refresh_tester.run(expected_result)
417
+ assert len(env.refresh_tester.plot_manager.failed_to_open_filenames) == 1
418
+ assert retry_test_plot in env.refresh_tester.plot_manager.failed_to_open_filenames
419
+ # Make sure the file stays in `failed_to_open_filenames` and doesn't get loaded in the next refresh cycle
420
+ expected_result.loaded = []
421
+ expected_result.processed = len(env.dir_1)
422
+ await env.refresh_tester.run(expected_result)
423
+ assert len(env.refresh_tester.plot_manager.failed_to_open_filenames) == 1
424
+ assert retry_test_plot in env.refresh_tester.plot_manager.failed_to_open_filenames
425
+ # Now decrease the re-try timeout, restore the valid plot file and make sure it properly loads now
426
+ env.refresh_tester.plot_manager.refresh_parameter = replace(
427
+ env.refresh_tester.plot_manager.refresh_parameter, retry_invalid_seconds=uint32(0)
428
+ )
429
+ move(retry_test_plot_save, retry_test_plot)
430
+ expected_result.loaded = env.dir_1.plot_info_list()[0:1]
431
+ expected_result.processed = len(env.dir_1)
432
+ await env.refresh_tester.run(expected_result)
433
+ assert len(env.refresh_tester.plot_manager.failed_to_open_filenames) == 0
434
+ assert retry_test_plot not in env.refresh_tester.plot_manager.failed_to_open_filenames
435
+
436
+
437
+ @pytest.mark.anyio
438
+ async def test_keys_missing(environment: Environment) -> None:
439
+ env: Environment = environment
440
+ not_in_keychain_plots: list[Path] = get_test_plots("not_in_keychain")
441
+ dir_not_in_keychain: Directory = Directory(env.root_path / "plots" / "not_in_keychain", not_in_keychain_plots)
442
+ expected_result = PlotRefreshResult()
443
+ # The plots in "not_in_keychain" directory have infinity g1 elements as farmer/pool key so they should be plots
444
+ # with missing keys for now
445
+ add_plot_directory(env.root_path, str(dir_not_in_keychain.path))
446
+ expected_result.loaded = []
447
+ expected_result.removed = []
448
+ expected_result.processed = len(dir_not_in_keychain)
449
+ expected_result.remaining = 0
450
+ for i in range(2):
451
+ await env.refresh_tester.run(expected_result)
452
+ assert len(env.refresh_tester.plot_manager.no_key_filenames) == len(dir_not_in_keychain)
453
+ for path in env.refresh_tester.plot_manager.no_key_filenames:
454
+ assert path in dir_not_in_keychain.plots
455
+ # Delete one of the plots and make sure it gets dropped from the no key filenames list
456
+ drop_plot = dir_not_in_keychain.path_list()[0]
457
+ dir_not_in_keychain.drop(drop_plot)
458
+ drop_plot.unlink()
459
+ assert drop_plot in env.refresh_tester.plot_manager.no_key_filenames
460
+ expected_result.processed -= 1
461
+ await env.refresh_tester.run(expected_result)
462
+ assert drop_plot not in env.refresh_tester.plot_manager.no_key_filenames
463
+ # Now add the missing keys to the plot manager's key lists and make sure the plots are getting loaded
464
+ env.refresh_tester.plot_manager.farmer_public_keys.append(G1Element())
465
+ env.refresh_tester.plot_manager.pool_public_keys.append(G1Element())
466
+ expected_result.loaded = dir_not_in_keychain.plot_info_list() # type: ignore[assignment]
467
+ expected_result.processed = len(dir_not_in_keychain)
468
+ await env.refresh_tester.run(expected_result)
469
+ # And make sure they are dropped from the list of plots with missing keys
470
+ assert len(env.refresh_tester.plot_manager.no_key_filenames) == 0
471
+
472
+
473
+ @pytest.mark.anyio
474
+ async def test_plot_info_caching(environment, bt):
475
+ env: Environment = environment
476
+ expected_result = PlotRefreshResult()
477
+ add_plot_directory(env.root_path, str(env.dir_1.path))
478
+ expected_result.loaded = env.dir_1.plot_info_list()
479
+ expected_result.removed = []
480
+ expected_result.processed = len(env.dir_1)
481
+ expected_result.remaining = 0
482
+ await env.refresh_tester.run(expected_result)
483
+ assert env.refresh_tester.plot_manager.cache.path().exists()
484
+ unlink(env.refresh_tester.plot_manager.cache.path())
485
+ # Should not write the cache again on shutdown because it didn't change
486
+ assert not env.refresh_tester.plot_manager.cache.path().exists()
487
+ env.refresh_tester.plot_manager.stop_refreshing()
488
+ assert not env.refresh_tester.plot_manager.cache.path().exists()
489
+ # Manually trigger `save_cache` and make sure it creates a new cache file
490
+ env.refresh_tester.plot_manager.cache.save()
491
+ assert env.refresh_tester.plot_manager.cache.path().exists()
492
+ refresh_tester: PlotRefreshTester = PlotRefreshTester(env.root_path)
493
+ plot_manager = refresh_tester.plot_manager
494
+ plot_manager.set_public_keys(bt.plot_manager.farmer_public_keys, bt.plot_manager.pool_public_keys)
495
+ plot_manager.cache.load()
496
+ assert len(plot_manager.cache) == len(env.refresh_tester.plot_manager.cache)
497
+ for path, cache_entry in env.refresh_tester.plot_manager.cache.items():
498
+ cache_entry_new = plot_manager.cache.get(path)
499
+ assert bytes(cache_entry_new.prover) == bytes(cache_entry.prover)
500
+ assert cache_entry_new.farmer_public_key == cache_entry.farmer_public_key
501
+ assert cache_entry_new.pool_public_key == cache_entry.pool_public_key
502
+ assert cache_entry_new.pool_contract_puzzle_hash == cache_entry.pool_contract_puzzle_hash
503
+ assert cache_entry_new.plot_public_key == cache_entry.plot_public_key
504
+ await refresh_tester.run(expected_result)
505
+ for path, plot_info in env.refresh_tester.plot_manager.plots.items():
506
+ assert path in plot_manager.plots
507
+ assert plot_manager.plots[path].prover.get_filename() == plot_info.prover.get_filename()
508
+ assert plot_manager.plots[path].prover.get_id() == plot_info.prover.get_id()
509
+ assert plot_manager.plots[path].prover.get_memo() == plot_info.prover.get_memo()
510
+ assert plot_manager.plots[path].prover.get_size() == plot_info.prover.get_size()
511
+ assert plot_manager.plots[path].prover.get_compression_level() == plot_info.prover.get_compression_level()
512
+ assert plot_manager.plots[path].pool_public_key == plot_info.pool_public_key
513
+ assert plot_manager.plots[path].pool_contract_puzzle_hash == plot_info.pool_contract_puzzle_hash
514
+ assert plot_manager.plots[path].plot_public_key == plot_info.plot_public_key
515
+ assert plot_manager.plots[path].file_size == plot_info.file_size
516
+ assert plot_manager.plots[path].time_modified == plot_info.time_modified
517
+ assert plot_manager.plot_filename_paths == env.refresh_tester.plot_manager.plot_filename_paths
518
+ assert plot_manager.failed_to_open_filenames == env.refresh_tester.plot_manager.failed_to_open_filenames
519
+ assert plot_manager.no_key_filenames == env.refresh_tester.plot_manager.no_key_filenames
520
+ plot_manager.stop_refreshing()
521
+ # Modify the content of the plot_manager.dat
522
+ with open(plot_manager.cache.path(), "r+b") as file:
523
+ file.write(b"\xff\xff") # Sets Cache.version to 65535
524
+ # Make sure it just loads the plots normally if it fails to load the cache
525
+ refresh_tester: PlotRefreshTester = PlotRefreshTester(env.root_path)
526
+ plot_manager = refresh_tester.plot_manager
527
+ plot_manager.cache.load()
528
+ assert len(plot_manager.cache) == 0
529
+ plot_manager.set_public_keys(bt.plot_manager.farmer_public_keys, bt.plot_manager.pool_public_keys)
530
+ await refresh_tester.run(expected_result)
531
+ assert len(plot_manager.plots) == len(plot_manager.plots)
532
+ plot_manager.stop_refreshing()
533
+
534
+
535
+ @pytest.mark.anyio
536
+ async def test_drop_too_large_cache_entries(environment, bt):
537
+ env: Environment = environment
538
+ expected_result = PlotRefreshResult(loaded=env.dir_1.plot_info_list(), processed=len(env.dir_1))
539
+ add_plot_directory(env.root_path, str(env.dir_1.path))
540
+ await env.refresh_tester.run(expected_result)
541
+ assert env.refresh_tester.plot_manager.cache.path().exists()
542
+ assert len(env.dir_1) >= 6, "This test requires at least 6 cache entries"
543
+ # Load the cache entries
544
+ cache_path = env.refresh_tester.plot_manager.cache.path()
545
+ serialized = cache_path.read_bytes()
546
+ stored_cache: VersionedBlob = VersionedBlob.from_bytes(serialized)
547
+ cache_data: CacheDataV1 = CacheDataV1.from_bytes(stored_cache.blob)
548
+
549
+ def modify_cache_entry(index: int, additional_data: int, modify_memo: bool) -> str:
550
+ path, cache_entry = cache_data.entries[index]
551
+ prover_data = cache_entry.prover_data
552
+ # Size of length hints in chiapos serialization currently depends on the platform
553
+ size_length = 8 if sys.maxsize > 2**32 else 4
554
+ # Version
555
+ version_size = 2
556
+ version = prover_data[0:version_size]
557
+ # Filename
558
+ filename_offset = version_size + size_length
559
+ filename_length = int.from_bytes(prover_data[version_size:filename_offset], byteorder=sys.byteorder)
560
+ filename = prover_data[filename_offset : filename_offset + filename_length]
561
+ # Memo
562
+ memo_length_offset = filename_offset + filename_length
563
+ memo_length = int.from_bytes(
564
+ prover_data[memo_length_offset : memo_length_offset + size_length], byteorder=sys.byteorder
565
+ )
566
+ memo_offset = memo_length_offset + size_length
567
+ memo = prover_data[memo_offset : memo_offset + memo_length]
568
+ # id, k, table pointers, C2
569
+ remainder = prover_data[memo_offset + memo_length :]
570
+
571
+ # Add the additional data to the filename
572
+ filename_length += additional_data
573
+ filename += bytes(b"\a" * additional_data)
574
+
575
+ # Add the additional data to the memo if requested
576
+ if modify_memo:
577
+ memo_length += additional_data
578
+ memo += bytes(b"\b" * additional_data)
579
+
580
+ filename_length_bytes = filename_length.to_bytes(size_length, byteorder=sys.byteorder)
581
+ memo_length_bytes = memo_length.to_bytes(size_length, byteorder=sys.byteorder)
582
+
583
+ cache_data.entries[index] = (
584
+ path,
585
+ replace(
586
+ cache_entry,
587
+ prover_data=bytes(version + filename_length_bytes + filename + memo_length_bytes + memo + remainder),
588
+ ),
589
+ )
590
+ return path
591
+
592
+ def assert_cache(expected: list[MockPlotInfo]) -> None:
593
+ test_cache = Cache(cache_path)
594
+ assert len(test_cache) == 0
595
+ test_cache.load()
596
+ assert len(test_cache) == len(expected)
597
+ for plot_info in expected:
598
+ assert test_cache.get(Path(plot_info.prover.get_filename())) is not None
599
+
600
+ # Modify two entries, with and without memo modification, they both should remain in the cache after load
601
+ modify_cache_entry(0, 1500, modify_memo=False)
602
+ modify_cache_entry(1, 1500, modify_memo=True)
603
+
604
+ invalid_entries = [
605
+ modify_cache_entry(2, 2000, modify_memo=False),
606
+ modify_cache_entry(3, 2000, modify_memo=True),
607
+ modify_cache_entry(4, 50000, modify_memo=False),
608
+ modify_cache_entry(5, 50000, modify_memo=True),
609
+ ]
610
+
611
+ plot_infos = env.dir_1.plot_info_list()
612
+ # Make sure the cache currently contains all plots from dir1
613
+ assert_cache(plot_infos)
614
+ # Write the modified cache entries to the file
615
+ cache_path.write_bytes(bytes(VersionedBlob(uint16(CURRENT_VERSION), bytes(cache_data))))
616
+ # And now test that plots in invalid_entries are not longer loaded
617
+ assert_cache([plot_info for plot_info in plot_infos if plot_info.prover.get_filename() not in invalid_entries])
618
+
619
+
620
+ @pytest.mark.anyio
621
+ async def test_cache_lifetime(environment: Environment) -> None:
622
+ # Load a directory to produce a cache file
623
+ env: Environment = environment
624
+ expected_result = PlotRefreshResult()
625
+ add_plot_directory(env.root_path, str(env.dir_1.path))
626
+ expected_result.loaded = env.dir_1.plot_info_list() # type: ignore[assignment]
627
+ expected_result.removed = []
628
+ expected_result.processed = len(env.dir_1)
629
+ expected_result.remaining = 0
630
+ await env.refresh_tester.run(expected_result)
631
+ expected_result.loaded = []
632
+ cache_v1: Cache = env.refresh_tester.plot_manager.cache
633
+ assert len(cache_v1) > 0
634
+ count_before = len(cache_v1)
635
+ # Remove half of the plots in dir1
636
+ for path in env.dir_1.path_list()[0 : int(len(env.dir_1) / 2)]:
637
+ expected_result.processed -= 1
638
+ expected_result.removed.append(path)
639
+ unlink(path)
640
+ # Modify the `last_use` timestamp of all cache entries to let them expire
641
+ last_use_before = time.time() - Cache.expiry_seconds - 1
642
+ for cache_entry in cache_v1.values():
643
+ cache_entry.last_use = last_use_before
644
+ assert cache_entry.expired(Cache.expiry_seconds)
645
+ # The next refresh cycle will now lead to half of the cache entries being removed because they are expired and
646
+ # the related plots do not longer exist.
647
+ await env.refresh_tester.run(expected_result)
648
+ assert len(cache_v1) == count_before - len(expected_result.removed)
649
+ # The other half of the cache entries should have a different `last_use` value now.
650
+ for cache_entry in cache_v1.values():
651
+ assert cache_entry.last_use != last_use_before
652
+
653
+
654
+ @pytest.mark.parametrize(
655
+ ["event_to_raise"],
656
+ [
657
+ pytest.param(PlotRefreshEvents.started, id="started"),
658
+ pytest.param(PlotRefreshEvents.batch_processed, id="batch_processed"),
659
+ pytest.param(PlotRefreshEvents.done, id="done"),
660
+ ],
661
+ )
662
+ @pytest.mark.anyio
663
+ async def test_callback_event_raises(environment, event_to_raise: PlotRefreshEvents):
664
+ last_event_fired: Optional[PlotRefreshEvents] = None
665
+
666
+ def raising_callback(event: PlotRefreshEvents, _: PlotRefreshResult):
667
+ nonlocal last_event_fired
668
+ last_event_fired = event
669
+ if event == event_to_raise:
670
+ raise Exception(f"run_raise_in_callback {event_to_raise}")
671
+
672
+ env: Environment = environment
673
+ expected_result = PlotRefreshResult()
674
+ # Load dir_1
675
+ add_plot_directory(env.root_path, str(env.dir_1.path))
676
+ expected_result.loaded = env.dir_1.plot_info_list() # type: ignore[assignment]
677
+ expected_result.removed = []
678
+ expected_result.processed = len(env.dir_1)
679
+ expected_result.remaining = 0
680
+ await env.refresh_tester.run(expected_result)
681
+ # Load dir_2
682
+ add_plot_directory(env.root_path, str(env.dir_2.path))
683
+ expected_result.loaded = env.dir_2.plot_info_list() # type: ignore[assignment]
684
+ expected_result.removed = []
685
+ expected_result.processed = len(env.dir_1) + len(env.dir_2)
686
+ expected_result.remaining = 0
687
+ await env.refresh_tester.run(expected_result)
688
+ # Now raise the exception in the callback
689
+ default_callback = env.refresh_tester.plot_manager._refresh_callback
690
+ env.refresh_tester.plot_manager.set_refresh_callback(raising_callback)
691
+ env.refresh_tester.plot_manager.start_refreshing()
692
+ env.refresh_tester.plot_manager.trigger_refresh()
693
+ await time_out_assert(5, env.refresh_tester.plot_manager.needs_refresh, value=False)
694
+ # And make sure the follow-up evens aren't fired
695
+ assert last_event_fired == event_to_raise
696
+ # The exception should trigger `PlotManager.reset()` and clear the plots
697
+ assert len(env.refresh_tester.plot_manager.plots) == 0
698
+ assert len(env.refresh_tester.plot_manager.plot_filename_paths) == 0
699
+ assert len(env.refresh_tester.plot_manager.failed_to_open_filenames) == 0
700
+ assert len(env.refresh_tester.plot_manager.no_key_filenames) == 0
701
+ # The next run without the valid callback should lead to re-loading of all plot
702
+ env.refresh_tester.plot_manager.set_refresh_callback(default_callback)
703
+ expected_result.loaded = env.dir_1.plot_info_list() + env.dir_2.plot_info_list() # type: ignore[assignment]
704
+ expected_result.removed = []
705
+ expected_result.processed = len(env.dir_1) + len(env.dir_2)
706
+ expected_result.remaining = 0
707
+ await env.refresh_tester.run(expected_result)
708
+
709
+
710
+ @pytest.mark.anyio
711
+ async def test_recursive_plot_scan(environment: Environment) -> None:
712
+ env: Environment = environment
713
+ # Create a directory tree with some subdirectories containing plots, others not.
714
+ root_plot_dir = env.root_path / "root"
715
+ sub_dir_0: Directory = Directory(root_plot_dir / "0", env.dir_1.plots[0:2])
716
+ sub_dir_0_1: Directory = Directory(sub_dir_0.path / "1", env.dir_1.plots[2:3])
717
+ sub_dir_1: Directory = Directory(root_plot_dir / "1", [])
718
+ sub_dir_1_0: Directory = Directory(sub_dir_1.path / "0", [])
719
+ sub_dir_1_0_1: Directory = Directory(sub_dir_1_0.path / "1", env.dir_1.plots[3:7])
720
+
721
+ # List of all the plots in the directory tree
722
+ expected_plot_list = sub_dir_0.plot_info_list() + sub_dir_0_1.plot_info_list() + sub_dir_1_0_1.plot_info_list()
723
+
724
+ # Adding the root without `recursive_plot_scan` and running a test should not load any plots (match an empty result)
725
+ expected_result = PlotRefreshResult()
726
+ add_plot_directory(env.root_path, str(root_plot_dir))
727
+ await env.refresh_tester.run(expected_result)
728
+
729
+ # Set the recursive scan flag in the config
730
+ with lock_and_load_config(env.root_path, "config.yaml") as config:
731
+ config["harvester"]["recursive_plot_scan"] = True
732
+ save_config(env.root_path, "config.yaml", config)
733
+
734
+ # With the flag enabled it should load all expected plots
735
+ expected_result.loaded = expected_plot_list # type: ignore[assignment]
736
+ expected_result.processed = len(expected_plot_list)
737
+ await env.refresh_tester.run(expected_result)
738
+
739
+ # Adding the subdirectories also should not lead to some failure or duplicated loading
740
+ add_plot_directory(env.root_path, str(sub_dir_0_1.path))
741
+ add_plot_directory(env.root_path, str(sub_dir_1_0_1.path))
742
+ expected_result.loaded = []
743
+ await env.refresh_tester.run(expected_result)
744
+
745
+
746
+ @boolean_datacases(name="follow_links", false="no_follow", true="follow")
747
+ @pytest.mark.anyio
748
+ async def test_recursive_plot_scan_symlinks(environment: Environment, follow_links: bool) -> None:
749
+ env: Environment = environment
750
+ # Create a directory tree with some subdirectories containing plots, others not.
751
+ root_plot_dir = env.root_path / "root"
752
+ sub_dir_0: Directory = Directory(root_plot_dir / "0", env.dir_1.plots[0:2])
753
+ sub_dir_0_1: Directory = Directory(sub_dir_0.path / "1", env.dir_1.plots[2:3])
754
+
755
+ # Create a plot directory outside of the root plot directory
756
+ other_plot_dir: Directory = Directory(env.root_path / "other", env.dir_1.plots[3:7])
757
+
758
+ # Create a symlink to the other plot directory from inside the root plot directory
759
+ symlink_path = Path(root_plot_dir / "other")
760
+ symlink_path.symlink_to(env.root_path / "other")
761
+
762
+ # Adding the root without `recursive_plot_scan` and running a test should not load any plots (match an empty result)
763
+ expected_result = PlotRefreshResult()
764
+ add_plot_directory(env.root_path, str(root_plot_dir))
765
+ await env.refresh_tester.run(expected_result)
766
+
767
+ if follow_links:
768
+ expected_plot_list = sub_dir_0.plot_info_list() + sub_dir_0_1.plot_info_list() + other_plot_dir.plot_info_list()
769
+ else:
770
+ expected_plot_list = sub_dir_0.plot_info_list() + sub_dir_0_1.plot_info_list()
771
+
772
+ # Set the recursive scan flag in the config and symlink flag
773
+ with lock_and_load_config(env.root_path, "config.yaml") as config:
774
+ config["harvester"]["recursive_plot_scan"] = True
775
+ config["harvester"]["recursive_follow_links"] = follow_links
776
+ save_config(env.root_path, "config.yaml", config)
777
+
778
+ # With the flag enabled it should load all expected plots
779
+ expected_result.loaded = expected_plot_list # type: ignore[assignment]
780
+ expected_result.processed = len(expected_plot_list)
781
+ await env.refresh_tester.run(expected_result)