chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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 (531) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_blockchain_transactions.py +5 -2
  6. chia/_tests/blockchain/test_build_chains.py +2 -4
  7. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  8. chia/_tests/clvm/coin_store.py +4 -7
  9. chia/_tests/clvm/test_clvm_step.py +4 -4
  10. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  11. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  12. chia/_tests/clvm/test_singletons.py +2 -4
  13. chia/_tests/clvm/test_spend_sim.py +2 -2
  14. chia/_tests/cmds/cmd_test_utils.py +27 -45
  15. chia/_tests/cmds/test_cmd_framework.py +6 -6
  16. chia/_tests/cmds/test_daemon.py +3 -3
  17. chia/_tests/cmds/test_show.py +4 -4
  18. chia/_tests/cmds/test_tx_config_args.py +1 -2
  19. chia/_tests/cmds/testing_classes.py +4 -5
  20. chia/_tests/cmds/wallet/test_did.py +24 -27
  21. chia/_tests/cmds/wallet/test_nft.py +12 -10
  22. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  23. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  24. chia/_tests/conftest.py +66 -31
  25. chia/_tests/connection_utils.py +2 -2
  26. chia/_tests/core/cmds/test_beta.py +4 -4
  27. chia/_tests/core/cmds/test_keys.py +2 -3
  28. chia/_tests/core/cmds/test_wallet.py +15 -15
  29. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  30. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  31. chia/_tests/core/daemon/test_daemon.py +11 -11
  32. chia/_tests/core/data_layer/conftest.py +2 -2
  33. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  34. chia/_tests/core/data_layer/test_data_store.py +10 -10
  35. chia/_tests/core/data_layer/util.py +11 -11
  36. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  37. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  38. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  39. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  40. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  41. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  42. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  43. chia/_tests/core/full_node/test_conditions.py +21 -23
  44. chia/_tests/core/full_node/test_full_node.py +273 -70
  45. chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
  46. chia/_tests/core/full_node/test_hint_management.py +2 -4
  47. chia/_tests/core/full_node/test_performance.py +0 -1
  48. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  49. chia/_tests/core/full_node/test_transactions.py +1 -2
  50. chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
  51. chia/_tests/core/mempool/test_mempool.py +54 -50
  52. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  53. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  54. chia/_tests/core/mempool/test_mempool_manager.py +988 -854
  55. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  56. chia/_tests/core/server/serve.py +7 -7
  57. chia/_tests/core/server/test_dos.py +1 -2
  58. chia/_tests/core/server/test_event_loop.py +12 -4
  59. chia/_tests/core/server/test_loop.py +7 -8
  60. chia/_tests/core/server/test_rate_limits.py +9 -8
  61. chia/_tests/core/server/test_server.py +61 -1
  62. chia/_tests/core/services/test_services.py +2 -2
  63. chia/_tests/core/ssl/test_ssl.py +2 -2
  64. chia/_tests/core/test_cost_calculation.py +2 -6
  65. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  66. chia/_tests/core/test_filter.py +0 -1
  67. chia/_tests/core/test_full_node_rpc.py +2 -2
  68. chia/_tests/core/test_merkle_set.py +1 -2
  69. chia/_tests/core/test_seeder.py +4 -4
  70. chia/_tests/core/util/test_config.py +4 -4
  71. chia/_tests/core/util/test_jsonify.py +2 -2
  72. chia/_tests/core/util/test_keychain.py +3 -3
  73. chia/_tests/core/util/test_lockfile.py +2 -1
  74. chia/_tests/core/util/test_log_exceptions.py +1 -2
  75. chia/_tests/core/util/test_streamable.py +17 -17
  76. chia/_tests/db/test_db_wrapper.py +3 -2
  77. chia/_tests/environments/wallet.py +14 -14
  78. chia/_tests/ether.py +4 -3
  79. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  80. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  81. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  82. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  83. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  84. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  85. chia/_tests/harvester/test_harvester_api.py +11 -4
  86. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  87. chia/_tests/plot_sync/test_receiver.py +11 -10
  88. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  89. chia/_tests/plot_sync/util.py +1 -2
  90. chia/_tests/plotting/test_plot_manager.py +7 -6
  91. chia/_tests/plotting/test_prover.py +30 -38
  92. chia/_tests/pools/test_pool_cmdline.py +4 -6
  93. chia/_tests/pools/test_pool_rpc.py +203 -61
  94. chia/_tests/pools/test_pool_wallet.py +3 -3
  95. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  96. chia/_tests/process_junit.py +2 -2
  97. chia/_tests/rpc/test_rpc_client.py +4 -4
  98. chia/_tests/rpc/test_rpc_server.py +3 -3
  99. chia/_tests/simulation/test_simulation.py +12 -25
  100. chia/_tests/solver/test_solver_service.py +13 -4
  101. chia/_tests/testconfig.py +2 -2
  102. chia/_tests/timelord/test_new_peak.py +22 -11
  103. chia/_tests/tools/test_run_block.py +0 -2
  104. chia/_tests/tools/test_virtual_project.py +2 -1
  105. chia/_tests/util/benchmarks.py +1 -0
  106. chia/_tests/util/blockchain.py +38 -36
  107. chia/_tests/util/blockchain_mock.py +11 -11
  108. chia/_tests/util/build_network_protocol_files.py +2 -1
  109. chia/_tests/util/coin_store.py +2 -1
  110. chia/_tests/util/config.py +1 -1
  111. chia/_tests/util/db_connection.py +2 -3
  112. chia/_tests/util/full_sync.py +9 -11
  113. chia/_tests/util/gen_ssl_certs.py +4 -5
  114. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  115. chia/_tests/util/misc.py +24 -24
  116. chia/_tests/util/network_protocol_data.py +20 -3
  117. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  118. chia/_tests/util/protocol_messages_json.py +292 -3
  119. chia/_tests/util/setup_nodes.py +62 -47
  120. chia/_tests/util/spend_sim.py +57 -57
  121. chia/_tests/util/test_async_pool.py +2 -3
  122. chia/_tests/util/test_chia_version.py +1 -3
  123. chia/_tests/util/test_config.py +3 -3
  124. chia/_tests/util/test_full_block_utils.py +6 -3
  125. chia/_tests/util/test_limited_semaphore.py +1 -2
  126. chia/_tests/util/test_misc.py +2 -2
  127. chia/_tests/util/test_network.py +1 -2
  128. chia/_tests/util/test_priority_mutex.py +3 -3
  129. chia/_tests/util/test_recursive_replace.py +5 -6
  130. chia/_tests/util/test_replace_str_to_bytes.py +9 -10
  131. chia/_tests/util/test_testnet_overrides.py +3 -3
  132. chia/_tests/util/time_out_assert.py +2 -2
  133. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  134. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  135. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  136. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  137. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  138. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  139. chia/_tests/wallet/conftest.py +6 -6
  140. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  141. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  142. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  145. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  146. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  147. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  148. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  149. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  150. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  151. chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
  152. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  153. chia/_tests/wallet/test_coin_management.py +2 -2
  154. chia/_tests/wallet/test_conditions.py +45 -51
  155. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  156. chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
  157. chia/_tests/wallet/test_notifications.py +14 -14
  158. chia/_tests/wallet/test_signer_protocol.py +5 -5
  159. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  160. chia/_tests/wallet/test_transaction_store.py +20 -20
  161. chia/_tests/wallet/test_util.py +2 -2
  162. chia/_tests/wallet/test_wallet.py +380 -228
  163. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  164. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  165. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  166. chia/_tests/wallet/test_wallet_node.py +16 -15
  167. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  168. chia/_tests/wallet/test_wallet_utils.py +2 -3
  169. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  170. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  171. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  172. chia/_tests/wallet/wallet_block_tools.py +12 -11
  173. chia/_tests/weight_proof/config.py +1 -0
  174. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  175. chia/apis/__init__.py +21 -0
  176. chia/apis/farmer_stub.py +102 -0
  177. chia/apis/full_node_stub.py +374 -0
  178. chia/apis/harvester_stub.py +57 -0
  179. chia/apis/introducer_stub.py +35 -0
  180. chia/apis/solver_stub.py +30 -0
  181. chia/apis/stub_protocol_registry.py +21 -0
  182. chia/apis/timelord_stub.py +39 -0
  183. chia/apis/wallet_stub.py +161 -0
  184. chia/cmds/beta.py +3 -4
  185. chia/cmds/beta_funcs.py +4 -3
  186. chia/cmds/check_wallet_db.py +4 -4
  187. chia/cmds/chia.py +1 -2
  188. chia/cmds/cmd_classes.py +11 -13
  189. chia/cmds/cmd_helpers.py +11 -11
  190. chia/cmds/cmds_util.py +15 -15
  191. chia/cmds/coin_funcs.py +6 -7
  192. chia/cmds/coins.py +2 -3
  193. chia/cmds/configure.py +1 -2
  194. chia/cmds/data.py +42 -42
  195. chia/cmds/data_funcs.py +81 -81
  196. chia/cmds/db.py +4 -5
  197. chia/cmds/db_backup_func.py +2 -2
  198. chia/cmds/db_upgrade_func.py +3 -3
  199. chia/cmds/db_validate_func.py +2 -2
  200. chia/cmds/dev/data.py +4 -4
  201. chia/cmds/dev/gh.py +5 -5
  202. chia/cmds/dev/installers.py +2 -3
  203. chia/cmds/dev/mempool.py +3 -4
  204. chia/cmds/dev/mempool_funcs.py +4 -4
  205. chia/cmds/dev/sim.py +8 -8
  206. chia/cmds/dump_keyring.py +3 -3
  207. chia/cmds/farm.py +6 -8
  208. chia/cmds/farm_funcs.py +25 -24
  209. chia/cmds/init_funcs.py +4 -4
  210. chia/cmds/keys.py +16 -18
  211. chia/cmds/keys_funcs.py +36 -36
  212. chia/cmds/netspace.py +1 -3
  213. chia/cmds/netspace_funcs.py +1 -2
  214. chia/cmds/options.py +3 -2
  215. chia/cmds/param_types.py +17 -16
  216. chia/cmds/passphrase.py +6 -7
  217. chia/cmds/passphrase_funcs.py +11 -13
  218. chia/cmds/peer.py +1 -3
  219. chia/cmds/peer_funcs.py +3 -3
  220. chia/cmds/plotnft.py +6 -7
  221. chia/cmds/plotnft_funcs.py +37 -26
  222. chia/cmds/rpc.py +3 -3
  223. chia/cmds/show.py +3 -5
  224. chia/cmds/show_funcs.py +9 -9
  225. chia/cmds/sim_funcs.py +25 -26
  226. chia/cmds/solver.py +1 -3
  227. chia/cmds/solver_funcs.py +1 -2
  228. chia/cmds/start_funcs.py +2 -2
  229. chia/cmds/wallet.py +76 -81
  230. chia/cmds/wallet_funcs.py +206 -177
  231. chia/consensus/augmented_chain.py +6 -6
  232. chia/consensus/block_body_validation.py +19 -15
  233. chia/consensus/block_creation.py +25 -21
  234. chia/consensus/block_header_validation.py +27 -13
  235. chia/consensus/block_height_map.py +3 -6
  236. chia/consensus/block_height_map_protocol.py +2 -2
  237. chia/consensus/block_record.py +2 -4
  238. chia/consensus/blockchain.py +58 -40
  239. chia/consensus/blockchain_interface.py +7 -7
  240. chia/consensus/coin_store_protocol.py +5 -6
  241. chia/consensus/condition_tools.py +4 -4
  242. chia/consensus/cost_calculator.py +2 -3
  243. chia/consensus/default_constants.py +19 -13
  244. chia/consensus/deficit.py +1 -3
  245. chia/consensus/difficulty_adjustment.py +3 -5
  246. chia/consensus/find_fork_point.py +2 -4
  247. chia/consensus/full_block_to_block_record.py +11 -13
  248. chia/consensus/generator_tools.py +2 -3
  249. chia/consensus/get_block_challenge.py +50 -26
  250. chia/consensus/get_block_generator.py +2 -3
  251. chia/consensus/make_sub_epoch_summary.py +8 -7
  252. chia/consensus/multiprocess_validation.py +31 -20
  253. chia/consensus/pos_quality.py +6 -23
  254. chia/consensus/pot_iterations.py +17 -44
  255. chia/consensus/signage_point.py +4 -5
  256. chia/consensus/vdf_info_computation.py +2 -4
  257. chia/daemon/client.py +8 -8
  258. chia/daemon/keychain_proxy.py +31 -37
  259. chia/daemon/server.py +32 -33
  260. chia/daemon/windows_signal.py +4 -3
  261. chia/data_layer/data_layer.py +86 -77
  262. chia/data_layer/data_layer_rpc_api.py +9 -9
  263. chia/data_layer/data_layer_rpc_client.py +13 -15
  264. chia/data_layer/data_layer_server.py +3 -3
  265. chia/data_layer/data_layer_util.py +14 -14
  266. chia/data_layer/data_layer_wallet.py +94 -101
  267. chia/data_layer/data_store.py +50 -50
  268. chia/data_layer/dl_wallet_store.py +9 -12
  269. chia/data_layer/download_data.py +8 -9
  270. chia/data_layer/s3_plugin_service.py +5 -9
  271. chia/data_layer/start_data_layer.py +5 -5
  272. chia/farmer/farmer.py +31 -31
  273. chia/farmer/farmer_api.py +45 -33
  274. chia/farmer/farmer_rpc_api.py +5 -4
  275. chia/farmer/farmer_rpc_client.py +6 -6
  276. chia/farmer/start_farmer.py +6 -6
  277. chia/full_node/block_store.py +13 -16
  278. chia/full_node/check_fork_next_block.py +1 -2
  279. chia/full_node/coin_store.py +15 -16
  280. chia/full_node/eligible_coin_spends.py +3 -3
  281. chia/full_node/fee_estimate_store.py +2 -3
  282. chia/full_node/fee_tracker.py +1 -2
  283. chia/full_node/full_block_utils.py +4 -4
  284. chia/full_node/full_node.py +239 -223
  285. chia/full_node/full_node_api.py +197 -152
  286. chia/full_node/full_node_rpc_api.py +34 -32
  287. chia/full_node/full_node_rpc_client.py +18 -19
  288. chia/full_node/full_node_store.py +45 -43
  289. chia/full_node/hard_fork_utils.py +44 -0
  290. chia/full_node/hint_management.py +2 -2
  291. chia/full_node/mempool.py +17 -19
  292. chia/full_node/mempool_manager.py +89 -42
  293. chia/full_node/pending_tx_cache.py +2 -3
  294. chia/full_node/start_full_node.py +5 -5
  295. chia/full_node/sync_store.py +3 -4
  296. chia/full_node/tx_processing_queue.py +120 -36
  297. chia/full_node/weight_proof.py +61 -48
  298. chia/harvester/harvester.py +25 -24
  299. chia/harvester/harvester_api.py +61 -38
  300. chia/harvester/harvester_rpc_api.py +10 -10
  301. chia/harvester/start_harvester.py +4 -4
  302. chia/introducer/introducer.py +3 -3
  303. chia/introducer/introducer_api.py +6 -4
  304. chia/introducer/start_introducer.py +4 -4
  305. chia/legacy/keyring.py +3 -3
  306. chia/plot_sync/delta.py +1 -2
  307. chia/plot_sync/receiver.py +20 -17
  308. chia/plot_sync/sender.py +15 -10
  309. chia/plotters/bladebit.py +7 -7
  310. chia/plotters/chiapos.py +2 -2
  311. chia/plotters/madmax.py +4 -4
  312. chia/plotters/plotters.py +4 -4
  313. chia/plotters/plotters_util.py +3 -3
  314. chia/plotting/cache.py +20 -14
  315. chia/plotting/check_plots.py +26 -35
  316. chia/plotting/create_plots.py +22 -23
  317. chia/plotting/manager.py +21 -14
  318. chia/plotting/prover.py +59 -42
  319. chia/plotting/util.py +16 -16
  320. chia/pools/pool_config.py +2 -1
  321. chia/pools/pool_puzzles.py +11 -12
  322. chia/pools/pool_wallet.py +34 -57
  323. chia/pools/pool_wallet_info.py +39 -10
  324. chia/protocols/farmer_protocol.py +8 -9
  325. chia/protocols/fee_estimate.py +3 -4
  326. chia/protocols/full_node_protocol.py +3 -4
  327. chia/protocols/harvester_protocol.py +27 -15
  328. chia/protocols/outbound_message.py +3 -3
  329. chia/protocols/pool_protocol.py +8 -9
  330. chia/protocols/shared_protocol.py +1 -2
  331. chia/protocols/solver_protocol.py +9 -2
  332. chia/protocols/timelord_protocol.py +4 -7
  333. chia/protocols/wallet_protocol.py +11 -12
  334. chia/rpc/rpc_client.py +9 -9
  335. chia/rpc/rpc_server.py +17 -17
  336. chia/rpc/util.py +2 -2
  337. chia/seeder/crawler.py +8 -8
  338. chia/seeder/crawler_api.py +21 -27
  339. chia/seeder/crawler_rpc_api.py +2 -2
  340. chia/seeder/dns_server.py +21 -21
  341. chia/seeder/start_crawler.py +4 -4
  342. chia/server/address_manager.py +15 -16
  343. chia/server/api_protocol.py +11 -11
  344. chia/server/chia_policy.py +46 -26
  345. chia/server/introducer_peers.py +2 -3
  346. chia/server/node_discovery.py +19 -19
  347. chia/server/rate_limit_numbers.py +4 -5
  348. chia/server/rate_limits.py +4 -4
  349. chia/server/resolve_peer_info.py +4 -4
  350. chia/server/server.py +49 -52
  351. chia/server/signal_handlers.py +6 -6
  352. chia/server/start_service.py +17 -17
  353. chia/server/upnp.py +4 -6
  354. chia/server/ws_connection.py +52 -37
  355. chia/simulator/add_blocks_in_batches.py +1 -3
  356. chia/simulator/block_tools.py +312 -200
  357. chia/simulator/full_node_simulator.py +56 -35
  358. chia/simulator/keyring.py +2 -3
  359. chia/simulator/setup_services.py +15 -15
  360. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  361. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  362. chia/simulator/simulator_protocol.py +1 -2
  363. chia/simulator/simulator_test_tools.py +3 -3
  364. chia/simulator/start_simulator.py +7 -7
  365. chia/simulator/wallet_tools.py +10 -10
  366. chia/solver/solver.py +10 -10
  367. chia/solver/solver_api.py +10 -8
  368. chia/solver/solver_rpc_api.py +2 -2
  369. chia/solver/start_solver.py +4 -4
  370. chia/ssl/cacert.pem +148 -90
  371. chia/ssl/chia_ca.crt +14 -10
  372. chia/ssl/chia_ca_old.crt +19 -0
  373. chia/ssl/create_ssl.py +4 -4
  374. chia/ssl/renewedselfsignedca.conf +4 -0
  375. chia/ssl/ssl_check.py +1 -2
  376. chia/timelord/iters_from_block.py +1 -4
  377. chia/timelord/start_timelord.py +4 -4
  378. chia/timelord/timelord.py +44 -40
  379. chia/timelord/timelord_api.py +6 -4
  380. chia/timelord/timelord_launcher.py +2 -2
  381. chia/timelord/timelord_rpc_api.py +2 -2
  382. chia/timelord/timelord_state.py +11 -12
  383. chia/types/block_protocol.py +1 -3
  384. chia/types/blockchain_format/coin.py +1 -3
  385. chia/types/blockchain_format/program.py +11 -8
  386. chia/types/blockchain_format/proof_of_space.py +123 -76
  387. chia/types/blockchain_format/tree_hash.py +3 -3
  388. chia/types/blockchain_format/vdf.py +1 -2
  389. chia/types/coin_spend.py +3 -3
  390. chia/types/mempool_item.py +5 -5
  391. chia/types/mempool_submission_status.py +2 -3
  392. chia/types/peer_info.py +1 -2
  393. chia/types/unfinished_header_block.py +3 -4
  394. chia/types/validation_state.py +1 -2
  395. chia/util/action_scope.py +8 -8
  396. chia/util/async_pool.py +5 -5
  397. chia/util/bech32m.py +1 -2
  398. chia/util/beta_metrics.py +2 -2
  399. chia/util/block_cache.py +4 -4
  400. chia/util/chia_logging.py +2 -2
  401. chia/util/chia_version.py +1 -2
  402. chia/util/config.py +15 -16
  403. chia/util/db_wrapper.py +26 -27
  404. chia/util/default_root.py +1 -2
  405. chia/util/errors.py +3 -3
  406. chia/util/file_keyring.py +14 -14
  407. chia/util/files.py +2 -3
  408. chia/util/hash.py +4 -4
  409. chia/util/initial-config.yaml +4 -5
  410. chia/util/inline_executor.py +2 -1
  411. chia/util/ip_address.py +1 -2
  412. chia/util/keychain.py +25 -27
  413. chia/util/keyring_wrapper.py +18 -19
  414. chia/util/lock.py +3 -4
  415. chia/util/log_exceptions.py +1 -2
  416. chia/util/lru_cache.py +2 -2
  417. chia/util/network.py +6 -6
  418. chia/util/path.py +2 -3
  419. chia/util/priority_mutex.py +2 -2
  420. chia/util/profiler.py +1 -2
  421. chia/util/safe_cancel_task.py +1 -2
  422. chia/util/streamable.py +24 -10
  423. chia/util/task_referencer.py +1 -1
  424. chia/util/timing.py +3 -3
  425. chia/util/virtual_project_analysis.py +6 -5
  426. chia/util/ws_message.py +2 -2
  427. chia/wallet/cat_wallet/cat_info.py +3 -4
  428. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  429. chia/wallet/cat_wallet/cat_utils.py +3 -4
  430. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  431. chia/wallet/cat_wallet/lineage_store.py +3 -4
  432. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  433. chia/wallet/coin_selection.py +9 -10
  434. chia/wallet/conditions.py +142 -106
  435. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  436. chia/wallet/derivation_record.py +1 -2
  437. chia/wallet/derive_keys.py +2 -4
  438. chia/wallet/did_wallet/did_info.py +10 -11
  439. chia/wallet/did_wallet/did_wallet.py +36 -82
  440. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  441. chia/wallet/driver_protocol.py +5 -7
  442. chia/wallet/lineage_proof.py +4 -4
  443. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  444. chia/wallet/nft_wallet/nft_info.py +8 -9
  445. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  446. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  447. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  448. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  449. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  450. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  451. chia/wallet/notification_manager.py +3 -3
  452. chia/wallet/notification_store.py +44 -61
  453. chia/wallet/outer_puzzles.py +6 -7
  454. chia/wallet/puzzle_drivers.py +34 -6
  455. chia/wallet/puzzles/clawback/drivers.py +6 -6
  456. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  457. chia/wallet/puzzles/load_clvm.py +1 -1
  458. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  459. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  460. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  461. chia/wallet/puzzles/tails.py +3 -3
  462. chia/wallet/singleton.py +5 -7
  463. chia/wallet/singleton_record.py +3 -3
  464. chia/wallet/start_wallet.py +5 -5
  465. chia/wallet/trade_manager.py +37 -58
  466. chia/wallet/trade_record.py +4 -4
  467. chia/wallet/trading/offer.py +59 -46
  468. chia/wallet/trading/trade_store.py +8 -9
  469. chia/wallet/transaction_record.py +8 -8
  470. chia/wallet/uncurried_puzzle.py +1 -2
  471. chia/wallet/util/clvm_streamable.py +12 -12
  472. chia/wallet/util/compute_hints.py +4 -5
  473. chia/wallet/util/curry_and_treehash.py +1 -2
  474. chia/wallet/util/merkle_tree.py +2 -3
  475. chia/wallet/util/peer_request_cache.py +8 -8
  476. chia/wallet/util/signing.py +85 -0
  477. chia/wallet/util/tx_config.py +15 -6
  478. chia/wallet/util/wallet_sync_utils.py +14 -16
  479. chia/wallet/util/wallet_types.py +2 -2
  480. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  481. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  482. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  483. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  484. chia/wallet/vc_wallet/vc_store.py +5 -6
  485. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  486. chia/wallet/wallet.py +50 -78
  487. chia/wallet/wallet_action_scope.py +11 -11
  488. chia/wallet/wallet_blockchain.py +12 -12
  489. chia/wallet/wallet_coin_record.py +12 -6
  490. chia/wallet/wallet_coin_store.py +24 -25
  491. chia/wallet/wallet_interested_store.py +3 -5
  492. chia/wallet/wallet_nft_store.py +10 -11
  493. chia/wallet/wallet_node.py +53 -61
  494. chia/wallet/wallet_node_api.py +5 -3
  495. chia/wallet/wallet_protocol.py +23 -23
  496. chia/wallet/wallet_puzzle_store.py +15 -18
  497. chia/wallet/wallet_request_types.py +778 -114
  498. chia/wallet/wallet_retry_store.py +1 -3
  499. chia/wallet/wallet_rpc_api.py +572 -909
  500. chia/wallet/wallet_rpc_client.py +87 -279
  501. chia/wallet/wallet_singleton_store.py +3 -4
  502. chia/wallet/wallet_state_manager.py +332 -106
  503. chia/wallet/wallet_transaction_store.py +11 -14
  504. chia/wallet/wallet_user_store.py +4 -6
  505. chia/wallet/wallet_weight_proof_handler.py +4 -4
  506. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
  507. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
  508. chia/apis.py +0 -21
  509. chia/consensus/check_time_locks.py +0 -57
  510. chia/data_layer/puzzles/__init__.py +0 -0
  511. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  512. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  513. chia/types/coin_record.py +0 -44
  514. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  515. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  516. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  517. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  518. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  520. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  521. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  522. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  524. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  525. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  526. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  527. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  528. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  529. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
  530. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
  531. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
