chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
@@ -4,8 +4,9 @@ import logging
4
4
  import pathlib
5
5
  import sys
6
6
  from multiprocessing import freeze_support
7
- from typing import Any, Dict, Optional
7
+ from typing import Any, Optional
8
8
 
9
+ from chia.apis import ApiProtocolRegistry
9
10
  from chia.consensus.constants import ConsensusConstants, replace_str_to_bytes
10
11
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
11
12
  from chia.rpc.crawler_rpc_api import CrawlerRpcApi
@@ -17,7 +18,7 @@ from chia.server.start_service import RpcInfo, Service, async_run
17
18
  from chia.types.aliases import CrawlerService
18
19
  from chia.util.chia_logging import initialize_service_logging
19
20
  from chia.util.config import load_config, load_config_cli
20
- from chia.util.default_root import DEFAULT_ROOT_PATH
21
+ from chia.util.default_root import resolve_root_path
21
22
 
22
23
  # See: https://bugs.python.org/issue29288
23
24
  "".encode("idna")
@@ -28,7 +29,7 @@ log = logging.getLogger(__name__)
28
29
 
29
30
  def create_full_node_crawler_service(
30
31
  root_path: pathlib.Path,
31
- config: Dict[str, Any],
32
+ config: dict[str, Any],
32
33
  consensus_constants: ConsensusConstants,
33
34
  connect_to_daemon: bool = True,
34
35
  start_crawler_loop: bool = True,
@@ -60,18 +61,19 @@ def create_full_node_crawler_service(
60
61
  network_id=network_id,
61
62
  rpc_info=rpc_info,
62
63
  connect_to_daemon=connect_to_daemon,
64
+ class_for_type=ApiProtocolRegistry,
63
65
  )
64
66
 
65
67
 
66
- async def async_main() -> int:
68
+ async def async_main(root_path: pathlib.Path) -> int:
67
69
  # TODO: refactor to avoid the double load
68
- config = load_config(DEFAULT_ROOT_PATH, "config.yaml")
69
- service_config = load_config_cli(DEFAULT_ROOT_PATH, "config.yaml", SERVICE_NAME)
70
+ config = load_config(root_path, "config.yaml")
71
+ service_config = load_config_cli(root_path, "config.yaml", SERVICE_NAME)
70
72
  config[SERVICE_NAME] = service_config
71
73
  overrides = service_config["network_overrides"]["constants"][service_config["selected_network"]]
72
74
  updated_constants = replace_str_to_bytes(DEFAULT_CONSTANTS, **overrides)
73
- initialize_service_logging(service_name=SERVICE_NAME, config=config)
74
- service = create_full_node_crawler_service(DEFAULT_ROOT_PATH, config, updated_constants)
75
+ initialize_service_logging(service_name=SERVICE_NAME, config=config, root_path=root_path)
76
+ service = create_full_node_crawler_service(root_path, config, updated_constants)
75
77
  async with SignalHandlers.manage() as signal_handlers:
76
78
  await service.setup_process_global_state(signal_handlers=signal_handlers)
77
79
  await service.run()
@@ -81,7 +83,9 @@ async def async_main() -> int:
81
83
 
82
84
  def main() -> int:
83
85
  freeze_support()
84
- return async_run(async_main())
86
+ root_path = resolve_root_path(override=None)
87
+
88
+ return async_run(async_main(root_path=root_path))
85
89
 
86
90
 
87
91
  if __name__ == "__main__":
@@ -6,7 +6,7 @@ import time
6
6
  from asyncio import Lock
7
7
  from random import choice, randrange
8
8
  from secrets import randbits
9
- from typing import Dict, List, Optional, Set, Tuple
9
+ from typing import Optional
10
10
 
11
11
  from chia.types.peer_info import PeerInfo, TimestampedPeerInfo
12
12
  from chia.util.hash import std_hash
@@ -81,7 +81,7 @@ class ExtendedPeerInfo:
81
81
  bytes(std_hash(key.to_bytes(32, byteorder="big") + self.peer_info.get_key())[:8]),
82
82
  byteorder="big",
83
83
  )
84
- hash1 = hash1 % TRIED_BUCKETS_PER_GROUP
84
+ hash1 %= TRIED_BUCKETS_PER_GROUP
85
85
  hash2 = int.from_bytes(
86
86
  bytes(std_hash(key.to_bytes(32, byteorder="big") + self.peer_info.get_group() + bytes([hash1]))[:8]),
87
87
  byteorder="big",
@@ -96,7 +96,7 @@ class ExtendedPeerInfo:
96
96
  bytes(std_hash(key.to_bytes(32, byteorder="big") + self.peer_info.get_group() + src_peer.get_group())[:8]),
97
97
  byteorder="big",
98
98
  )
