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
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List
5
4
 
6
5
  import pytest
7
6
 
@@ -29,7 +28,7 @@ class TestRequestType(Streamable):
29
28
  @streamable
30
29
  @dataclass(frozen=True)
31
30
  class TestResponseObject(Streamable):
32
- qat: List[str]
31
+ qat: list[str]
33
32
  sub: SubObject
34
33
 
35
34
 
@@ -4,12 +4,19 @@ import time
4
4
  from dataclasses import dataclass
5
5
  from ipaddress import IPv4Address, IPv6Address
6
6
  from socket import AF_INET, AF_INET6, SOCK_STREAM
7
- from typing import Dict, List, Tuple, cast
7
+ from typing import Optional, Union, cast
8
+ from unittest.mock import AsyncMock
8
9
 
9
10
  import dns
10
11
  import pytest
12
+ from dns.name import from_text
13
+ from dns.rdataclass import IN
14
+ from dns.rdatatype import AAAA as AAAA_TYPE
15
+ from dns.rdatatype import A as A_TYPE
16
+ from dns.rdtypes.IN.A import A
17
+ from dns.rdtypes.IN.AAAA import AAAA
18
+ from dns.rrset import RRset
11
19
 
12
- from chia._tests.util.time_out_assert import time_out_assert
13
20
  from chia.seeder.dns_server import DNSServer
14
21
  from chia.seeder.peer_record import PeerRecord, PeerReliability
15
22
  from chia.util.ints import uint32, uint64
@@ -17,7 +24,7 @@ from chia.util.ints import uint32, uint64
17
24
  timeout = 0.5
18
25
 
19
26
 
20
- def generate_test_combs() -> List[Tuple[bool, str, dns.rdatatype.RdataType]]:
27
+ def generate_test_combs() -> list[tuple[bool, str, dns.rdatatype.RdataType]]:
21
28
  """
22
29
  Generates all the combinations of tests we want to run.
23
30
  """
@@ -60,7 +67,7 @@ class FakeDnsPacket:
60
67
 
61
68
 
62
69
  @pytest.fixture(scope="module")
63
- def database_peers() -> Dict[str, PeerReliability]:
70
+ def database_peers() -> dict[str, PeerReliability]:
64
71
  """
65
72
  We override the values in the class with these dbs, to save time.
66
73
  """