@@ -2,12 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  import functools
4
4
  import logging
5
- from collections.abc import Awaitable
5
+ from collections.abc import Awaitable, Callable
6
6
  from dataclasses import dataclass, field
7
7
  from logging import Logger
8
- from typing import Callable, ClassVar, Optional, TypeVar, Union, final, get_type_hints
8
+ from typing import ClassVar, Concatenate, TypeVar, final, get_type_hints
9
9
 
10
- from typing_extensions import Concatenate, ParamSpec, Protocol
10
+ from typing_extensions import ParamSpec, Protocol
11
11
 
12
12
  from chia.protocols.outbound_message import Message
13
13
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
@@ -23,7 +23,7 @@ class ApiProtocol(Protocol):
23
23
 
24
24
  log = logging.getLogger(__name__)
25
25
  P = ParamSpec("P")
26
- R = TypeVar("R", bound=Awaitable[Optional[Message]])
26
+ R = TypeVar("R", bound=Awaitable[Message | None])
27
27
  S = TypeVar("S", bound=Streamable)
28
28
  Self = TypeVar("Self")
29
29
  api_attribute_name = "_chia_api"
@@ -33,7 +33,7 @@ api_attribute_name = "_chia_api"
33
33
  class ApiRequest:
34
34
  request_type: ProtocolMessageTypes