99
- hash1 = hash1 % NEW_BUCKETS_PER_SOURCE_GROUP
99
+ hash1 %= NEW_BUCKETS_PER_SOURCE_GROUP
100
100
  hash2 = int.from_bytes(
101
101
  bytes(std_hash(key.to_bytes(32, byteorder="big") + src_peer.get_group() + bytes([hash1]))[:8]),
102
102
  byteorder="big",
@@ -162,17 +162,17 @@ class ExtendedPeerInfo:
162
162
  class AddressManager:
163
163
  id_count: int
164
164
  key: int
165
- random_pos: List[int]
166
- tried_matrix: List[List[int]]
167
- new_matrix: List[List[int]]
165
+ random_pos: list[int]
166
+ tried_matrix: list[list[int]]
167
+ new_matrix: list[list[int]]
168
168
  tried_count: int
169
169
  new_count: int
170
- map_addr: Dict[str, int]
171
- map_info: Dict[int, ExtendedPeerInfo]
170
+ map_addr: dict[str, int]
171
+ map_info: dict[int, ExtendedPeerInfo]
172
172
  last_good: int
173
- tried_collisions: List[int]
174
- used_new_matrix_positions: Set[Tuple[int, int]]
175
- used_tried_matrix_positions: Set[Tuple[int, int]]
173
+ tried_collisions: list[int]
174
+ used_new_matrix_positions: set[tuple[int, int]]
175
+ used_tried_matrix_positions: set[tuple[int, int]]
176
176
  allow_private_subnets: bool
177
177
 
178
178
  def __init__(self) -> None:
@@ -230,7 +230,7 @@ class AddressManager:
230
230
  if self.tried_matrix[bucket][pos] != -1:
231
231
  self.used_tried_matrix_positions.add((bucket, pos))
232
232
 
233
- def create_(self, addr: TimestampedPeerInfo, addr_src: Optional[PeerInfo]) -> Tuple[ExtendedPeerInfo, int]:
233
+ def create_(self, addr: TimestampedPeerInfo, addr_src: Optional[PeerInfo]) -> tuple[ExtendedPeerInfo, int]:
234
234
  self.id_count += 1
235
235
  node_id = self.id_count
236
236
  self.map_info[node_id] = ExtendedPeerInfo(addr, addr_src)
@@ -239,7 +239,7 @@ class AddressManager:
239
239
  self.random_pos.append(node_id)
240
240
  return (self.map_info[node_id], node_id)
241
241
 
242
- def find_(self, addr: PeerInfo) -> Tuple[Optional[ExtendedPeerInfo], Optional[int]]:
242
+ def find_(self, addr: PeerInfo) -> tuple[Optional[ExtendedPeerInfo], Optional[int]]:
243
243
  if addr.host not in self.map_addr:
244
244
  return (None, None)
245
245
  node_id = self.map_addr[addr.host]
@@ -445,7 +445,7 @@ class AddressManager:
445
445
  if not new_only and self.tried_count > 0 and (self.new_count == 0 or randrange(2) == 0):
446
446
  chance = 1.0
447
447
  start = time.time()
448
- cached_tried_matrix_positions: List[Tuple[int, int]] = []
448
+ cached_tried_matrix_positions: list[tuple[int, int]] = []
449
449
  if len(self.used_tried_matrix_positions) < math.sqrt(TRIED_BUCKET_COUNT * BUCKET_SIZE):
450
450
  cached_tried_matrix_positions = list(self.used_tried_matrix_positions)
451
451
  while True:
@@ -475,7 +475,7 @@ class AddressManager:
475
475
  else:
476
476
  chance = 1.0
477
477
  start = time.time()
478
- cached_new_matrix_positions: List[Tuple[int, int]] = []
478
+ cached_new_matrix_positions: list[tuple[int, int]] = []
479
479
  if len(self.used_new_matrix_positions) < math.sqrt(NEW_BUCKET_COUNT * BUCKET_SIZE):
480
480
  cached_new_matrix_positions = list(self.used_new_matrix_positions)
481
481
  while True:
@@ -542,8 +542,8 @@ class AddressManager:
542
542
  old_id = self.tried_matrix[tried_bucket][tried_bucket_pos]
543
543
  return self.map_info[old_id]
544
544
 
545
- def get_peers_(self) -> List[TimestampedPeerInfo]:
546
- addr: List[TimestampedPeerInfo] = []
545
+ def get_peers_(self) -> list[TimestampedPeerInfo]:
546
+ addr: list[TimestampedPeerInfo] = []
547
547
  num_nodes = min(1000, math.ceil(23 * len(self.random_pos) / 100))
548
548
  for n in range(len(self.random_pos)):
549
549
  if len(addr) >= num_nodes:
@@ -596,7 +596,7 @@ class AddressManager:
596
596
 
597
597
  async def add_to_new_table(
598
598
  self,
599
- addresses: List[TimestampedPeerInfo],
599
+ addresses: list[TimestampedPeerInfo],
600
600
  source: Optional[PeerInfo] = None,
601
601
  penalty: int = 0,
602
602
  ) -> bool:
@@ -647,7 +647,7 @@ class AddressManager:
647
647
  return self.select_peer_(new_only)
648
648
 
649
649
  # Return a bunch of addresses, selected at random.
650
- async def get_peers(self) -> List[TimestampedPeerInfo]:
650
+ async def get_peers(self) -> list[TimestampedPeerInfo]:
651
651
  async with self.lock:
652
652
  return self.get_peers_()
653
653
 
@@ -5,7 +5,7 @@ import logging
5
5
  from dataclasses import dataclass
6
6
  from pathlib import Path
7
7
  from timeit import default_timer as timer
8
- from typing import Any, Dict, List, Optional, Tuple
8
+ from typing import Any, Optional
9
9
 
10
10
  import aiofiles
11
11
 
@@ -30,19 +30,19 @@ class PeerDataSerialization(Streamable):
30
30
  Serializable property bag for the peer data that was previously stored in sqlite.
31
31
  """
32
32
 
33
- metadata: List[Tuple[str, str]]
34
- nodes: List[Tuple[uint64, str]]
35
- new_table: List[Tuple[uint64, uint64]]
33
+ metadata: list[tuple[str, str]]
34
+ nodes: list[tuple[uint64, str]]
35
+ new_table: list[tuple[uint64, uint64]]
36
36
 
37
37
 
38
38
  async def makePeerDataSerialization(
39
- metadata: List[Tuple[str, Any]], nodes: List[Tuple[int, ExtendedPeerInfo]], new_table: List[Tuple[int, int]]
39
+ metadata: list[tuple[str, Any]], nodes: list[tuple[int, ExtendedPeerInfo]], new_table: list[tuple[int, int]]
40
40
  ) -> bytes:
41
41
  """
42
42
  Create a PeerDataSerialization, adapting the provided collections
43
43
  """
44
- transformed_nodes: List[Tuple[uint64, str]] = []
45
- transformed_new_table: List[Tuple[uint64, uint64]] = []
44
+ transformed_nodes: list[tuple[uint64, str]] = []
45
+ transformed_new_table: list[tuple[uint64, uint64]] = []
46
46
 
47
47
  for index, [node_id, peer_info] in enumerate(nodes):
48
48
  transformed_nodes.append((uint64(node_id), peer_info.to_string()))
@@ -101,10 +101,10 @@ class AddressManagerStore:
101
101
  """
102
102
  Serialize the address manager's peer data to a file.
103
103
  """
104
- metadata: List[Tuple[str, str]] = []
105
- nodes: List[Tuple[int, ExtendedPeerInfo]] = []
106
- new_table_entries: List[Tuple[int, int]] = []
107
- unique_ids: Dict[int, int] = {}
104
+ metadata: list[tuple[str, str]] = []
105
+ nodes: list[tuple[int, ExtendedPeerInfo]] = []
106
+ new_table_entries: list[tuple[int, int]] = []
107
+ unique_ids: dict[int, int] = {}
108
108
  count_ids: int = 0
109
109
 
110
110
  log.info("Serializing peer data")
@@ -157,11 +157,11 @@ class AddressManagerStore:
157
157
  log.exception(f"Unable to deserialize peers from {peers_file_path}")
158
158
 
159
159
  if peer_data is not None:
160
- metadata: Dict[str, str] = {key: value for key, value in peer_data.metadata}
161
- nodes: List[Tuple[int, ExtendedPeerInfo]] = [
160
+ metadata: dict[str, str] = {key: value for key, value in peer_data.metadata}
161
+ nodes: list[tuple[int, ExtendedPeerInfo]] = [
162
162
  (node_id, ExtendedPeerInfo.from_string(info_str)) for node_id, info_str in peer_data.nodes
163
163
  ]
164
- new_table_entries: List[Tuple[int, int]] = [(node_id, bucket) for node_id, bucket in peer_data.new_table]
164
+ new_table_entries: list[tuple[int, int]] = [(node_id, bucket) for node_id, bucket in peer_data.new_table]
165
165
  log.debug(f"Deserializing peer data took {timer() - start_time} seconds")
166
166
 
167
167
  address_manager.key = int(metadata["key"])
@@ -226,9 +226,9 @@ class AddressManagerStore:
226
226
  async def _write_peers(
227
227
  cls,
228
228
  peers_file_path: Path,
229
- metadata: List[Tuple[str, Any]],
230
- nodes: List[Tuple[int, ExtendedPeerInfo]],
231
- new_table: List[Tuple[int, int]],
229
+ metadata: list[tuple[str, Any]],
230
+ nodes: list[tuple[int, ExtendedPeerInfo]],
231
+ new_table: list[tuple[int, int]],
232
232
  ) -> None:
233
233
  """
234
234
  Serializes the given peer data and writes it to the peers file.
@@ -1,11 +1,116 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import functools
4
+ import logging
5
+ from collections.abc import Awaitable
6
+ from dataclasses import dataclass, field
3
7
  from logging import Logger
8
+ from typing import Callable, ClassVar, Optional, TypeVar, Union, final, get_type_hints
4
9
 
5
- from typing_extensions import Protocol
10
+ from typing_extensions import Concatenate, ParamSpec, Protocol
11
+
12
+ from chia.protocols.protocol_message_types import ProtocolMessageTypes
13
+ from chia.server.outbound_message import Message
14
+ from chia.util.streamable import Streamable
6
15
 
7
16
 
8
17
  class ApiProtocol(Protocol):
9
18
  log: Logger
19
+ metadata: ClassVar[ApiMetadata]
10
20
 
11
21
  def ready(self) -> bool: ...
22
+
23
+
24
+ log = logging.getLogger(__name__)
25
+ P = ParamSpec("P")
26
+ R = TypeVar("R", bound=Awaitable[Optional[Message]])
27
+ S = TypeVar("S", bound=Streamable)
28
+ Self = TypeVar("Self")
29
+ api_attribute_name = "_chia_api"
30
+
31
+
32
+ @dataclass
33
+ class ApiRequest:
34
+ request_type: ProtocolMessageTypes
35
+ message_class: type[Streamable]
36
+ method: Callable[..., Awaitable[Optional[Message]]]
37
+ peer_required: bool = False
38
+ bytes_required: bool = False
39
+ execute_task: bool = False
40
+ reply_types: list[ProtocolMessageTypes] = field(default_factory=list)
41
+
42
+
43
+ @final
44
+ @dataclass
45
+ class ApiMetadata:
46
+ message_type_to_request: dict[ProtocolMessageTypes, ApiRequest] = field(default_factory=dict)
47
+
48
+ @classmethod
49
+ def copy(cls, original: ApiMetadata) -> ApiMetadata:
50
+ return cls(message_type_to_request=dict(original.message_type_to_request))
51
+
52
+ @classmethod
53
+ def from_bound_method(cls, method: Callable[..., Awaitable[Optional[Message]]]) -> ApiRequest:
54
+ self: ApiMetadata = getattr(method, api_attribute_name)
55
+ message_type = ProtocolMessageTypes[method.__name__]
56
+ return self.message_type_to_request[message_type]
57
+
58
+ # TODO: This hinting does not express that the returned callable *_bytes parameter
59
+ # corresponding to the first parameter name will be filled in by the wrapper.
60
+ def request(
61
+ self,
62
+ peer_required: bool = False,
63
+ bytes_required: bool = False,
64
+ execute_task: bool = False,
65
+ reply_types: Optional[list[ProtocolMessageTypes]] = None,
66
+ request_type: Optional[ProtocolMessageTypes] = None,
67
+ ) -> Callable[[Callable[Concatenate[Self, S, P], R]], Callable[Concatenate[Self, Union[bytes, S], P], R]]:
68
+ non_optional_reply_types: list[ProtocolMessageTypes]
69
+ if reply_types is None:
70
+ non_optional_reply_types = []
71
+ else:
72
+ non_optional_reply_types = reply_types
73
+
74
+ def inner(f: Callable[Concatenate[Self, S, P], R]) -> Callable[Concatenate[Self, Union[bytes, S], P], R]:
75
+ @functools.wraps(f)
76
+ def wrapper(self: Self, original: Union[bytes, S], *args: P.args, **kwargs: P.kwargs) -> R:
77
+ arg: S
78
+ if isinstance(original, bytes):
79
+ if request.bytes_required:
80
+ kwargs[message_name_bytes] = original
81
+ arg = message_class.from_bytes(original)
82
+ else:
83
+ arg = original
84
+ if request.bytes_required:
85
+ kwargs[message_name_bytes] = bytes(original)
86
+
87
+ return f(self, arg, *args, **kwargs)
88
+
89
+ setattr(wrapper, api_attribute_name, self)
90
+ message_name, message_class = next(
91
+ (name, hint) for name, hint in get_type_hints(f).items() if name not in {"self", "peer", "return"}
92
+ )
93
+ message_name_bytes = f"{message_name}_bytes"
94
+
95
+ nonlocal request_type
96
+ if request_type is None:
97
+ request_type = ProtocolMessageTypes[f.__name__]
98
+
99
+ request = ApiRequest(
100
+ request_type=request_type,
101
+ peer_required=peer_required,
102
+ bytes_required=bytes_required,
103
+ execute_task=execute_task,
104
+ reply_types=non_optional_reply_types,
105
+ message_class=message_class,
106
+ method=wrapper,
107
+ )
108
+
109
+ if request_type in self.message_type_to_request:
110
+ raise Exception(f"request type already registered: {request_type}")
111
+
112
+ self.message_type_to_request[request_type] = request
113
+
114
+ return wrapper
115
+
116
+ return inner
@@ -1,16 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Iterable, List, Set, Tuple
3
+ from collections.abc import Iterable
4
4
 
5
5
  from chia.protocols.shared_protocol import Capability
6
6
  from chia.util.ints import uint16
7
7
 
8
8
 
9
- def known_active_capabilities(values: Iterable[Tuple[uint16, str]]) -> List[Capability]:
9
+ def known_active_capabilities(values: Iterable[tuple[uint16, str]]) -> list[Capability]:
10
10
  # NOTE: order is not guaranteed
11
11
  # TODO: what if there's a claim for both supporting and not?
12
12
  # presently it considers it supported
13
- filtered: Set[Capability] = set()
13
+ filtered: set[Capability] = set()
14
14
  for value, state in values:
15
15
  if state != "1":
16
16
  continue
@@ -11,7 +11,8 @@ if sys.platform == "win32":
11
11
  import _overlapped
12
12
  import _winapi
13
13
 
14
- from typing import TYPE_CHECKING, Any, Callable, Iterable, Optional, Tuple, Union
14
+ from collections.abc import Iterable
15
+ from typing import TYPE_CHECKING, Any, Callable, Optional, Union
15
16
 
16
17
  from typing_extensions import Protocol, TypeAlias
17
18
 
@@ -30,7 +31,7 @@ if TYPE_CHECKING:
30
31
  # https://github.com/python/typeshed/pull/5718/files
31
32
  def __call__(self) -> asyncio.protocols.BaseProtocol: ...
32
33
 
33
- _SSLContext: TypeAlias = Union[bool, None, ssl.SSLContext]
34
+ _SSLContext: TypeAlias = Union[bool, ssl.SSLContext, None]
34
35
 
35
36
  # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/base_events.py#L389
36
37
  # https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/base_events.pyi#L64
@@ -83,7 +84,7 @@ if TYPE_CHECKING:
83
84
  self,
84
85
  ov: _overlapped.Overlapped,
85
86
  obj: socket.socket,
86
- callback: Callable[[object, socket.socket, _overlapped.Overlapped], Tuple[socket.socket, object]],
87
+ callback: Callable[[object, socket.socket, _overlapped.Overlapped], tuple[socket.socket, object]],
87
88
  ) -> _OverlappedFuture: ...