@@ -98,7 +105,7 @@ async def make_dns_query(
98
105
  return await dns.asyncquery.udp(q=dns_message, where=target_address, timeout=d_timeout, port=port)
99
106
 
100
107
 
101
- def get_addresses(num_subnets: int = 10) -> Tuple[List[IPv4Address], List[IPv6Address]]:
108
+ def get_addresses(num_subnets: int = 10) -> tuple[list[IPv4Address], list[IPv6Address]]:
102
109
  ipv4 = []
103
110
  ipv6 = []
104
111
  # generate 2500 ipv4 and 2500 ipv6 peers, it's just a string so who cares
@@ -110,7 +117,7 @@ def get_addresses(num_subnets: int = 10) -> Tuple[List[IPv4Address], List[IPv6Ad
110
117
 
111
118
 
112
119
  def assert_standard_results(
113
- std_query_answer: List[dns.rrset.RRset], request_type: dns.rdatatype.RdataType, num_ns: int
120
+ std_query_answer: list[dns.rrset.RRset], request_type: dns.rdatatype.RdataType, num_ns: int
114
121
  ) -> None:
115
122
  if request_type == dns.rdatatype.A:
116
123
  assert len(std_query_answer) == 1 # only 1 kind of answer
@@ -164,7 +171,7 @@ async def test_error_conditions(
164
171
  no_peers_response = await make_dns_query(use_tcp, target_address, port, no_peers)
165
172
  assert no_peers_response.rcode() == dns.rcode.NOERROR
166
173
 
167
- if request_type == dns.rdatatype.A or request_type == dns.rdatatype.AAAA:
174
+ if request_type in {dns.rdatatype.A, dns.rdatatype.AAAA}:
168
175
  assert len(no_peers_response.answer) == 0 # no response, as expected
169
176
  elif request_type == dns.rdatatype.ANY: # ns + soa
170
177
  assert len(no_peers_response.answer) == 2
@@ -216,7 +223,7 @@ async def test_error_conditions(
216
223
  r = await dns.asyncquery.tcp(q=no_peers, where=target_address, timeout=timeout, sock=socket)
217
224
  assert r.answer == no_peers_response.answer
218
225
  # send 120, as the first 2 bytes / the length of the packet, so that the server expects more.
219
- await socket.sendall(int(120).to_bytes(2, byteorder="big"), int(time.time() + timeout))
226
+ await socket.sendall((120).to_bytes(2, byteorder="big"), int(time.time() + timeout))
220
227
  await socket.close()
221
228
  with pytest.raises(EOFError):
222
229
  await dns.asyncquery.receive_tcp(tcp_socket, timeout)
@@ -273,12 +280,11 @@ async def test_dns_queries(
273
280
  await make_dns_query(use_tcp, target_address, port, e_query)
274
281
 
275
282
 
276
- @pytest.mark.skip(reason="Flaky test with fixes in progress")
277
283
  @pytest.mark.anyio
278
284
  @pytest.mark.parametrize("use_tcp, target_address, request_type", all_test_combinations)
279
285
  async def test_db_processing(
280
286
  seeder_service: DNSServer,
281
- database_peers: Dict[str, PeerReliability],
287
+ database_peers: dict[str, PeerReliability],
282
288
  use_tcp: bool,
283
289
  target_address: str,
284
290
  request_type: dns.rdatatype.RdataType,
@@ -298,11 +304,117 @@ async def test_db_processing(
298
304
  # Write these new peers to db.
299
305
  await crawl_store.load_reliable_peers_to_db()
300
306
 
301
- # wait for the new db to be read.
302
- await time_out_assert(30, lambda: seeder_service.reliable_peers_v4 != [])
307
+ # Force a DB reload and ensure it loaded the peers
308
+ await seeder_service.refresh_reliable_peers()
309
+ assert seeder_service.reliable_peers_v4 != []
303
310
 
304
311
  # now we check that the db peers are being used.
305
312
  query = dns.message.make_query(domain, request_type, use_edns=True) # we need to generate a new request id.
306
313
  std_query_response = await make_dns_query(use_tcp, target_address, port, query)
307
314
  assert std_query_response.rcode() == dns.rcode.NOERROR
308
315
  assert_standard_results(std_query_response.answer, request_type, num_ns)
316
+
317
+
318
+ @pytest.mark.anyio
319
+ @pytest.mark.parametrize(
320
+ "use_tcp, target_address, request_type",
321
+ [
322
+ [False, "127.0.0.1", dns.rdatatype.A],
323
+ [False, "127.0.0.1", dns.rdatatype.AAAA],
324
+ [True, "127.0.0.1", dns.rdatatype.A],
325
+ [True, "127.0.0.1", dns.rdatatype.AAAA],
326
+ [False, "::1", dns.rdatatype.A],
327
+ [False, "::1", dns.rdatatype.AAAA],
328
+ [True, "::1", dns.rdatatype.A],
329
+ [True, "::1", dns.rdatatype.AAAA],
330
+ ],
331
+ )
332
+ async def test_static_peers(
333
+ seeder_service: DNSServer,
334
+ database_peers: dict[str, PeerReliability],
335
+ use_tcp: bool,
336
+ target_address: str,
337
+ request_type: dns.rdatatype.RdataType,
338
+ ) -> None:
339
+ port = get_dns_port(seeder_service, False, target_address)
340
+ domain = seeder_service.domain # default is: seeder.example.com
341
+
342
+ seeder_service.config["static_peers"] = ["1.2.3.4", "2001:0DB8::5"]
343
+ await seeder_service.refresh_reliable_peers()
344
+
345
+ query = dns.message.make_query(domain, request_type, use_edns=True) # we need to generate a new request id.
346
+ std_query_response = await make_dns_query(False, target_address, port, query, d_timeout=10)
347
+ assert std_query_response.rcode() == dns.rcode.NOERROR
348
+ assert len(std_query_response.answer) == 1 # only 1 kind of answer
349
+ answer = std_query_response.answer[0]
350
+ assert answer.rdtype == request_type
351
+ assert len(answer) == 1
352
+ expected = "2001:db8::5" if request_type == dns.rdatatype.AAAA else "1.2.3.4"
353
+ assert answer[0].to_text() == expected
354
+
355
+
356
+ def get_mock_resolver() -> AsyncMock:
357
+ # Mock IPv4 response
358
+ mock_rrset_a = RRset(from_text("node.example.com."), IN, A_TYPE)
359
+ mock_rrset_a.add(A(IN, A_TYPE, "1.2.3.4")) # type: ignore
360
+
361
+ # Mock IPv6 response
362
+ mock_rrset_aaaa = RRset(from_text("node.example.com."), IN, AAAA_TYPE)
363
+ mock_rrset_aaaa.add(AAAA(IN, AAAA_TYPE, "2001:db8::5")) # type: ignore
364
+
365
+ # Create a mock Resolver
366
+ mock_resolver = AsyncMock()
367
+
368
+ # Adjust mock_resolve to accept all arguments
369
+ async def mock_resolve(
370
+ qname: Union[dns.name.Name, str],
371
+ rdtype: Union[dns.rdatatype.RdataType, str] = dns.rdatatype.A,
372
+ lifetime: Optional[float] = None,
373
+ ) -> RRset:
374
+ if rdtype == "A":
375
+ return mock_rrset_a
376
+ elif rdtype == "AAAA":
377
+ return mock_rrset_aaaa
378
+ raise Exception(f"Unexpected query type: {rdtype}")
379
+
380
+ mock_resolver.resolve.side_effect = mock_resolve
381
+ return mock_resolver
382
+
383
+
384
+ @pytest.mark.anyio
385
+ @pytest.mark.parametrize(
386
+ "use_tcp, target_address, request_type",
387
+ [
388
+ [False, "127.0.0.1", dns.rdatatype.A],
389
+ [False, "127.0.0.1", dns.rdatatype.AAAA],
390
+ [True, "127.0.0.1", dns.rdatatype.A],
391
+ [True, "127.0.0.1", dns.rdatatype.AAAA],
392
+ [False, "::1", dns.rdatatype.A],
393
+ [False, "::1", dns.rdatatype.AAAA],
394
+ [True, "::1", dns.rdatatype.A],
395
+ [True, "::1", dns.rdatatype.AAAA],
396
+ ],
397
+ )
398
+ async def test_static_peers_with_hostnames(
399
+ seeder_service: DNSServer,
400
+ database_peers: dict[str, PeerReliability],
401
+ use_tcp: bool,
402
+ target_address: str,
403
+ request_type: dns.rdatatype.RdataType,
404
+ ) -> None:
405
+ port = get_dns_port(seeder_service, False, target_address)
406
+ domain = seeder_service.domain # default is: seeder.example.com
407
+
408
+ seeder_service.resolver = get_mock_resolver()
409
+ seeder_service.config["static_peers"] = ["node.example.com"]
410
+ await seeder_service.refresh_reliable_peers()
411
+
412
+ query = dns.message.make_query(domain, request_type, use_edns=True) # we need to generate a new request id.
413
+ std_query_response = await make_dns_query(False, target_address, port, query, d_timeout=10)
414
+ assert std_query_response.rcode() == dns.rcode.NOERROR
415
+ assert len(std_query_response.answer) == 1 # only 1 kind of answer
416
+ answer = std_query_response.answer[0]
417
+ assert answer.rdtype == request_type
418
+ assert len(answer) == 1
419
+ expected = "2001:db8::5" if request_type == dns.rdatatype.AAAA else "1.2.3.4"
420
+ assert answer[0].to_text() == expected
@@ -26,7 +26,7 @@ def BR(height: int, header_hash: bytes32, prev_hash: bytes32) -> BlockRecord:
26
26
  @pytest.mark.anyio
27
27
  async def test_block_cache(seeded_random: random.Random) -> None:
28
28
  a = BlockCache({})
29
- prev = bytes32([0] * 32)
29
+ prev = bytes32.zeros
30
30
  hashes = [bytes32.random(seeded_random) for _ in range(10)]
31
31
  for i, hh in enumerate(hashes):
32
32
  a.add_block(BR(i + 1, hh, prev))
@@ -36,9 +36,9 @@ async def test_block_cache(seeded_random: random.Random) -> None:
36
36
  if i == 0:
37
37
  continue
38
38
  assert await a.prev_block_hash([hh]) == [hashes[i - 1]]
39
- assert a.try_block_record(hh) == BR(i + 1, hashes[i], hashes[i - 1])
40
- assert a.block_record(hh) == BR(i + 1, hashes[i], hashes[i - 1])
41
- assert a.height_to_hash(uint32(i + 1)) == hashes[i]
42
- assert a.height_to_block_record(uint32(i + 1)) == BR(i + 1, hashes[i], hashes[i - 1])
39
+ assert a.try_block_record(hh) == BR(i + 1, hh, hashes[i - 1])
40
+ assert a.block_record(hh) == BR(i + 1, hh, hashes[i - 1])
41
+ assert a.height_to_hash(uint32(i + 1)) == hh
42
+ assert a.height_to_block_record(uint32(i + 1)) == BR(i + 1, hh, hashes[i - 1])
43
43
  assert a.contains_block(hh)
44
44
  assert a.contains_height(uint32(i + 1))
@@ -4,10 +4,10 @@ from chia_rs import AugSchemeMPL, BLSCache
4
4
 
5
5
  from chia.util.hash import std_hash
6
6
 
7
- LOCAL_CACHE = BLSCache(50000)
7
+ LOCAL_CACHE = BLSCache(50_000)
8
8
 
9
9
 
10
- def test_cached_bls():
10
+ def test_cached_bls() -> None:
11
11
  n_keys = 10
12
12
  seed = b"a" * 31
13
13
  sks = [AugSchemeMPL.key_gen(seed + bytes([i])) for i in range(n_keys)]
@@ -42,7 +42,7 @@ def test_cached_bls():
42
42
  assert local_cache.aggregate_verify(pks, msgs, agg_sig)
43
43
 
44
44
 
45
- def test_cached_bls_repeat_pk():
45
+ def test_cached_bls_repeat_pk() -> None:
46
46
  n_keys = 400
47
47
  seed = b"a" * 32
48
48
  sks = [AugSchemeMPL.key_gen(seed) for i in range(n_keys)] + [AugSchemeMPL.key_gen(std_hash(seed))]
@@ -10,7 +10,7 @@ from multiprocessing import Pool, Queue, TimeoutError
10
10
  from pathlib import Path
11
11
  from threading import Thread
12
12
  from time import sleep
13
- from typing import Any, Dict, Optional
13
+ from typing import Any, Optional
14
14
 
15
15
  import pytest
16
16
  import yaml
@@ -37,7 +37,7 @@ from chia.util.timing import adjusted_timeout
37
37
 
38
38
  def write_config(
39
39
  root_path: Path,
40
- config: Dict,
40
+ config: dict,
41
41
  atomic_write: bool,
42
42
  do_sleep: bool,
43
43
  iterations: int,
@@ -74,7 +74,7 @@ def write_config(
74
74
 
75
75
 
76
76
  def read_and_compare_config(
77
- root_path: Path, default_config: Dict, do_sleep: bool, iterations: int, error_queue: Optional[Queue] = None
77
+ root_path: Path, default_config: dict, do_sleep: bool, iterations: int, error_queue: Optional[Queue] = None
78
78
  ):
79
79
  """
80
80
  Wait for a random amount of time, read the config and compare with the
@@ -99,7 +99,7 @@ def read_and_compare_config(
99
99
  raise
100
100
 
101
101
 
102
- async def create_reader_and_writer_tasks(root_path: Path, default_config: Dict):
102
+ async def create_reader_and_writer_tasks(root_path: Path, default_config: dict):
103
103
  """
104
104
  Spin-off reader and writer threads and wait for completion
105
105
  """
@@ -135,7 +135,7 @@ async def create_reader_and_writer_tasks(root_path: Path, default_config: Dict):
135
135
  raise error_queue.get()
136
136
 
137
137
 
138
- def run_reader_and_writer_tasks(root_path: Path, default_config: Dict):
138
+ def run_reader_and_writer_tasks(root_path: Path, default_config: dict):
139
139
  """
140
140
  Subprocess entry point. This function spins-off threads to perform read/write tasks
141
141
  concurrently, possibly leading to synchronization issues accessing config data.
@@ -144,12 +144,12 @@ def run_reader_and_writer_tasks(root_path: Path, default_config: Dict):
144
144
 
145
145
 
146
146
  @pytest.fixture(scope="function")
147
- def default_config_dict() -> Dict:
147
+ def default_config_dict() -> dict:
148
148
  """
149
149
  Returns a dictionary containing the default config.yaml contents
150
150
  """
151
151
  content: str = initial_config_file("config.yaml")
152
- config: Dict = yaml.safe_load(content)
152
+ config: dict = yaml.safe_load(content)
153
153
  return config
154
154
 
155
155
 
@@ -208,7 +208,7 @@ class TestConfig:
208
208
  """
209
209
  root_path: Path = root_path_populated_with_config
210
210
  # When: loading a newly created config
211
- config: Dict = load_config(root_path=root_path, filename="config.yaml")
211
+ config: dict = load_config(root_path=root_path, filename="config.yaml")
212
212
  assert config is not None
213
213
  # Expect: config values should match the defaults (from a small sampling)
214
214
  assert config["daemon_port"] == default_config_dict["daemon_port"] == 55400
@@ -242,7 +242,7 @@ class TestConfig:
242
242
  calling load_config().
243
243
  """
244
244
  root_path: Path = root_path_populated_with_config
245
- config: Dict = copy.deepcopy(default_config_dict)
245
+ config: dict = copy.deepcopy(default_config_dict)
246
246
  # When: modifying the config
247
247
  config["harvester"]["farmer_peers"][0]["host"] = "oldmacdonald.eie.io"
248
248
  # Sanity check that we didn't modify the default config
@@ -255,7 +255,7 @@ class TestConfig:
255
255
  save_config(root_path=root_path, filename="config.yaml", config_data=config)
256
256
 
257
257
  # Expect: modifications should be preserved in the config read from disk
258
- loaded: Dict = load_config(root_path=root_path, filename="config.yaml")
258
+ loaded: dict = load_config(root_path=root_path, filename="config.yaml")
259
259
  assert loaded["harvester"]["farmer_peers"][0]["host"] == "oldmacdonald.eie.io"
260
260
 
261
261
  def test_multiple_writers(self, root_path_populated_with_config, default_config_dict):
@@ -310,7 +310,7 @@ class TestConfig:
310
310
  await asyncio.gather(*all_tasks)
311
311
 
312
312
  @pytest.mark.parametrize("prefix", [None])
313
- def test_selected_network_address_prefix_default_config(self, config_with_address_prefix: Dict[str, Any]) -> None:
313
+ def test_selected_network_address_prefix_default_config(self, config_with_address_prefix: dict[str, Any]) -> None:
314
314
  """
315
315
  Temp config.yaml created using a default config. address_prefix is defaulted to "xch"
316
316
  """
@@ -319,7 +319,7 @@ class TestConfig:
319
319
  assert prefix == "xch"
320
320
 
321
321
  @pytest.mark.parametrize("prefix", ["txch"])
322
- def test_selected_network_address_prefix_testnet_config(self, config_with_address_prefix: Dict[str, Any]) -> None:
322
+ def test_selected_network_address_prefix_testnet_config(self, config_with_address_prefix: dict[str, Any]) -> None:
323
323
  """
324
324
  Temp config.yaml created using a modified config. address_prefix is set to "txch"
325
325
  """
@@ -327,7 +327,7 @@ class TestConfig:
327
327
  prefix = selected_network_address_prefix(config)
328
328
  assert prefix == "txch"
329
329
 
330
- def test_selected_network_address_prefix_config_dict(self, default_config_dict: Dict[str, Any]) -> None:
330
+ def test_selected_network_address_prefix_config_dict(self, default_config_dict: dict[str, Any]) -> None:
331
331
  """
332
332
  Modified config dictionary has address_prefix set to "customxch"
333
333
  """
@@ -336,7 +336,7 @@ class TestWriteFile:
336
336
  Write a file to a location and use the default permissions.
337
337
  """
338
338
 
339
- if sys.platform in ["win32", "cygwin"]:
339
+ if sys.platform in {"win32", "cygwin"}:
340
340
  pytest.skip("Setting UNIX file permissions doesn't apply to Windows")
341
341
 
342
342
  dest_path: Path = tmp_path / "test_write_file/test_write_file.txt"
@@ -355,7 +355,7 @@ class TestWriteFile:
355
355
  Write a file to a location and use custom permissions.
356
356
  """
357
357
 
358
- if sys.platform in ["win32", "cygwin"]:
358
+ if sys.platform in {"win32", "cygwin"}:
359
359
  pytest.skip("Setting UNIX file permissions doesn't apply to Windows")
360
360
 
361
361
  dest_path: Path = tmp_path / "test_write_file/test_write_file.txt"
@@ -1,14 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Any, Dict, List, Optional, Tuple
4
+ from typing import Any, Optional
5
5
 
6
6
  from chia.types.blockchain_format.sized_bytes import bytes32
7
7
  from chia.util.ints import uint32
8
8
  from chia.util.streamable import Streamable, recurse_jsonify, streamable
9
9
 
10
10
 
11
- def dict_with_types(d: Dict[str, Any]) -> Dict[str, Any]:
11
+ def dict_with_types(d: dict[str, Any]) -> dict[str, Any]:
12
12
  return {k: (v, type(v)) for k, v in d.items()}
13
13
 
14
14
 
@@ -46,7 +46,7 @@ def test_primitives() -> None:
46
46
  "set optional",
47
47
  "foobar",
48
48
  b"\0\1",
49
- bytes32([0] * 32),
49
+ bytes32.zeros,
50
50
  False,
51
51
  )
52
52
 
@@ -64,7 +64,7 @@ def test_list() -> None:
64
64
  @streamable
65
65
  @dataclass(frozen=True)
66
66
  class ListTest(Streamable):
67
- d: List[str]
67
+ d: list[str]
68
68
 
69
69
  t = ListTest(["foo", "bar"])
70
70
 
@@ -75,7 +75,7 @@ def test_tuple() -> None:
75
75
  @streamable
76
76
  @dataclass(frozen=True)
77
77
  class TupleTest(Streamable):
78
- d: Tuple[str, uint32, str]
78
+ d: tuple[str, uint32, str]
79
79
 
80
80
  t = TupleTest(("foo", uint32(123), "bar"))
81
81
 
@@ -85,14 +85,14 @@ def test_tuple() -> None:
85
85
  @streamable
86
86
  @dataclass(frozen=True)
87
87
  class NestedWithTupleInner(Streamable):
88
- a: Tuple[str, uint32, str]
88
+ a: tuple[str, uint32, str]
89
89
  b: bytes
90
90
 
91
91
 
92
92
  @streamable
93
93
  @dataclass(frozen=True)
94
94
  class NestedWithTupleOuter(Streamable):
95
- a: Tuple[NestedWithTupleInner, uint32, str]
95
+ a: tuple[NestedWithTupleInner, uint32, str]
96
96
 
97
97
 
98
98
  def test_nested_with_tuple() -> None:
@@ -113,7 +113,7 @@ class NestedWithListInner(Streamable):
113
113
  @streamable
114
114
  @dataclass(frozen=True)
115
115
  class NestedWithListOuter(Streamable):
116
- a: List[NestedWithListInner]
116
+ a: list[NestedWithListInner]
117
117
 
118
118
 
119
119
  def test_nested_with_list() -> None:
@@ -125,7 +125,7 @@ def test_nested_with_list() -> None:
125
125
  @streamable
126
126
  @dataclass(frozen=True)
127
127
  class TestNestedInner(Streamable):
128
- a: Tuple[str, uint32, str]
128
+ a: tuple[str, uint32, str]
129
129
  b: bytes
130
130
 
131
131
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import json
4
4
  import random
5
5
  from dataclasses import dataclass, replace
6
- from typing import Callable, List, Optional, Tuple
6
+ from typing import Callable, Optional
7
7
 
8
8
  import importlib_resources
9
9
  import pytest
@@ -180,7 +180,11 @@ class TestKeychain:
180
180
 
181
181
  # All added keys should still be valid with their label
182
182
  assert all(
183
- key_data in [key_data_0, key_data_1, key_data_2] for key_data in keychain.get_keys(include_secrets=True)
183
+ # This must be compared to a tuple because the `.mnemonic` property is a list which makes the
184
+ # class unhashable. We should eventually add support in streamable for varadic tuples and maybe remove
185
+ # support for the mutable `list`.
186
+ key_data in (key_data_0, key_data_1, key_data_2) # noqa: PLR6201
187
+ for key_data in keychain.get_keys(include_secrets=True)
184
188
  )
185
189
 
186
190
  def test_bip39_eip2333_test_vector(self, empty_temp_file_keyring: TempKeyring):
@@ -318,7 +322,7 @@ def test_key_data_without_secrets(key_info: KeyInfo) -> None:
318
322
  ((_24keyinfo.mnemonic.split(), _24keyinfo.entropy, KeyDataSecrets.generate().private_key), "private_key"),
319
323
  ],
320
324
  )
321
- def test_key_data_secrets_post_init(input_data: Tuple[List[str], bytes, PrivateKey], data_type: str) -> None:
325
+ def test_key_data_secrets_post_init(input_data: tuple[list[str], bytes, PrivateKey], data_type: str) -> None:
322
326
  with pytest.raises(KeychainKeyDataMismatch, match=data_type):
323
327
  KeyDataSecrets(*input_data)
324
328
 
@@ -339,7 +343,7 @@ def test_key_data_secrets_post_init(input_data: Tuple[List[str], bytes, PrivateK
339
343
  ],
340
344
  )
341
345
  def test_key_data_post_init(
342
- input_data: Tuple[uint32, G1Element, Optional[str], Optional[KeyDataSecrets]], data_type: str
346
+ input_data: tuple[uint32, G1Element, Optional[str], Optional[KeyDataSecrets]], data_type: str
343
347
  ) -> None:
344
348
  with pytest.raises(KeychainKeyDataMismatch, match=data_type):
345
349
  KeyData(*input_data)
@@ -427,7 +431,11 @@ async def test_set_label(get_temp_keyring: Keychain) -> None:
427
431
  keychain.set_label(fingerprint=key_data_1.fingerprint, label=key_data_1.label)
428
432
  assert key_data_0 == keychain.get_key(fingerprint=key_data_0.fingerprint, include_secrets=True)
429
433
  # All added keys should still be valid with their label
430
- assert all(key_data in [key_data_0, key_data_1] for key_data in keychain.get_keys(include_secrets=True))
434
+
435
+ # This must be compared to a tuple because the `.mnemonic` property is a list which makes the
436
+ # class unhashable. We should eventually add support in streamable for varadic tuples and maybe remove
437
+ # support for the mutable `list`.
438
+ assert all(key_data in (key_data_0, key_data_1) for key_data in keychain.get_keys(include_secrets=True)) # noqa: PLR6201
431
439
 
432
440
 
433
441
  @pytest.mark.parametrize(
@@ -1,14 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Type
5
4
 
6
5
  import pytest
7
6
 
8
7
  from chia.simulator.keyring import TempKeyring
9
8
  from chia.util.errors import KeychainFingerprintNotFound, KeychainLabelError, KeychainLabelExists, KeychainLabelInvalid
10
9
  from chia.util.file_keyring import Key
11
- from chia.util.keyring_wrapper import DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE, KeyringWrapper
10
+ from chia.util.keyring_wrapper import (
11
+ DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE,
12
+ KeyringWrapper,
13
+ obtain_current_passphrase,
14
+ )
12
15
 
13
16
  log = logging.getLogger(__name__)
14
17
 
@@ -260,8 +263,6 @@ class TestKeyringWrapper:
260
263
  assert KeyringWrapper.get_shared_instance().keyring.get_key("some service", "some user") is None
261
264
 
262
265
  # Check that metadata is properly deleted
263
- from chia.cmds.passphrase_funcs import obtain_current_passphrase
264
-
265
266
  passphrase = obtain_current_passphrase(use_passphrase_cache=True)
266
267
  assert KeyringWrapper.get_shared_instance().keyring.cached_file_content.get_decrypted_data_dict(passphrase) == {
267
268
  "keys": {},
@@ -457,7 +458,7 @@ class TestKeyringWrapper:
457
458
  ],
458
459
  )
459
460
  def test_set_label_failures(
460
- self, label: str, exception: Type[KeychainLabelError], message: str, empty_temp_file_keyring: TempKeyring
461
+ self, label: str, exception: type[KeychainLabelError], message: str, empty_temp_file_keyring: TempKeyring
461
462
  ) -> None:
462
463
  keyring_wrapper = KeyringWrapper.get_shared_instance()
463
464
  keyring_wrapper.keyring.set_label(1, "one")
@@ -4,7 +4,7 @@ import contextlib
4
4
  import dataclasses
5
5
  import logging
6
6
  import re
7
- from typing import Tuple, Type, Union
7
+ from typing import Union
8
8
 
9
9
  import pytest
10
10
 
@@ -21,8 +21,8 @@ def logger_fixture() -> logging.Logger:
21
21
 
22
22
  @dataclasses.dataclass
23
23
  class ErrorCase:
24
- type_to_raise: Type[BaseException]
25
- type_to_catch: Union[Type[BaseException], Tuple[Type[BaseException], ...]]
24
+ type_to_raise: type[BaseException]
25
+ type_to_catch: Union[type[BaseException], tuple[type[BaseException], ...]]
26
26
  should_match: bool
27
27
 
28
28