35
35
  message_class: type[Streamable]
36
- method: Callable[..., Awaitable[Optional[Message]]]
36
+ method: Callable[..., Awaitable[Message | None]]
37
37
  peer_required: bool = False
38
38
  bytes_required: bool = False
39
39
  execute_task: bool = False
@@ -50,7 +50,7 @@ class ApiMetadata:
50
50
  return cls(message_type_to_request=dict(original.message_type_to_request))
51
51
 
52
52
  @classmethod
53
- def from_bound_method(cls, method: Callable[..., Awaitable[Optional[Message]]]) -> ApiRequest:
53
+ def from_bound_method(cls, method: Callable[..., Awaitable[Message | None]]) -> ApiRequest:
54
54
  self: ApiMetadata = getattr(method, api_attribute_name)
55
55
  message_type = ProtocolMessageTypes[method.__name__]
56
56
  return self.message_type_to_request[message_type]
@@ -62,18 +62,18 @@ class ApiMetadata:
62
62
  peer_required: bool = False,
63
63
  bytes_required: bool = False,
64
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]]:
65
+ reply_types: list[ProtocolMessageTypes] | None = None,
66
+ request_type: ProtocolMessageTypes | None = None,
67
+ ) -> Callable[[Callable[Concatenate[Self, S, P], R]], Callable[Concatenate[Self, bytes | S, P], R]]:
68
68
  non_optional_reply_types: list[ProtocolMessageTypes]