88
89
 
89
90
  def _get_accept_socket(self, family: socket.AddressFamily) -> socket.socket: ...
@@ -251,30 +252,30 @@ if sys.platform == "win32":
251
252
  def disable_connections(self) -> None:
252
253
  self.allow_connections = False
253
254
 
254
- async def _chia_accept_loop(self, listener: socket.socket) -> Tuple[socket.socket, Tuple[object, ...]]:
255
+ async def _chia_accept_loop(self, listener: socket.socket) -> tuple[socket.socket, tuple[object, ...]]:
255
256
  while True:
256
- # TODO: switch to Event code.
257
- while not self.allow_connections:
257
+ # TODO: switch to event drive code
258
+ while not self.allow_connections: # noqa: ASYNC110
258
259
  await asyncio.sleep(0.01)
259
260
 
260
261
  try:
261
262
  return await self._chia_accept(listener)
262
263
  except OSError as exc:
263
- if exc.winerror not in ( # pylint: disable=E1101
264
+ if exc.winerror not in {
264
265
  _winapi.ERROR_NETNAME_DELETED,
265
266
  _winapi.ERROR_OPERATION_ABORTED,
266
- ):
267
+ }:
267
268
  raise
268
269
 
269
- def _chia_accept(self, listener: socket.socket) -> asyncio.Future[Tuple[socket.socket, Tuple[object, ...]]]:
270
+ def _chia_accept(self, listener: socket.socket) -> asyncio.Future[tuple[socket.socket, tuple[object, ...]]]:
270
271
  self._register_with_iocp(listener)
