chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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 (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,591 @@
1
+ from __future__ import annotations
2
+
3
+ import textwrap
4
+ from pathlib import Path
5
+ from typing import Any, Callable
6
+
7
+ import click
8
+ import pytest
9
+ import yaml
10
+ from click.testing import CliRunner
11
+
12
+ from chia.util.virtual_project_analysis import (
13
+ Annotation,
14
+ ChiaFile,
15
+ Config,
16
+ DirectoryParameters,
17
+ File,
18
+ Package,
19
+ build_dependency_graph,
20
+ build_virtual_dependency_graph,
21
+ cli,
22
+ config,
23
+ find_cycles,
24
+ parse_file_or_package,
25
+ )
26
+
27
+
28
+ @pytest.mark.parametrize(
29
+ "file_string, expected, annotated",
30
+ [
31
+ ("# Package: example\n# Some other comment", "example", True),
32
+ ("# Some comment\n# Some other comment", "chia-blockchain", False),
33
+ ],
34
+ )
35
+ def test_parse_annotation(file_string: str, expected: str, annotated: bool) -> None:
36
+ """
37
+ Test that parse returns an Annotation instance for a valid annotation or
38
+ raises ValueError for an invalid one.
39
+ """
40
+ annotation = Annotation.parse(file_string)
41
+ assert isinstance(annotation, Annotation)
42
+ assert annotation.package == expected
43
+ assert annotation.is_annotated == annotated
44
+
45
+
46
+ # Temporary directory fixture to create test files
47
+ @pytest.fixture
48
+ def create_test_file(tmp_path: Path) -> Callable[[str, str], Path]:
49
+ def _create_test_file(name: str, content: str) -> Path:
50
+ file_path = tmp_path / name
51
+ file_path.write_text(content, encoding="utf-8")
52
+ return file_path
53
+
54
+ return _create_test_file
55
+
56
+
57
+ def test_parse_with_annotation(create_test_file: Callable[[str, str], Path]) -> None:
58
+ """Test parsing a file that contains a valid annotation."""
59
+ file_content = "# Package: test_package\n# Some other comment"
60
+ test_file = create_test_file("annotated_file.txt", file_content)
61
+
62
+ parsed_file = ChiaFile.parse(test_file)
63
+
64
+ assert parsed_file.path == test_file
65
+ assert isinstance(parsed_file.annotations, Annotation)
66
+ assert parsed_file.annotations.package == "test_package"
67
+
68
+
69
+ def test_parse_without_annotation(create_test_file: Callable[[str, str], Path]) -> None:
70
+ """Test parsing a file that does not contain any annotations."""
71
+ file_content = "# Some comment\n# Some other comment"
72
+ test_file = create_test_file("non_annotated_file.txt", file_content)
73
+
74
+ parsed_file = ChiaFile.parse(test_file)
75
+
76
+ assert parsed_file.path == test_file
77
+ assert not parsed_file.annotations.is_annotated
78
+
79
+
80
+ # This test is optional and can be adapted based on expected behavior for non-existent files
81
+ def test_parse_nonexistent_file() -> None:
82
+ """Test attempting to parse a non-existent file."""
83
+ with pytest.raises(FileNotFoundError):
84
+ ChiaFile.parse(Path("/path/to/nonexistent/file.txt"))
85
+
86
+
87
+ # Helper function to create a non-empty Python file
88
+ def create_python_file(dir_path: Path, name: str, content: str) -> Path:
89
+ file_path = dir_path / name
90
+ file_path.write_text(content, encoding="utf-8")
91
+ return file_path
92
+
93
+
94
+ # Helper function to create an empty Python file
95
+ def create_empty_python_file(dir_path: Path, name: str) -> Path:
96
+ file_path = dir_path / name
97
+ file_path.touch()
98
+ return file_path
99
+
100
+
101
+ def test_gather_non_empty_python_files(tmp_path: Path) -> None:
102
+ # Set up directory structure
103
+ dir_path = tmp_path / "test_dir"
104
+ dir_path.mkdir()
105
+ excluded_dir = tmp_path / "excluded_dir"
106
+ excluded_dir.mkdir()
107
+
108
+ # Create test files
109
+ non_empty_file = create_python_file(dir_path, "non_empty.py", "print('Hello World')")
110
+ create_empty_python_file(dir_path, "empty.py")
111
+ create_python_file(excluded_dir, "excluded.py", "print('Hello World')")
112
+
113
+ # Initialize DirectoryParameters with excluded paths
114
+ dir_params = DirectoryParameters(dir_path=dir_path, excluded_paths=[excluded_dir])
115
+
116
+ # Perform the test
117
+ python_files = dir_params.gather_non_empty_python_files()
118
+
119
+ # Assertions
120
+ assert len(python_files) == 1 # Only one non-empty Python file should be found
121
+ assert python_files[0].path == non_empty_file # The path of the gathered file should match the non-empty file
122
+
123
+
124
+ def test_gather_with_nested_directories_and_exclusions(tmp_path: Path) -> None:
125
+ # Set up directory structure
126
+ base_dir = tmp_path / "base_dir"
127
+ base_dir.mkdir()
128
+ nested_dir = base_dir / "nested_dir"
129
+ nested_dir.mkdir()
130
+ excluded_dir = base_dir / "excluded_dir"
131
+ excluded_dir.mkdir()
132
+
133
+ # Create test files
134
+ nested_file = create_python_file(nested_dir, "nested.py", "print('Hello World')")
135
+ create_empty_python_file(nested_dir, "nested_empty.py")
136
+ create_python_file(excluded_dir, "excluded.py", "print('Hello World')")
137
+
138
+ # Initialize DirectoryParameters without excluded paths
139
+ dir_params = DirectoryParameters(dir_path=base_dir, excluded_paths=[excluded_dir])
140
+
141
+ # Perform the test
142
+ python_files = dir_params.gather_non_empty_python_files()
143
+
144
+ # Assertions
145
+ assert len(python_files) == 1 # Only the non-empty Python file in the nested directory should be found
146
+ assert python_files[0].path == nested_file # The path of the gathered file should match the nested non-empty file
147
+
148
+
149
+ def test_find_missing_annotations(tmp_path: Path) -> None:
150
+ # Set up directory structure
151
+ dir_path = tmp_path / "test_dir"
152
+ dir_path.mkdir()
153
+
154
+ # Create test files
155
+ create_python_file(dir_path, "non_empty.py", "print('Hello World')")
156
+
157
+ # Run the command
158
+ runner = CliRunner()
159
+ result = runner.invoke(cli, ["find_missing_annotations", "--directory", str(dir_path)])
160
+ assert result.output == f"{dir_path / 'non_empty.py'}\n"
161
+
162
+ # Rewrite file to have annotation
163
+ create_python_file(dir_path, "non_empty.py", "# Package: misc\n")
164
+
165
+ # Run the command again with no results
166
+ result = runner.invoke(cli, ["find_missing_annotations", "--directory", str(dir_path)])
167
+ assert result.output == ""
168
+
169
+
170
+ def test_parse_file_or_package() -> None:
171
+ assert parse_file_or_package("example.py") == File(Path("example.py"))
172
+ assert parse_file_or_package("example.py (extra info)") == File(Path("example.py"))
173
+ assert parse_file_or_package("(package_name)") == Package("package_name")
174
+ assert parse_file_or_package("package_name") == Package("package_name")
175
+ assert parse_file_or_package("package_name(") == Package("package_name(")
176
+ assert parse_file_or_package("(package_name") == Package("(package_name")
177
+ assert parse_file_or_package("package_name)") == Package("package_name)")
178
+
179
+
180
+ @pytest.fixture
181
+ def chia_package_structure(tmp_path: Path) -> Path:
182
+ base_dir = tmp_path / "chia_project"
183
+ base_dir.mkdir()
184
+ chia_dir = base_dir / "chia"
185
+ chia_dir.mkdir()
186
+
187
+ # Create some files within the chia package
188
+ create_python_file(chia_dir, "module1.py", "def func1(): pass")
189
+ create_python_file(chia_dir, "module2.py", "def func2(): pass\nfrom chia.module1 import func1")
190
+ create_python_file(chia_dir, "module3.py", "def func3(): pass\nimport chia.module2")
191
+
192
+ return chia_dir
193
+
194
+
195
+ def test_build_dependency_graph(chia_package_structure: Path) -> None:
196
+ chia_dir = chia_package_structure
197
+ dir_params = DirectoryParameters(dir_path=chia_dir)
198
+ graph = build_dependency_graph(dir_params)
199
+ assert chia_dir / "module1.py" in graph
200
+ assert chia_dir / "module2.py" in graph
201
+ assert chia_dir / "module3.py" in graph
202
+ assert chia_dir / "module1.py" in graph[chia_dir / "module2.py"]
203
+ assert chia_dir / "module2.py" in graph[chia_dir / "module3.py"]
204
+
205
+
206
+ def test_print_dependency_graph(chia_package_structure: Path) -> None:
207
+ # Run the command
208
+ runner = CliRunner()
209
+ result = runner.invoke(cli, ["print_dependency_graph", "--directory", str(chia_package_structure)])
210
+ assert "module1.py" in result.output
211
+ assert "module2.py" in result.output
212
+ assert "module3.py" in result.output
213
+
214
+
215
+ # Mock the build_dependency_graph function to control its output
216
+ def mock_build_dependency_graph(dir_params: DirectoryParameters) -> dict[Path, list[Path]]:
217
+ return {
218
+ Path("/path/to/package1/module1.py"): [
219
+ Path("/path/to/package2/module2.py"),
220
+ Path("/path/to/package3/module3.py"),
221
+ ],
222
+ Path("/path/to/package2/module2.py"): [],
223
+ Path("/path/to/package3/module3.py"): [Path("/path/to/package2/module2.py")],
224
+ }
225
+
226
+
227
+ # Helper function to simulate ChiaFile.parse for testing
228
+ def mock_chia_file_parse(path: Path) -> ChiaFile:
229
+ annotations_map = {
230
+ Path("/path/to/package1/module1.py"): Annotation("Package1", True),
231
+ Path("/path/to/package2/module2.py"): Annotation("Package2", True),
232
+ Path("/path/to/package3/module3.py"): Annotation("Package3", True),
233
+ }
234
+ return ChiaFile(path=Path(path), annotations=annotations_map.get(path, Annotation("chia-blockchain", False)))
235
+
236
+
237
+ @pytest.fixture
238
+ def prepare_mocks(monkeypatch: pytest.MonkeyPatch) -> None:
239
+ monkeypatch.setattr("chia.util.virtual_project_analysis.build_dependency_graph", mock_build_dependency_graph)
240
+ monkeypatch.setattr("chia.util.virtual_project_analysis.ChiaFile.parse", mock_chia_file_parse)
241
+
242
+
243
+ def test_build_virtual_dependency_graph(prepare_mocks: None) -> None:
244
+ dir_params = DirectoryParameters(dir_path=Path("/path/to/package1"))
245
+ virtual_graph = build_virtual_dependency_graph(dir_params)
246
+
247
+ assert "Package2" in virtual_graph["Package1"]
248
+ assert "Package3" in virtual_graph["Package1"]
249
+ assert virtual_graph["Package2"] == []
250
+ assert "Package2" in virtual_graph["Package3"]
251
+
252
+
253
+ def test_print_virtual_dependency_graph(tmp_path: Path) -> None:
254
+ chia_dir = tmp_path / "chia"
255
+ chia_dir.mkdir()
256
+
257
+ # Create some files within the chia package
258
+ create_python_file(chia_dir, "module1.py", "# Package: one\ndef func1(): pass")
259
+ create_python_file(chia_dir, "module2.py", "# Package: two\ndef func2(): pass\nfrom chia.module1 import func1")
260
+ create_python_file(chia_dir, "module3.py", "# Package: three\ndef func3(): pass\nimport chia.module2")
261
+
262
+ # Run the command
263
+ runner = CliRunner()
264
+ result = runner.invoke(cli, ["print_virtual_dependency_graph", "--directory", str(chia_dir)])
265
+ assert "one" in result.output
266
+ assert "two" in result.output
267
+ assert "three" in result.output
268
+
269
+
270
+ # Helper function to simulate ChiaFile.parse for testing
271
+ def mock_chia_file_parse2(path: Path) -> ChiaFile:
272
+ annotations_map = {
273
+ Path("/path/to/package1/module1.py"): Annotation("Package1", True),
274
+ Path("/path/to/package2/module2.py"): Annotation("Package2", True),
275
+ Path("/path/to/package3/module3.py"): Annotation("Package1", True),
276
+ }
277
+ return ChiaFile(path=Path(path), annotations=annotations_map.get(path, Annotation("chia-blockchain", False)))
278
+
279
+
280
+ @pytest.fixture
281
+ def prepare_mocks2(monkeypatch: pytest.MonkeyPatch) -> None:
282
+ monkeypatch.setattr("chia.util.virtual_project_analysis.ChiaFile.parse", mock_chia_file_parse2)
283
+
284
+
285
+ def test_cycle_detection(prepare_mocks2: None) -> None:
286
+ # Example graph with a simple cycle
287
+ graph: dict[Path, list[Path]] = {
288
+ Path("/path/to/package1/module1.py"): [Path("/path/to/package2/module2.py")],
289
+ Path("/path/to/package2/module2.py"): [Path("/path/to/package3/module3.py")], # Cycle here
290
+ Path("/path/to/package3/module3.py"): [],
291
+ }
292
+ cycles = find_cycles(
293
+ graph,
294
+ build_virtual_dependency_graph(DirectoryParameters(dir_path=Path("path")), existing_graph=graph),
295
+ excluded_paths=[],
296
+ ignore_cycles_in=[],
297
+ ignore_specific_files=[],
298
+ ignore_specific_edges=[],
299
+ )
300
+ # \path\to\package1\module1.py (Package1) -> \path\to\package2\module2.py (Package2) -> (Package1)
301
+ # \path\to\package2\module2.py (Package2) -> \path\to\package3\module3.py (Package1) -> (Package2)
302
+ assert len(cycles) == 2
303
+
304
+
305
+ def test_print_cycles(tmp_path: Path) -> None:
306
+ chia_dir = tmp_path / "chia"
307
+ chia_dir.mkdir()
308
+
309
+ # Create some files within the chia package
310
+ create_python_file(chia_dir, "module1.py", "# Package: one\ndef func1(): pass\nfrom chia.module2 import func2")
311
+ create_python_file(chia_dir, "module2.py", "# Package: two\ndef func2(): pass\nfrom chia.module3 import func3")
312
+ create_python_file(chia_dir, "module3.py", "# Package: one\ndef func3(): pass\n")
313
+
314
+ # Run the command
315
+ runner = CliRunner()
316
+ result = runner.invoke(cli, ["print_cycles", "--directory", str(chia_dir)])
317
+ assert "module1.py (one) -> " in result.output
318
+
319
+
320
+ def test_check_config(tmp_path: Path) -> None:
321
+ chia_dir = tmp_path / "chia"
322
+ chia_dir.mkdir()
323
+
324
+ # Create some files within the chia package
325
+ create_python_file(
326
+ chia_dir,
327
+ "module1.py",
328
+ textwrap.dedent(
329
+ """
330
+ # Package: one
331
+ def func1(): pass
332
+ from chia.module2 import func2
333
+ """
334
+ ),
335
+ )
336
+ create_python_file(
337
+ chia_dir,
338
+ "module1b.py",
339
+ textwrap.dedent(
340
+ """
341
+ # Package: one
342
+ def func1b(): pass
343
+ """
344
+ ),
345
+ )
346
+ create_python_file(
347
+ chia_dir,
348
+ "module2.py",
349
+ textwrap.dedent(
350
+ """
351
+ # Package: two
352
+ def func2(): pass
353
+ from chia.module3 import func3
354
+ from chia.module1b import func1b
355
+ """
356
+ ),
357
+ )
358
+ create_python_file(
359
+ chia_dir,
360
+ "module3.py",
361
+ textwrap.dedent(
362
+ """
363
+ # Package: three
364
+ def func3(): pass
365
+ """
366
+ ),
367
+ )
368
+
369
+ # Run the command
370
+ runner = CliRunner()
371
+ result = runner.invoke(
372
+ cli,
373
+ [
374
+ "check_config",
375
+ "--directory",
376
+ str(chia_dir),
377
+ "--ignore-cycles-in",
378
+ "three",
379
+ "--ignore-specific-file",
380
+ str(chia_dir / "module3.py"),
381
+ "--ignore-specific-edge",
382
+ str(chia_dir / "module2.py") + " -> " + str(chia_dir / "module3.py"),
383
+ "--ignore-specific-edge",
384
+ str(chia_dir / "module2.py") + " -> " + str(chia_dir / "module1b.py"),
385
+ ],
386
+ )
387
+ assert " module three ignored but no cycles were found" in result.output
388
+ assert f" file {chia_dir / 'module3.py'!s} ignored but no cycles were found" in result.output
389
+ assert (
390
+ f"edge {str(chia_dir / 'module2.py') + ' -> ' + str(chia_dir / 'module3.py')} ignored but no cycles were found"
391
+ in result.output
392
+ )
393
+ assert (
394
+ f"edge {str(chia_dir / 'module2.py') + ' -> ' + str(chia_dir / 'module1b.py')} ignored but no cycles were found"
395
+ not in result.output
396
+ )
397
+
398
+
399
+ def test_excluded_paths_handling(prepare_mocks2: None) -> None:
400
+ # Graph where module2.py is excluded
401
+ graph = {
402
+ Path("/path/to/package1/module1.py"): [Path("/path/to/package2/module2.py")],
403
+ Path("/path/to/package2/module2.py"): [Path("/path/to/package1/module1.py")],
404
+ }
405
+ cycles = find_cycles(
406
+ graph,
407
+ build_virtual_dependency_graph(DirectoryParameters(dir_path=Path("path")), existing_graph=graph),
408
+ excluded_paths=[Path("/path/to/package2/module2.py")],
409
+ ignore_cycles_in=[],
410
+ ignore_specific_files=[],
411
+ ignore_specific_edges=[],
412
+ )
413
+ assert len(cycles) == 0 # No cycles due to exclusion
414
+
415
+
416
+ def test_ignore_cycles_in_specific_packages(prepare_mocks2: None) -> None:
417
+ graph: dict[Path, list[Path]] = {
418
+ Path("/path/to/package1/module1.py"): [Path("/path/to/package2/module2.py")],
419
+ Path("/path/to/package2/module2.py"): [Path("/path/to/package3/module3.py")],
420
+ Path("/path/to/package3/module3.py"): [],
421
+ }
422
+ # Assuming module1.py and module3.py belong to Package1, which is ignored
423
+ cycles = find_cycles(
424
+ graph,
425
+ build_virtual_dependency_graph(DirectoryParameters(dir_path=Path("path")), existing_graph=graph),
426
+ excluded_paths=[],
427
+ ignore_cycles_in=["Package1"],
428
+ ignore_specific_files=[],
429
+ ignore_specific_edges=[],
430
+ )
431
+ assert len(cycles) == 1 # Cycles in Package1 are ignored
432
+
433
+
434
+ def test_ignore_cycles_with_specific_edges(monkeypatch: pytest.MonkeyPatch) -> None:
435
+ def _mock_chia_file_parse(path: Path) -> ChiaFile:
436
+ annotations_map = {
437
+ Path("/path/to/package1/module1a.py"): Annotation("Package1", True),
438
+ Path("/path/to/package2/module2.py"): Annotation("Package2", True),
439
+ Path("/path/to/package3/module3.py"): Annotation("Package3", True),
440
+ Path("/path/to/package1/module1b.py"): Annotation("Package1", True),
441
+ }
442
+ return ChiaFile(path=Path(path), annotations=annotations_map.get(path, Annotation("chia-blockchain", False)))
443
+
444
+ monkeypatch.setattr("chia.util.virtual_project_analysis.ChiaFile.parse", _mock_chia_file_parse)
445
+
446
+ graph = {
447
+ Path("/path/to/package1/module1a.py"): [Path("/path/to/package2/module2.py")],
448
+ Path("/path/to/package2/module2.py"): [Path("/path/to/package3/module3.py")],
449
+ Path("/path/to/package3/module3.py"): [Path("/path/to/package1/module1b.py")],
450
+ Path("/path/to/package1/module1b.py"): [],
451
+ }
452
+ virtual_graph = build_virtual_dependency_graph(DirectoryParameters(dir_path=Path("path")), existing_graph=graph)
453
+ cycles = find_cycles(
454
+ graph,
455
+ virtual_graph,
456
+ excluded_paths=[],
457
+ ignore_cycles_in=[],
458
+ ignore_specific_files=[],
459
+ ignore_specific_edges=[
460
+ (File(Path("/path/to/package3/module3.py")), File(Path("/path/to/package2/module2.py"))),
461
+ (Package("Package3"), Package("Package2")),
462
+ ],
463
+ )
464
+ assert len(cycles) == 0
465
+
466
+
467
+ def test_ignore_cycles_with_specific_files(prepare_mocks2: None) -> None:
468
+ graph = {
469
+ Path("/path/to/package1/module1.py"): [Path("/path/to/package2/module2.py")],
470
+ Path("/path/to/package2/module2.py"): [Path("/path/to/package3/module3.py")], # Cycle here
471
+ }
472
+ cycles = find_cycles(
473
+ graph,
474
+ build_virtual_dependency_graph(DirectoryParameters(dir_path=Path("path")), existing_graph=graph),
475
+ excluded_paths=[],
476
+ ignore_cycles_in=[],
477
+ ignore_specific_files=[Path("/path/to/package1/module1.py"), Path("/path/to/package2/module2.py")],
478
+ ignore_specific_edges=[],
479
+ )
480
+ assert len(cycles) == 0
481
+
482
+
483
+ # Sample function to use with the decorator for testing
484
+ @click.command("blah")
485
+ @config
486
+ def sample_function(config: Config) -> None:
487
+ print(config)
488
+
489
+
490
+ # Helper function to create a temporary YAML configuration file
491
+ @pytest.fixture
492
+ def create_yaml_config(tmp_path: Path) -> Callable[[dict[str, Any]], Path]:
493
+ def _create_yaml_config(content: dict[str, Any]) -> Path:
494
+ path = tmp_path / "config.yaml"
495
+ with open(path, "w") as f:
496
+ yaml.dump(content, f)
497
+ return path
498
+
499
+ return _create_yaml_config
500
+
501
+
502
+ def test_config_with_yaml(create_yaml_config: Callable[[dict[str, Any]], Path]) -> None:
503
+ # Create a temporary YAML configuration file
504
+ yaml_config = {
505
+ "exclude_paths": ["path/to/exclude"],
506
+ "ignore": {
507
+ "packages": ["ignored.package"],
508
+ "files": ["ignored_file.py"],
509
+ "edges": ["ignored_parent -> ignored_child"],
510
+ },
511
+ }
512
+ config_path = create_yaml_config(yaml_config)
513
+
514
+ runner = CliRunner()
515
+
516
+ # Invoke the CLI with the --config option
517
+ result = runner.invoke(sample_function, ["--directory", ".", "--config", str(config_path)])
518
+
519
+ # Check if the command ran successfully
520
+ assert result.exit_code == 0
521
+
522
+ # Verify the config object created by the decorator
523
+ config = result.output
524
+ path_type = config_path.__class__.__name__
525
+ assert config == (
526
+ "Config("
527
+ "directory_parameters=DirectoryParameters("
528
+ f"dir_path={path_type}('.'), "
529
+ f"excluded_paths=[{path_type}('path/to/exclude')]"
530
+ "), "
531
+ "ignore_cycles_in=['ignored.package'], "
532
+ f"ignore_specific_files=[{path_type}('ignored_file.py')], "
533
+ f"ignore_specific_edges=[(Package(name='ignored_child', is_file=False), "
534
+ f"Package(name='ignored_parent', is_file=False))]"
535
+ ")\n"
536
+ )
537
+
538
+
539
+ def test_parse_edges(tmp_path: Path) -> None:
540
+ chia_dir = tmp_path / "chia"
541
+ chia_dir.mkdir()
542
+
543
+ # Create some files within the chia package
544
+ create_python_file(
545
+ chia_dir,
546
+ "module1.py",
547
+ textwrap.dedent(
548
+ """
549
+ # Package: one
550
+ def func1(): pass
551
+ from chia.module2 import func2
552
+ from chia.module3 import func3
553
+ """
554
+ ),
555
+ )
556
+ create_python_file(
557
+ chia_dir,
558
+ "module2.py",
559
+ textwrap.dedent(
560
+ """
561
+ # Package: two
562
+ def func2(): pass
563
+ """
564
+ ),
565
+ )
566
+ create_python_file(
567
+ chia_dir,
568
+ "module3.py",
569
+ textwrap.dedent(
570
+ """
571
+ # Package: three
572
+ def func3(): pass
573
+ """
574
+ ),
575
+ )
576
+
577
+ # Run the command
578
+ runner = CliRunner()
579
+ result = runner.invoke(
580
+ cli,
581
+ [
582
+ "print_edges",
583
+ "--directory",
584
+ str(chia_dir),
585
+ "--dependent-package",
586
+ "one",
587
+ "--provider-package",
588
+ "two",
589
+ ],
590
+ )
591
+ assert result.output.strip() == f"{chia_dir / 'module1.py'!s} (one) -> {chia_dir / 'module2.py'!s} (two)"
@@ -66,15 +66,15 @@ def benchmark_all_operators():
66
66
  point_add = "(point_add"
67
67
  " (q 0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb)"
68
68
  " (q 0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb))"
69
- point_add_cost, point_add_time = run_and_return_cost_time(point_add)
69
+ _point_add_cost, point_add_time = run_and_return_cost_time(point_add)
70
70
  addition_cost, addition_time = run_and_return_cost_time(addition)
71
- substraction_cost, substraction_time = run_and_return_cost_time(substraction)
72
- multiply_cost, multiply_time = run_and_return_cost_time(multiply)
73
- greater_cost, greater_time = run_and_return_cost_time(greater)
74
- equal_cost, equal_time = run_and_return_cost_time(equal)
75
- if_cost, if_time = run_and_return_cost_time(if_clvm)
76
- sha256tree_cost, sha256tree_time = run_and_return_cost_time(sha256tree)
77
- pubkey_for_exp_cost, pubkey_for_exp_time = run_and_return_cost_time(pubkey_for_exp)
71
+ _substraction_cost, substraction_time = run_and_return_cost_time(substraction)
72
+ _multiply_cost, multiply_time = run_and_return_cost_time(multiply)
73
+ _greater_cost, greater_time = run_and_return_cost_time(greater)
74
+ _equal_cost, equal_time = run_and_return_cost_time(equal)
75
+ _if_cost, if_time = run_and_return_cost_time(if_clvm)
76
+ _sha256tree_cost, sha256tree_time = run_and_return_cost_time(sha256tree)
77
+ _pubkey_for_exp_cost, pubkey_for_exp_time = run_and_return_cost_time(pubkey_for_exp)
78
78
 
79
79
  one_addition = 1
80
80
  one_substraction = get_cost_compared_to_addition(addition_cost, addition_time, substraction_time) / addition_cost
@@ -167,4 +167,4 @@ if __name__ == "__main__":
167
167
  constant = clvm_should_cost / clvm_cost
168
168
  format = float_to_str(constant)
169
169
  print(f"Constant factor: {format}")
170
- print(f"CLVM RATIO MULTIPLIER: {1/constant}")
170
+ print(f"CLVM RATIO MULTIPLIER: {1 / constant}")
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import random
4
- from typing import Tuple
5
4
 
6
5
  import importlib_resources
7
6
  from chia_rs import AugSchemeMPL, ClassgroupElement, Coin, G1Element, G2Element, VDFInfo, VDFProof
@@ -24,7 +23,7 @@ clvm_generator_bin_path = importlib_resources.files(__name__.rpartition(".")[0])
24
23
  clvm_generator = clvm_generator_bin_path.read_bytes()
25
24
 
26
25
 
27
- def rewards(height: uint32) -> Tuple[Coin, Coin]:
26
+ def rewards(height: uint32) -> tuple[Coin, Coin]:
28
27
  farmer_coin = create_farmer_coin(height, ph, uint64(250000000), DEFAULT_CONSTANTS.GENESIS_CHALLENGE)
29
28
  pool_coin = create_pool_coin(height, ph, uint64(1750000000), DEFAULT_CONSTANTS.GENESIS_CHALLENGE)
30
29
  return farmer_coin, pool_coin