69
69
  if reply_types is None:
70
70
  non_optional_reply_types = []
71
71
  else:
72
72
  non_optional_reply_types = reply_types
73
73
 
74
- def inner(f: Callable[Concatenate[Self, S, P], R]) -> Callable[Concatenate[Self, Union[bytes, S], P], R]:
74
+ def inner(f: Callable[Concatenate[Self, S, P], R]) -> Callable[Concatenate[Self, bytes | S, P], R]:
75
75
  @functools.wraps(f)
76
- def wrapper(self: Self, original: Union[bytes, S], *args: P.args, **kwargs: P.kwargs) -> R:
76
+ def wrapper(self: Self, original: bytes | S, *args: P.args, **kwargs: P.kwargs) -> R:
77
77
  arg: S
78
78
  if isinstance(original, bytes):
79
79
  if request.bytes_required:
@@ -6,15 +6,16 @@ import socket
6
6
  import ssl
7
7
  import struct
8
8
  import sys
9
+ import weakref
9
10
 
10
11
  if sys.platform == "win32":
11
12
  import _overlapped # type: ignore[import-not-found]
12
13
  import _winapi
13
14
 
14
- from collections.abc import Iterable
15
- from typing import TYPE_CHECKING, Any, Callable, Optional, Union
15
+ from collections.abc import Callable, Iterable
16
+ from typing import TYPE_CHECKING, Any, TypeAlias
16
17
 