271
- conn = self._get_accept_socket(listener.family) # pylint: disable=assignment-from-no-return
272
+ conn = self._get_accept_socket(listener.family)
272
273
  ov = _overlapped.Overlapped(_winapi.NULL)
273
274
  ov.AcceptEx(listener.fileno(), conn.fileno())
274
275
 
275
276
  def finish_accept(
276
277
  trans: object, key: socket.socket, ov: _overlapped.Overlapped
277
- ) -> Tuple[socket.socket, object]:
278
+ ) -> tuple[socket.socket, object]:
278
279
  ov.getresult()
279
280
  # Use SO_UPDATE_ACCEPT_CONTEXT so getsockname() etc work.
280
281
  buf = struct.pack("@P", listener.fileno())
@@ -291,18 +292,18 @@ if sys.platform == "win32":
291
292
  raise
292
293
  except OSError as exc:
293
294
  # https://github.com/python/cpython/issues/93821#issuecomment-1157945855
294
- if exc.winerror not in ( # pylint: disable=E1101
295
+ if exc.winerror not in {
295
296
  _winapi.ERROR_NETNAME_DELETED,
296
297
  _winapi.ERROR_OPERATION_ABORTED,
297
- ):
298
+ }:
298
299
  raise
299
300
 
300
- future = self._register(ov, listener, finish_accept) # pylint: disable=assignment-from-no-return
301
+ future = self._register(ov, listener, finish_accept)
301
302
  coro = accept_coro(self, future, conn)