17
- from typing_extensions import Protocol, TypeAlias
18
+ from typing_extensions import Protocol
18
19
 
19
20
  # https://github.com/python/asyncio/pull/448
20
21
  global_max_concurrent_connections: int = 250
@@ -31,7 +32,7 @@ if TYPE_CHECKING:
31
32
  # https://github.com/python/typeshed/pull/5718/files
32
33
  def __call__(self) -> asyncio.protocols.BaseProtocol: ...
33
34
 
34
- _SSLContext: TypeAlias = Union[bool, ssl.SSLContext, None]
35
+ _SSLContext: TypeAlias = bool | ssl.SSLContext | None
35
36
 
36
37
  # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/base_events.py#L389
37
38
  # https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/base_events.pyi#L64
@@ -42,11 +43,11 @@ if TYPE_CHECKING:
42
43
  self,
43
44
  protocol_factory: _ProtocolFactory,
44
45
  sock: socket.socket,
45
- sslcontext: Optional[_SSLContext] = ...,
46
- server: Optional[asyncio.base_events.Server] = ...,
46
+ sslcontext: _SSLContext | None = ...,
47
+ server: asyncio.base_events.Server | None = ...,
47
48
  backlog: int = ...,
48
49
  # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/constants.py#L16
49
- ssl_handshake_timeout: Optional[float] = ...,
50
+ ssl_handshake_timeout: float | None = ...,
50
51
  ) -> None: ...
51
52
 
52
53
  # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/base_events.py#L278
@@ -57,15 +58,26 @@ if TYPE_CHECKING:
57
58
  else:
58
59
  _loop: EventsAbstractEventLoop
59
60
  _sockets: Iterable[socket.socket]
60
- _active_count: int
61
+ if sys.version_info >= (3, 13):
62
+ # https://github.com/python/cpython/blob/v3.13.7/Lib/asyncio/base_events.py#L283
63
+ _clients: weakref.WeakSet[object]
64
+ else:
65
+ _active_count: int
61
66
  _protocol_factory: _ProtocolFactory
62
67
  _backlog: int
63
68
  _ssl_context: _SSLContext
64
- _ssl_handshake_timeout: Optional[float]
69
+ _ssl_handshake_timeout: float | None
70
+
71
+ if sys.version_info >= (3, 13):
72
+ # https://github.com/python/cpython/blob/bcee1c322115c581da27600f2ae55e5439c027eb/Lib/asyncio/base_events.py#L296
73
+ def _attach(self, transport: object) -> None: ...
74
+
75
+ def _detach(self, transport: object) -> None: ...
76
+ else:
65
77
 
66
- def _attach(self) -> None: ...
78
+ def _attach(self) -> None: ...
67
79
 
68
- def _detach(self) -> None: ...
80
+ def _detach(self) -> None: ...
69
81
 
70
82
  def _start_serving(self) -> None: ...
71
83
 
@@ -76,7 +88,7 @@ if TYPE_CHECKING:
76
88
  # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/windows_events.py#L410
77
89
  # https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/windows_events.pyi#L44
78
90
  class IocpProactor(asyncio.windows_events.IocpProactor):
79
- _loop: Optional[asyncio.events.AbstractEventLoop]
91
+ _loop: asyncio.events.AbstractEventLoop | None
80
92
 
81
93
  def _register_with_iocp(self, obj: object) -> None: ...
82
94
 
@@ -116,8 +128,8 @@ class PausableServer(BaseEventsServer):
116
128
  protocol_factory: _ProtocolFactory,
117
129
  ssl_context: _SSLContext,
118
130
  backlog: int,
119
- ssl_handshake_timeout: Optional[float],
120
- max_concurrent_connections: Optional[int] = None,
131
+ ssl_handshake_timeout: float | None,
132
+ max_concurrent_connections: int | None = None,
121
133
  ) -> None:
122
134
  super().__init__(
123
135
  loop=loop,
@@ -132,20 +144,22 @@ class PausableServer(BaseEventsServer):
132
144
  max_concurrent_connections if max_concurrent_connections is not None else global_max_concurrent_connections
133
145
  )
134
146
 
135
- def _attach(self) -> None:
136
- super()._attach()
137
- logging.getLogger(__name__).debug(f"New connection. Total connections: {self._active_count}")
138
- if not self._paused and self._active_count >= self.max_concurrent_connections:
147
+ def _attach(self, *args: object, **kwargs: object) -> None:
148
+ super()._attach(*args, **kwargs)
149
+ active_connections = self._chia_active_connections()
150
+ logging.getLogger(__name__).debug(f"New connection. Total connections: {active_connections}")
151
+ if not self._paused and active_connections >= self.max_concurrent_connections:
139
152
  self._chia_pause()
140
153
 
141
- def _detach(self) -> None:
142
- super()._detach()
143
- logging.getLogger(__name__).debug(f"Connection lost. Total connections: {self._active_count}")
154
+ def _detach(self, *args: object, **kwargs: object) -> None:
155
+ super()._detach(*args, **kwargs)
156
+ active_connections = self._chia_active_connections()
157
+ logging.getLogger(__name__).debug(f"Connection lost. Total connections: {active_connections}")
144
158
  if (
145
- self._active_count > 0
159
+ active_connections > 0
146
160
  and self._sockets is not None
147
161
  and self._paused
148
- and self._active_count < self.max_concurrent_connections
162
+ and active_connections < self.max_concurrent_connections
149
163
  ):
150
164
  self._chia_resume()
151
165
 
@@ -180,6 +194,12 @@ class PausableServer(BaseEventsServer):
180
194
  )
181
195
  logging.getLogger(__name__).debug("Resumed accepting connections.")
182
196
 
197
+ def _chia_active_connections(self) -> int:
198
+ if sys.version_info >= (3, 13):
199
+ return len(self._clients)
200
+ else:
201
+ return self._active_count
202
+
183
203
 