302
- asyncio.ensure_future(coro, loop=self._loop)
303
+ asyncio.ensure_future(coro, loop=self._loop) # noqa: RUF006
303
304
  return future
304
305
 
305
- def accept(self, listener: socket.socket) -> asyncio.Future[Tuple[socket.socket, Tuple[object, ...]]]:
306
+ def accept(self, listener: socket.socket) -> asyncio.Future[tuple[socket.socket, tuple[object, ...]]]:
306
307
  coro = self._chia_accept_loop(listener)
307
308
  return asyncio.ensure_future(coro)
308
309
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import random
4
4
  import time
5
5
  from dataclasses import dataclass
6
- from typing import List, Optional, Set
6
+ from typing import Optional
7
7
 
8
8
  from chia.types.peer_info import PeerInfo
9
9
  from chia.util.ints import uint16, uint64
@@ -40,7 +40,7 @@ class IntroducerPeers:
40
40
  """
41
41
 
42
42
  def __init__(self) -> None:
43
- self._peers: Set[VettedPeer] = set()
43
+ self._peers: set[VettedPeer] = set()
44
44
 
45
45
  def add(self, peer: Optional[PeerInfo]) -> bool:
46
46
  if peer is None or not peer.port:
@@ -66,7 +66,7 @@ class IntroducerPeers:
66
66
 
67
67
  def get_peers(
68
68
  self, max_peers: int = 0, randomize: bool = False, recent_threshold: float = 9999999
69
- ) -> List[VettedPeer]:
69
+ ) -> list[VettedPeer]:
70
70
  target_peers = [peer for peer in self._peers if time.time() - float(peer.time_added) < recent_threshold]
71
71
  if not max_peers or max_peers > len(target_peers):
72
72
  max_peers = len(target_peers)