184
204
  async def _chia_create_server(
185
205
  cls: Any,
@@ -192,9 +212,9 @@ async def _chia_create_server(
192
212
  sock: Any = None,
193
213
  backlog: int = 100,
194
214
  ssl: _SSLContext = None,
195
- reuse_address: Optional[bool] = None,
196
- reuse_port: Optional[bool] = None,
197
- ssl_handshake_timeout: Optional[float] = 30,
215
+ reuse_address: bool | None = None,
216
+ reuse_port: bool | None = None,
217
+ ssl_handshake_timeout: float | None = 30,
198
218
  start_serving: bool = True,
199
219
  ) -> PausableServer:
200
220
  server: BaseEventsServer = await cls.create_server(
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  import random
4
4
  import time
5
5
  from dataclasses import dataclass
6
- from typing import Optional
7
6
 
8
7
  from chia_rs.sized_ints import uint16, uint64
9
8
 
@@ -43,7 +42,7 @@ class IntroducerPeers:
43
42
  def __init__(self) -> None:
44
43
  self._peers: set[VettedPeer] = set()
45
44
 
46
- def add(self, peer: Optional[PeerInfo]) -> bool:
45
+ def add(self, peer: PeerInfo | None) -> bool:
47
46
  if peer is None or not peer.port:
48
47
  return False
49
48
 
@@ -56,7 +55,7 @@ class IntroducerPeers:
56
55
  self._peers.add(p)
57
56
  return True
58
57
 
59
- def remove(self, peer: Optional[VettedPeer]) -> bool:
58
+ def remove(self, peer: VettedPeer | None) -> bool:
60
59
  if peer is None or not peer.port:
61
60
  return False
62
61
  try:
@@ -11,7 +11,7 @@ from dataclasses import dataclass, field
11
11
  from logging import Logger
12
12
  from pathlib import Path
13
13
  from random import Random
14
- from typing import Any, Optional
14
+ from typing import Any
15
15
 
16
16
  import dns.asyncresolver
17
17
  from chia_rs.sized_ints import uint16, uint64
@@ -51,24 +51,24 @@ class FullNodeDiscovery:
51
51
  peer_connect_interval: int
52
52
  selected_network: str
53
53
  log: Logger
54
- introducer_info: Optional[dict[str, Any]] = None
55
- default_port: Optional[int] = None
56
- resolver: Optional[dns.asyncresolver.Resolver] = field(default=None)
54
+ introducer_info: dict[str, Any] | None = None
55
+ default_port: int | None = None
56
+ resolver: dns.asyncresolver.Resolver | None = field(default=None)
57
57
  enable_private_networks: bool = field(default=False)
58
58
  is_closed: bool = field(default=False)
59
59
  legacy_peer_db_migrated: bool = field(default=False)
60
- relay_queue: Optional[asyncio.Queue[tuple[TimestampedPeerInfo, int]]] = field(default=None)
61
- address_manager: Optional[AddressManager] = field(default=None)
60
+ relay_queue: asyncio.Queue[tuple[TimestampedPeerInfo, int]] | None = field(default=None)
61
+ address_manager: AddressManager | None = field(default=None)
62
62
  connection_time_pretest: dict[str, Any] = field(default_factory=dict)
63
63
  received_count_from_peers: dict[str, Any] = field(default_factory=dict)
64
64
  lock: asyncio.Lock = field(default_factory=asyncio.Lock)
65
- connect_peers_task: Optional[asyncio.Task[None]] = field(default=None)
66
- serialize_task: Optional[asyncio.Task[None]] = field(default=None)
67
- cleanup_task: Optional[asyncio.Task[None]] = field(default=None)
65
+ connect_peers_task: asyncio.Task[None] | None = field(default=None)
66
+ serialize_task: asyncio.Task[None] | None = field(default=None)
67
+ cleanup_task: asyncio.Task[None] | None = field(default=None)
68
68
  initial_wait: int = field(default=0)
69
69
  pending_outbound_connections: set[str] = field(default_factory=set)
70
70
  pending_tasks: set[asyncio.Task[None]] = field(default_factory=set)
71
- introducer_info_obj: Optional[UnresolvedPeerInfo] = field(default=None)
71
+ introducer_info_obj: UnresolvedPeerInfo | None = field(default=None)
72
72
 
73
73
  def __post_init__(self) -> None:
74
74
  random.shuffle(self.dns_servers) # Don't always start with the same DNS server
@@ -245,7 +245,7 @@ class FullNodeDiscovery:
245
245
  retry_introducers = False
246
246
  dns_server_index: int = 0
247
247
  tried_all_dns_servers: bool = False
248
- local_peerinfo: Optional[PeerInfo] = await self.server.get_peer_info()
248
+ local_peerinfo: PeerInfo | None = await self.server.get_peer_info()
249
249
  last_timestamp_local_info: uint64 = uint64(time.time())
250
250
  last_collision_timestamp = 0
251
251
 
@@ -327,7 +327,7 @@ class FullNodeDiscovery:
327
327
  tries = 0
328
328
  now = time.time()
329
329
  got_peer = False
330
- addr: Optional[PeerInfo] = None
330
+ addr: PeerInfo | None = None
331
331
  max_tries = 50
332
332
  if len(groups) < 3:
333
333
  max_tries = 10
@@ -345,7 +345,7 @@ class FullNodeDiscovery:
345
345
  addr = None
346
346
  retry_introducers = True
347
347
  break
348
- info: Optional[ExtendedPeerInfo] = await self.address_manager.select_tried_collision()
348
+ info: ExtendedPeerInfo | None = await self.address_manager.select_tried_collision()
349
349
  if info is None or time.time() - last_collision_timestamp <= 60:
350
350
  info = await self.address_manager.select_peer(is_feeler)
351
351
  else:
@@ -440,7 +440,7 @@ class FullNodeDiscovery:
440
440
  return port in NETWORK_ID_DEFAULT_PORTS.values() and port != self.default_port
441
441
 
442
442
  async def _add_peers_common(
443
- self, peer_list: list[TimestampedPeerInfo], peer_src: Optional[PeerInfo], is_full_node: bool
443
+ self, peer_list: list[TimestampedPeerInfo], peer_src: PeerInfo | None, is_full_node: bool
444
444
  ) -> None:
445
445
  # Check if we got the peers from a full node or from the introducer.
446
446
  peers_adjusted_timestamp = []
@@ -488,8 +488,8 @@ class FullNodeDiscovery:
488
488
 
489
489
  @dataclass
490
490
  class FullNodePeers(FullNodeDiscovery):
491
- self_advertise_task: Optional[asyncio.Task[None]] = field(default=None)
492
- address_relay_task: Optional[asyncio.Task[None]] = field(default=None)
491
+ self_advertise_task: asyncio.Task[None] | None = field(default=None)
492
+ address_relay_task: asyncio.Task[None] | None = field(default=None)
493
493
  relay_queue: asyncio.Queue[tuple[TimestampedPeerInfo, int]] = field(default_factory=asyncio.Queue)
494
494
  neighbour_known_peers: dict[PeerInfo, set[str]] = field(default_factory=dict)
495
495
  key: int = field(default_factory=lambda: random.getrandbits(256))
@@ -557,7 +557,7 @@ class FullNodePeers(FullNodeDiscovery):
557
557
  if peer.host not in self.neighbour_known_peers[neighbour_info]:
558
558
  self.neighbour_known_peers[neighbour_info].add(peer.host)
559
559
 
560
- async def request_peers(self, peer_info: PeerInfo) -> Optional[Message]:
560
+ async def request_peers(self, peer_info: PeerInfo) -> Message | None:
561
561
  try:
562
562
  # Prevent a fingerprint attack: do not send peers to inbound connections.
563
563
  # This asymmetric behavior for inbound and outbound connections was introduced
@@ -582,7 +582,7 @@ class FullNodePeers(FullNodeDiscovery):
582
582
  return None
583
583
 
584
584
  async def add_peers(
585
- self, peer_list: list[TimestampedPeerInfo], peer_src: Optional[PeerInfo], is_full_node: bool
585
+ self, peer_list: list[TimestampedPeerInfo], peer_src: PeerInfo | None, is_full_node: bool
586
586
  ) -> None:
587
587
  try:
588
588
  await self._add_peers_common(peer_list, peer_src, is_full_node)
@@ -671,6 +671,6 @@ class WalletPeers(FullNodeDiscovery):
671
671
  await self._close_common()
672
672
 
673
673
  async def add_peers(
674
- self, peer_list: list[TimestampedPeerInfo], peer_src: Optional[PeerInfo], is_full_node: bool
674
+ self, peer_list: list[TimestampedPeerInfo], peer_src: PeerInfo | None, is_full_node: bool
675
675
  ) -> None:
676
676
  await self._add_peers_common(peer_list, peer_src, is_full_node)
@@ -2,12 +2,11 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  import dataclasses
5
- from typing import Optional, Union
6
5
 
7
6
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
8
7
  from chia.protocols.shared_protocol import Capability
9
8
 
10
- compose_rate_limits_cache: dict[int, dict[ProtocolMessageTypes, Union[RLSettings, Unlimited]]] = {}
9
+ compose_rate_limits_cache: dict[int, dict[ProtocolMessageTypes, RLSettings | Unlimited]] = {}
11
10
 
12
11
 
13
12
  # this class is used to configure the *rate* limit for a message type. The
@@ -19,7 +18,7 @@ class RLSettings:
19
18
  aggregate_limit: bool
20
19
  frequency: int # Max request per time period (ie 1 min)
21
20
  max_size: int # Max size of each request
22
- max_total_size: Optional[int] = None # Max cumulative size of all requests in that period
21
+ max_total_size: int | None = None # Max cumulative size of all requests in that period
23
22
 
24
23
 
25
24
  # this class is used to indicate that a message type is not subject to a rate
@@ -43,7 +42,7 @@ aggregate_limit = RLSettings(
43
42
 
44
43
  def get_rate_limits_to_use(
45
44
  our_capabilities: list[Capability], peer_capabilities: list[Capability]
46
- ) -> tuple[dict[ProtocolMessageTypes, Union[RLSettings, Unlimited]], RLSettings]:
45
+ ) -> tuple[dict[ProtocolMessageTypes, RLSettings | Unlimited], RLSettings]:
47
46
  # This will use the newest possible rate limits that both peers support. At this time there are only two
48
47
  # options, v1 and v2.
49
48
 
@@ -64,7 +63,7 @@ def get_rate_limits_to_use(
64
63
 
65
64
  # Each number in this dict corresponds to a specific version of rate limits (1, 2, etc).
66
65
  # Version 1 includes the original limits for chia software from versions 1.0 to 1.4.
67
- rate_limits: dict[int, dict[ProtocolMessageTypes, Union[RLSettings, Unlimited]]] = {
66
+ rate_limits: dict[int, dict[ProtocolMessageTypes, RLSettings | Unlimited]] = {
68
67
  1: {
69
68
  ProtocolMessageTypes.new_transaction: RLSettings(False, 5000, 100, 5000 * 100),
70
69
  ProtocolMessageTypes.request_transaction: RLSettings(False, 5000, 100, 5000 * 100),
@@ -4,7 +4,7 @@ import dataclasses
4
4
  import logging
5
5
  import time
6
6
  from collections import Counter
7
- from typing import Callable, Optional, Union
7
+ from collections.abc import Callable
8
8
 
9
9
  from chia.protocols.outbound_message import Message
10
10
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
@@ -53,7 +53,7 @@ class RateLimiter:
53
53
 
54
54
  def process_msg_and_check(
55
55
  self, message: Message, our_capabilities: list[Capability], peer_capabilities: list[Capability]
56
- ) -> Optional[str]:
56
+ ) -> str | None:
57
57
  """
58
58
  Returns a string indicating which limit was hit if a rate limit is
59
59
  exceeded, and the message should be blocked. Returns None if the limit was not
@@ -80,11 +80,11 @@ class RateLimiter:
80
80
  proportion_of_limit: float = self.percentage_of_limit / 100
81
81
 
82
82
  ret: bool = False
83
- rate_limits: dict[ProtocolMessageTypes, Union[RLSettings, Unlimited]]
83
+ rate_limits: dict[ProtocolMessageTypes, RLSettings | Unlimited]
84
84
  rate_limits, agg_limit = get_rate_limits_to_use(our_capabilities, peer_capabilities)
85
85
 
86
86
  try:
87
- limits: Union[RLSettings, Unlimited] = rate_limits[message_type]
87
+ limits: RLSettings | Unlimited = rate_limits[message_type]
88
88
  if isinstance(limits, RLSettings) and limits.aggregate_limit:
89
89
  non_tx_freq = agg_limit.frequency
90
90
  assert agg_limit.max_total_size is not None
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Any, Optional
4
+ from typing import Any
5
5
 
6
6
  from chia.protocols.outbound_message import NodeType
7
7
  from chia.types.peer_info import UnresolvedPeerInfo
@@ -18,7 +18,7 @@ PEER_INFO_MAPPING: dict[NodeType, str] = {
18
18
  def get_unresolved_peer_infos(service_config: dict[str, Any], peer_type: NodeType) -> set[UnresolvedPeerInfo]:
19
19
  peer_info_key = PEER_INFO_MAPPING[peer_type]
20
20
  peer_infos: list[dict[str, Any]] = service_config.get(f"{peer_info_key}s", [])
21
- peer_info: Optional[dict[str, Any]] = service_config.get(peer_info_key)
21
+ peer_info: dict[str, Any] | None = service_config.get(peer_info_key)
22
22
  if peer_info is not None:
23
23
  peer_infos.append(peer_info)
24
24
 
@@ -32,8 +32,8 @@ def get_unresolved_peer_infos(service_config: dict[str, Any], peer_type: NodeTyp
32
32
  def set_peer_info(
33
33
  service_config: dict[str, Any],
34
34
  peer_type: NodeType,
35
- peer_host: Optional[str] = None,
36
- peer_port: Optional[int] = None,
35
+ peer_host: str | None = None,
36
+ peer_port: int | None = None,
37
37
  ) -> None:
38
38
  peer_info_key = PEER_INFO_MAPPING[peer_type]
39
39
  if peer_info_key in service_config: