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
chia/util/keychain.py CHANGED
@@ -8,7 +8,7 @@ from collections.abc import Iterator
8
8
  from dataclasses import dataclass
9
9
  from hashlib import pbkdf2_hmac
10
10
  from pathlib import Path
11
- from typing import Any, Literal, Optional, Union, overload
11
+ from typing import Any, Literal, overload
12
12
 
13
13
  import importlib_resources
14
14
  from bitstring import BitArray # pyright: reportMissingImports=false
@@ -231,8 +231,8 @@ class KeyDataSecrets(Streamable):
231
231
  class KeyData(Streamable):
232
232
  fingerprint: uint32
233
233
  public_key: G1Element
234
- label: Optional[str]
235
- secrets: Optional[KeyDataSecrets]
234
+ label: str | None
235
+ secrets: KeyDataSecrets | None
236
236
 
237
237
  def __post_init__(self) -> None:
238
238
  # This is redundant if `from_*` methods are used but its to make sure there can't be an `KeyData` instance with
@@ -243,7 +243,7 @@ class KeyData(Streamable):
243
243
  raise KeychainKeyDataMismatch("fingerprint")
244
244
 
245
245
  @classmethod
246
- def from_mnemonic(cls, mnemonic: str, label: Optional[str] = None) -> KeyData:
246
+ def from_mnemonic(cls, mnemonic: str, label: str | None = None) -> KeyData:
247
247
  private_key = AugSchemeMPL.key_gen(mnemonic_to_seed(mnemonic))
248
248
  return cls(
249
249
  fingerprint=uint32(private_key.get_g1().get_fingerprint()),
@@ -253,11 +253,11 @@ class KeyData(Streamable):
253
253
  )
254
254
 
255
255
  @classmethod
256
- def from_entropy(cls, entropy: bytes, label: Optional[str] = None) -> KeyData:
256
+ def from_entropy(cls, entropy: bytes, label: str | None = None) -> KeyData:
257
257
  return cls.from_mnemonic(bytes_to_mnemonic(entropy), label)
258
258
 
259
259
  @classmethod
260
- def generate(cls, label: Optional[str] = None) -> KeyData:
260
+ def generate(cls, label: str | None = None) -> KeyData:
261
261
  return cls.from_mnemonic(generate_mnemonic(), label)
262
262
 
263
263
  @property
@@ -295,11 +295,11 @@ class Keychain:
295
295
  list of all keys.
296
296
  """
297
297
 
298
- def __init__(self, user: Optional[str] = None, service: Optional[str] = None):
298
+ def __init__(self, user: str | None = None, service: str | None = None):
299
299
  self.user = user if user is not None else default_keychain_user()
300
300
  self.service = service if service is not None else default_keychain_service()
301
301
 
302
- keyring_wrapper: Optional[KeyringWrapper] = KeyringWrapper.get_shared_instance()
302
+ keyring_wrapper: KeyringWrapper | None = KeyringWrapper.get_shared_instance()
303
303
 
304
304
  if keyring_wrapper is None:
305
305
  raise KeychainNotSet("KeyringWrapper not set")
@@ -347,25 +347,23 @@ class Keychain:
347
347
  def add_key(self, mnemonic_or_pk: str) -> PrivateKey: ...
348
348
 
349
349
  @overload
350
- def add_key(self, mnemonic_or_pk: str, label: Optional[str]) -> PrivateKey: ...
350
+ def add_key(self, mnemonic_or_pk: str, label: str | None) -> PrivateKey: ...
351
351
 
352
352
  @overload
353
- def add_key(self, mnemonic_or_pk: str, label: Optional[str], private: Literal[True]) -> PrivateKey: ...
353
+ def add_key(self, mnemonic_or_pk: str, label: str | None, private: Literal[True]) -> PrivateKey: ...
354
354
 
355
355
  @overload
356
- def add_key(self, mnemonic_or_pk: str, label: Optional[str], private: Literal[False]) -> G1Element: ...
356
+ def add_key(self, mnemonic_or_pk: str, label: str | None, private: Literal[False]) -> G1Element: ...
357
357
 
358
358
  @overload
359
- def add_key(self, mnemonic_or_pk: str, label: Optional[str], private: bool) -> Union[PrivateKey, G1Element]: ...
359
+ def add_key(self, mnemonic_or_pk: str, label: str | None, private: bool) -> PrivateKey | G1Element: ...
360
360
 
361
- def add_key(
362
- self, mnemonic_or_pk: str, label: Optional[str] = None, private: bool = True
363
- ) -> Union[PrivateKey, G1Element]:
361
+ def add_key(self, mnemonic_or_pk: str, label: str | None = None, private: bool = True) -> PrivateKey | G1Element:
364
362
  """
365
363
  Adds a key to the keychain. The keychain itself will store the public key, and the entropy bytes (if given),
366
364
  but not the passphrase.
367
365
  """
368
- key: Union[PrivateKey, G1Element]
366
+ key: PrivateKey | G1Element
369
367
  if private:
370
368
  seed = mnemonic_to_seed(mnemonic_or_pk)
371
369
  entropy = bytes_from_mnemonic(mnemonic_or_pk)
@@ -436,7 +434,7 @@ class Keychain:
436
434
  pass
437
435
  return None
438
436
 
439
- def get_first_private_key(self) -> Optional[tuple[PrivateKey, bytes]]:
437
+ def get_first_private_key(self) -> tuple[PrivateKey, bytes] | None:
440
438
  """
441
439
  Returns the first key in the keychain that has one of the passed in passphrases.
442
440
  """
@@ -444,7 +442,7 @@ class Keychain:
444
442
  return key_data.private_key, key_data.entropy
445
443
  return None
446
444
 
447
- def get_private_key_by_fingerprint(self, fingerprint: int) -> Optional[tuple[PrivateKey, bytes]]:
445
+ def get_private_key_by_fingerprint(self, fingerprint: int) -> tuple[PrivateKey, bytes] | None:
448
446
  """
449
447
  Return first private key which have the given public key fingerprint.
450
448
  """
@@ -492,7 +490,7 @@ class Keychain:
492
490
 
493
491
  return all_keys
494
492
 
495
- def get_first_public_key(self) -> Optional[G1Element]:
493
+ def get_first_public_key(self) -> G1Element | None:
496
494
  """
497
495
  Returns the first public key.
498
496
  """
@@ -578,7 +576,7 @@ class Keychain:
578
576
  return passphrase_requirements().get("min_length", 0) # type: ignore[no-any-return]
579
577
 
580
578
  @staticmethod
581
- def passphrase_meets_requirements(passphrase: Optional[str]) -> bool:
579
+ def passphrase_meets_requirements(passphrase: str | None) -> bool:
582
580
  """
583
581
  Returns whether the provided passphrase satisfies the passphrase requirements.
584
582
  """
@@ -617,7 +615,7 @@ class Keychain:
617
615
  return KeyringWrapper.get_shared_instance().has_cached_master_passphrase()
618
616
 
619
617
  @staticmethod
620
- def get_cached_master_passphrase() -> Optional[str]:
618
+ def get_cached_master_passphrase() -> str | None:
621
619
  """
622
620
  Returns the cached master passphrase
623
621
  """
@@ -625,7 +623,7 @@ class Keychain:
625
623
  return passphrase
626
624
 
627
625
  @staticmethod
628
- def set_cached_master_passphrase(passphrase: Optional[str]) -> None:
626
+ def set_cached_master_passphrase(passphrase: str | None) -> None:
629
627
  """
630
628
  Caches the provided master passphrase
631
629
  """
@@ -633,10 +631,10 @@ class Keychain:
633
631
 
634
632
  @staticmethod
635
633
  def set_master_passphrase(
636
- current_passphrase: Optional[str],
634
+ current_passphrase: str | None,
637
635
  new_passphrase: str,
638
636
  *,
639
- passphrase_hint: Optional[str] = None,
637
+ passphrase_hint: str | None = None,
640
638
  save_passphrase: bool = False,
641
639
  ) -> None:
642
640
  """
@@ -651,7 +649,7 @@ class Keychain:
651
649
  )
652
650
 
653
651
  @staticmethod
654
- def remove_master_passphrase(current_passphrase: Optional[str]) -> None:
652
+ def remove_master_passphrase(current_passphrase: str | None) -> None:
655
653
  """
656
654
  Removes the user-provided master passphrase, and replaces it with the default
657
655
  master passphrase. The keyring contents will remain encrypted, but to the
@@ -660,14 +658,14 @@ class Keychain:
660
658
  KeyringWrapper.get_shared_instance().remove_master_passphrase(current_passphrase)
661
659
 
662
660
  @staticmethod
663
- def get_master_passphrase_hint() -> Optional[str]:
661
+ def get_master_passphrase_hint() -> str | None:
664
662
  """
665
663
  Returns the passphrase hint from the keyring
666
664
  """
667
665
  return KeyringWrapper.get_shared_instance().get_master_passphrase_hint()
668
666
 
669
667
  @staticmethod
670
- def set_master_passphrase_hint(current_passphrase: str, passphrase_hint: Optional[str]) -> None:
668
+ def set_master_passphrase_hint(current_passphrase: str, passphrase_hint: str | None) -> None:
671
669
  """
672
670
  Convenience method for setting/removing the passphrase hint. Requires the current
673
671
  passphrase, as the passphrase hint is written as part of a passphrase update.
@@ -7,13 +7,12 @@ import time
7
7
  from getpass import getpass
8
8
  from pathlib import Path
9
9
  from sys import platform
10
- from typing import ClassVar, Optional, Union, overload
10
+ from typing import ClassVar, Literal, overload
11
11
 
12
12
  import colorama
13
13
  from keyring.backends.macOS import Keyring as MacKeyring
14
14
  from keyring.backends.Windows import WinVaultKeyring as WinKeyring
15
15
  from keyring.errors import KeyringError, PasswordDeleteError
16
- from typing_extensions import Literal
17
16
 
18
17
  from chia.util.default_root import DEFAULT_KEYS_ROOT_PATH
19
18
  from chia.util.errors import KeychainMaxUnlockAttempts
@@ -30,10 +29,10 @@ MASTER_PASSPHRASE_SERVICE_NAME = "Chia Passphrase" # noqa: S105
30
29
  MASTER_PASSPHRASE_USER_NAME = "Chia Passphrase" # noqa: S105
31
30
 
32
31
 
33
- OSPassphraseStore = Union[MacKeyring, WinKeyring]
32
+ OSPassphraseStore = MacKeyring | WinKeyring
34
33
 
35
34
 
36
- def get_os_passphrase_store() -> Optional[OSPassphraseStore]:
35
+ def get_os_passphrase_store() -> OSPassphraseStore | None:
37
36
  if platform == "darwin":
38
37
  return MacKeyring() # type: ignore[no-untyped-call]
39
38
  elif platform == "win32" or platform == "cygwin":
@@ -126,13 +125,13 @@ class KeyringWrapper:
126
125
  """
127
126
 
128
127
  # Static members
129
- __shared_instance: ClassVar[Optional[KeyringWrapper]] = None
128
+ __shared_instance: ClassVar[KeyringWrapper | None] = None
130
129
  __keys_root_path: ClassVar[Path] = DEFAULT_KEYS_ROOT_PATH
131
130
 
132
131
  # Instance members
133
132
  keys_root_path: Path
134
133
  keyring: FileKeyring
135
- cached_passphrase: Optional[str] = None
134
+ cached_passphrase: str | None = None
136
135
  cached_passphrase_is_validated: bool = False
137
136
 
138
137
  def __init__(self, keys_root_path: Path = DEFAULT_KEYS_ROOT_PATH):
@@ -156,7 +155,7 @@ class KeyringWrapper:
156
155
  """
157
156
  from chia.util.keychain import supports_os_passphrase_storage
158
157
 
159
- passphrase: Optional[str] = None
158
+ passphrase: str | None = None
160
159
 
161
160
  if supports_os_passphrase_storage():
162
161
  passphrase = self.get_master_passphrase_from_credential_store()
@@ -183,10 +182,10 @@ class KeyringWrapper:
183
182
 
184
183
  @overload
185
184
  @staticmethod
186
- def get_shared_instance(create_if_necessary: bool) -> Optional[KeyringWrapper]: ...
185
+ def get_shared_instance(create_if_necessary: bool) -> KeyringWrapper | None: ...
187
186
 
188
187
  @staticmethod
189
- def get_shared_instance(create_if_necessary: bool = True) -> Optional[KeyringWrapper]:
188
+ def get_shared_instance(create_if_necessary: bool = True) -> KeyringWrapper | None:
190
189
  if not KeyringWrapper.__shared_instance and create_if_necessary:
191
190
  KeyringWrapper.__shared_instance = KeyringWrapper(keys_root_path=KeyringWrapper.__keys_root_path)
192
191
 
@@ -204,14 +203,14 @@ class KeyringWrapper:
204
203
 
205
204
  # Master passphrase support
206
205
 
207
- def get_cached_master_passphrase(self) -> tuple[Optional[str], bool]:
206
+ def get_cached_master_passphrase(self) -> tuple[str | None, bool]:
208
207
  """
209
208
  Returns a tuple including the currently cached passphrase and a bool
210
209
  indicating whether the passphrase has been previously validated.
211
210
  """
212
211
  return self.cached_passphrase, self.cached_passphrase_is_validated
213
212
 
214
- def set_cached_master_passphrase(self, passphrase: Optional[str], validated: bool = False) -> None:
213
+ def set_cached_master_passphrase(self, passphrase: str | None, validated: bool = False) -> None:
215
214
  """
216
215
  Cache the provided passphrase and optionally indicate whether the passphrase
217
216
  has been validated.
@@ -235,11 +234,11 @@ class KeyringWrapper:
235
234
 
236
235
  def set_master_passphrase(
237
236
  self,
238
- current_passphrase: Optional[str],
237
+ current_passphrase: str | None,
239
238
  new_passphrase: str,
240
239
  *,
241
240
  write_to_keyring: bool = True,
242
- passphrase_hint: Optional[str] = None,
241
+ passphrase_hint: str | None = None,
243
242
  save_passphrase: bool = False,
244
243
  ) -> None:
245
244
  """
@@ -272,7 +271,7 @@ class KeyringWrapper:
272
271
  else:
273
272
  self.remove_master_passphrase_from_credential_store()
274
273
 
275
- def remove_master_passphrase(self, current_passphrase: Optional[str]) -> None:
274
+ def remove_master_passphrase(self, current_passphrase: str | None) -> None:
276
275
  """
277
276
  Remove the user-specific master passphrase. We still keep the keyring contents encrypted
278
277
  using the default passphrase.
@@ -280,7 +279,7 @@ class KeyringWrapper:
280
279
  self.set_master_passphrase(current_passphrase, DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE)
281
280
 
282
281
  def save_master_passphrase_to_credential_store(self, passphrase: str) -> None:
283
- passphrase_store: Optional[OSPassphraseStore] = get_os_passphrase_store()
282
+ passphrase_store: OSPassphraseStore | None = get_os_passphrase_store()
284
283
  if passphrase_store is not None:
285
284
  try:
286
285
  passphrase_store.set_password(
@@ -293,7 +292,7 @@ class KeyringWrapper:
293
292
  raise
294
293
 
295
294
  def remove_master_passphrase_from_credential_store(self) -> None:
296
- passphrase_store: Optional[OSPassphraseStore] = get_os_passphrase_store()
295
+ passphrase_store: OSPassphraseStore | None = get_os_passphrase_store()
297
296
  if passphrase_store is not None:
298
297
  try:
299
298
  passphrase_store.delete_password(
@@ -310,8 +309,8 @@ class KeyringWrapper:
310
309
  if not warn_if_macos_errSecInteractionNotAllowed(e):
311
310
  raise
312
311
 
313
- def get_master_passphrase_from_credential_store(self) -> Optional[str]:
314
- passphrase_store: Optional[OSPassphraseStore] = get_os_passphrase_store()
312
+ def get_master_passphrase_from_credential_store(self) -> str | None:
313
+ passphrase_store: OSPassphraseStore | None = get_os_passphrase_store()
315
314
  if passphrase_store is not None:
316
315
  try:
317
316
  return passphrase_store.get_password( # type: ignore[no-any-return]
@@ -323,5 +322,5 @@ class KeyringWrapper:
323
322
  raise
324
323
  return None
325
324
 
326
- def get_master_passphrase_hint(self) -> Optional[str]:
325
+ def get_master_passphrase_hint(self) -> str | None:
327
326
  return self.keyring.get_passphrase_hint()
chia/util/lock.py CHANGED
@@ -5,7 +5,6 @@ from __future__ import annotations
5
5
  from dataclasses import dataclass
6
6
  from pathlib import Path
7
7
  from types import TracebackType
8
- from typing import Optional
9
8
 
10
9
  from filelock import BaseFileLock, FileLock, Timeout
11
10
  from typing_extensions import final
@@ -33,9 +32,9 @@ class Lockfile:
33
32
 
34
33
  def __exit__(
35
34
  self,
36
- exc_type: Optional[type[BaseException]],
37
- exc: Optional[BaseException],
38
- traceback: Optional[TracebackType],
35
+ exc_type: type[BaseException] | None,
36
+ exc: BaseException | None,
37
+ traceback: TracebackType | None,
39
38
  ) -> None:
40
39
  self.release()
41
40
 
@@ -6,7 +6,6 @@ import logging
6
6
  import traceback
7
7
  from collections.abc import Iterator
8
8
  from contextlib import contextmanager
9
- from typing import Union
10
9
 
11
10
 
12
11
  @contextmanager
@@ -17,7 +16,7 @@ def log_exceptions(
17
16
  message: str = "Caught exception",
18
17
  level: int = logging.ERROR,
19
18
  show_traceback: bool = True,
20
- exceptions_to_process: Union[type[BaseException], tuple[type[BaseException], ...]] = Exception,
19
+ exceptions_to_process: type[BaseException] | tuple[type[BaseException], ...] = Exception,
21
20
  ) -> Iterator[None]:
22
21
  try:
23
22
  yield
chia/util/lru_cache.py CHANGED
@@ -3,7 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections import OrderedDict
6
- from typing import Generic, Optional, TypeVar
6
+ from typing import Generic, TypeVar
7
7
 
8
8
  K = TypeVar("K")
9
9
  V = TypeVar("V")
@@ -14,7 +14,7 @@ class LRUCache(Generic[K, V]):
14
14
  self.cache: OrderedDict[K, V] = OrderedDict()
15
15
  self.capacity = capacity
16
16
 
17
- def get(self, key: K) -> Optional[V]:
17
+ def get(self, key: K) -> V | None:
18
18
  if key not in self.cache:
19
19
  return None
20
20
  else:
chia/util/network.py CHANGED
@@ -8,7 +8,7 @@ import ssl
8
8
  from collections.abc import Iterable
9
9
  from dataclasses import dataclass
10
10
  from ipaddress import IPv4Network, IPv6Network, ip_address
11
- from typing import Any, Literal, Optional, Union
11
+ from typing import Any, Literal
12
12
  from urllib.parse import urlsplit
13
13
 
14
14
  from aiohttp import web
@@ -36,8 +36,8 @@ class WebServer:
36
36
  hostname: str
37
37
  listen_port: uint16
38
38
  scheme: Literal["http", "https"]
39
- _ssl_context: Optional[ssl.SSLContext] = None
40
- _close_task: Optional[asyncio.Task[None]] = None
39
+ _ssl_context: ssl.SSLContext | None = None
40
+ _close_task: asyncio.Task[None] | None = None
41
41
  _prefer_ipv6: bool = False
42
42
 
43
43
  @classmethod
@@ -47,7 +47,7 @@ class WebServer:
47
47
  port: uint16,
48
48
  routes: Iterable[web.RouteDef] = (),
49
49
  max_request_body_size: int = 1024**2, # Default `client_max_size` from web.Application
50
- ssl_context: Optional[ssl.SSLContext] = None,
50
+ ssl_context: ssl.SSLContext | None = None,
51
51
  keepalive_timeout: int = 75, # Default from aiohttp.web
52
52
  shutdown_timeout: int = 60, # Default `shutdown_timeout` from aiohttp.web_runner.BaseRunner
53
53
  prefer_ipv6: bool = False,
@@ -115,7 +115,7 @@ class WebServer:
115
115
  await self._close_task
116
116
 
117
117
 
118
- def is_in_network(peer_host: str, networks: Iterable[Union[IPv4Network, IPv6Network]]) -> bool:
118
+ def is_in_network(peer_host: str, networks: Iterable[IPv4Network | IPv6Network]) -> bool:
119
119
  try:
120
120
  peer_host_ip = ip_address(peer_host)
121
121
  return any(peer_host_ip in network for network in networks)
@@ -155,7 +155,7 @@ async def resolve(host: str, *, prefer_ipv6: bool = False) -> IPAddress:
155
155
  except ValueError:
156
156
  pass
157
157
  addrset: list[
158
- tuple[socket.AddressFamily, socket.SocketKind, int, str, Union[tuple[str, int], tuple[str, int, int, int]]]
158
+ tuple[socket.AddressFamily, socket.SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]
159
159
  ] = await asyncio.get_event_loop().getaddrinfo(host, None)
160
160
  # The list returned by getaddrinfo is never empty, an exception is thrown or data is returned.
161
161
  ips_v4 = []
chia/util/path.py CHANGED
@@ -4,10 +4,9 @@ from __future__ import annotations
4
4
 
5
5
  import os
6
6
  from pathlib import Path
7
- from typing import Union
8
7
 
9
8
 
10
- def path_from_root(root: Path, path_str: Union[str, Path]) -> Path:
9
+ def path_from_root(root: Path, path_str: str | Path) -> Path:
11
10
  """
12
11
  If path is relative, prepend root
13
12
  If path is absolute, return it directly.
@@ -19,7 +18,7 @@ def path_from_root(root: Path, path_str: Union[str, Path]) -> Path:
19
18
  return path.resolve()
20
19
 
21
20
 
22
- def make_path_relative(path_str: Union[str, Path], root: Path) -> Path:
21
+ def make_path_relative(path_str: str | Path, root: Path) -> Path:
23
22
  """
24
23
  Try to make the given path relative, given the default root.
25
24
  """
@@ -9,7 +9,7 @@ import dataclasses
9
9
  import logging
10
10
  from collections.abc import AsyncIterator
11
11
  from enum import IntEnum
12
- from typing import Generic, Optional, TypeVar
12
+ from typing import Generic, TypeVar
13
13
 
14
14
  from typing_extensions import final
15
15
 
@@ -49,7 +49,7 @@ class PriorityMutex(Generic[_T_Priority]):
49
49
  """
50
50
 
51
51
  _deques: dict[_T_Priority, collections.deque[_Element]]
52
- _active: Optional[_Element] = None
52
+ _active: _Element | None = None
53
53
 
54
54
  @classmethod
55
55
  def create(cls, priority_type: type[_T_Priority]) -> PriorityMutex[_T_Priority]:
chia/util/profiler.py CHANGED
@@ -10,7 +10,6 @@ import tracemalloc
10
10
  from collections.abc import AsyncIterator
11
11
  from contextlib import asynccontextmanager
12
12
  from datetime import datetime
13
- from typing import Optional
14
13
 
15
14
  from chia.util.path import path_from_root
16
15
 
@@ -184,7 +183,7 @@ async def mem_profile_task(root_path: pathlib.Path, service: str, log: logging.L
184
183
 
185
184
 
186
185
  @asynccontextmanager
187
- async def enable_profiler(profile: bool) -> AsyncIterator[Optional[cProfile.Profile]]:
186
+ async def enable_profiler(profile: bool) -> AsyncIterator[cProfile.Profile | None]:
188
187
  if not profile:
189
188
  yield None
190
189
  return
@@ -4,10 +4,9 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import logging
7
- from typing import Optional
8
7
 
9
8
 
10
- def cancel_task_safe(task: Optional[asyncio.Task[None]], log: Optional[logging.Logger] = None) -> None:
9
+ def cancel_task_safe(task: asyncio.Task[None] | None, log: logging.Logger | None = None) -> None:
11
10
  if task is not None:
12
11
  try:
13
12
  task.cancel()
chia/util/streamable.py CHANGED
@@ -8,13 +8,25 @@ import io
8
8
  import os
9
9
  import pprint
10
10
  import traceback
11
- from collections.abc import Collection
11
+ from collections.abc import Callable, Collection
12
12
  from enum import Enum, EnumMeta
13
- from typing import TYPE_CHECKING, Any, BinaryIO, Callable, ClassVar, Optional, TypeVar, Union, get_type_hints
13
+ from types import UnionType
14
+ from typing import (
15
+ TYPE_CHECKING,
16
+ Any,
17
+ BinaryIO,
18
+ ClassVar,
19
+ Literal,
20
+ TypeVar,
21
+ Union,
22
+ get_args,
23
+ get_origin,
24
+ get_type_hints,
25
+ )
14
26
 
15
27
  from chia_rs.sized_bytes import bytes32
16
28
  from chia_rs.sized_ints import uint16, uint32, uint64
17
- from typing_extensions import Literal, Self, get_args, get_origin
29
+ from typing_extensions import Self
18
30
 
19
31
  from chia.util.byte_types import hexstr_to_bytes
20
32
  from chia.util.hash import std_hash
@@ -120,7 +132,7 @@ def is_type_SpecificOptional(f_type: object) -> bool:
120
132
  """
121
133
  Returns true for types such as Optional[T], but not Optional, or T.
122
134
  """
123
- return get_origin(f_type) == Union and get_args(f_type)[1]() is None
135
+ return get_origin(f_type) in {Union, UnionType} and get_args(f_type)[1]() is None
124
136
 
125
137
 
126
138
  def is_type_Tuple(f_type: object) -> bool:
@@ -211,7 +223,7 @@ def streamable_from_dict(klass: type[_T_Streamable], item: Any) -> _T_Streamable
211
223
 
212
224
 
213
225
  def function_to_convert_one_item(
214
- f_type: type[Any], json_parser: Optional[Callable[[object, type[object]], Streamable]] = None
226
+ f_type: type[Any], json_parser: Callable[[object, type[object]], Streamable] | None = None
215
227
  ) -> ConvertFunctionType:
216
228
  if is_type_SpecificOptional(f_type):
217
229
  convert_inner_func = function_to_convert_one_item(get_args(f_type)[0], json_parser)
@@ -287,13 +299,15 @@ def function_to_post_init_process_one_item(f_type: type[object]) -> ConvertFunct
287
299
 
288
300
 
289
301
  def recurse_jsonify(
290
- d: Any, next_recursion_step: Optional[Callable[[Any, Any], Any]] = None, **next_recursion_env: Any
302
+ d: Any, next_recursion_step: Callable[[Any, Any], Any] | None = None, **next_recursion_env: Any
291
303
  ) -> Any:
292
304
  """
293
305
  Makes bytes objects into strings with 0x, and makes large ints into strings.
294
306
  """
295
307
  if next_recursion_step is None:
296
308
  next_recursion_step = recurse_jsonify
309
+ if getattr(d, "json_serialization_override", None) is not None:
310
+ return d.json_serialization_override(d)
297
311
  if dataclasses.is_dataclass(d):
298
312
  new_dict = {}
299
313
  for field in dataclasses.fields(d):
@@ -324,7 +338,7 @@ def recurse_jsonify(
324
338
  elif d is None or type(d) is str:
325
339
  return d
326
340
  elif hasattr(d, "to_json_dict"):
327
- ret: Union[list[Any], dict[str, Any], str, int, None] = d.to_json_dict()
341
+ ret: list[Any] | dict[str, Any] | str | int | None = d.to_json_dict()
328
342
  return ret
329
343
  raise UnsupportedType(f"failed to jsonify {d} (type: {type(d)})")
330
344
 
@@ -350,7 +364,7 @@ def write_uint32(f: BinaryIO, value: uint32, byteorder: Literal["little", "big"]
350
364
  f.write(value.to_bytes(4, byteorder))
351
365
 
352
366
 
353
- def parse_optional(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> Optional[object]:
367
+ def parse_optional(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> object | None:
354
368
  is_present_bytes = f.read(1)
355
369
  assert is_present_bytes is not None and len(is_present_bytes) == 1 # Checks for EOF
356
370
  if is_present_bytes == bytes([0]):
@@ -654,12 +668,12 @@ class Streamable:
654
668
  def parse(cls, f: BinaryIO) -> Self:
655
669
  # Create the object without calling __init__() to avoid unnecessary post-init checks in strictdataclass
656
670
  obj: Self = object.__new__(cls)
657
- for field in cls._streamable_fields:
671
+ for field in cls.streamable_fields():
658
672
  object.__setattr__(obj, field.name, field.parse_function(f))
659
673
  return obj
660
674
 
661
675
  def stream(self, f: BinaryIO) -> None:
662
- for field in self._streamable_fields:
676
+ for field in self.streamable_fields():
663
677
  field.stream_function(getattr(self, field.name), f)
664
678
 
665
679
  def get_hash(self) -> bytes32:
@@ -36,7 +36,7 @@ class _TaskReferencer:
36
36
  self,
37
37
  coroutine: typing.Coroutine[object, object, T],
38
38
  *,
39
- name: typing.Optional[str] = None,
39
+ name: str | None = None,
40
40
  known_unreferenced: bool = False,
41
41
  ) -> asyncio.Task[T]:
42
42
  task = asyncio.create_task(coro=coroutine, name=name) # noqa: TID251
chia/util/timing.py CHANGED
@@ -5,8 +5,8 @@ from __future__ import annotations
5
5
  import os
6
6
  import sys
7
7
  import time
8
- from collections.abc import Iterator
9
- from typing import Callable, Optional, overload
8
+ from collections.abc import Callable, Iterator
9
+ from typing import overload
10
10
 
11
11
  system_delays = {
12
12
  # based on data from https://github.com/Chia-Network/chia-blockchain/pull/13724
@@ -42,7 +42,7 @@ def adjusted_timeout(timeout: float) -> float: ...
42
42
  def adjusted_timeout(timeout: None) -> None: ...
43
43
 
44
44
 
45
- def adjusted_timeout(timeout: Optional[float]) -> Optional[float]:
45
+ def adjusted_timeout(timeout: float | None) -> float | None:
46
46
  if timeout is None:
47
47
  return None
48
48
 
@@ -7,9 +7,10 @@ import json
7
7
  import os
8
8
  import re
9
9
  import sys
10
+ from collections.abc import Callable
10
11
  from dataclasses import dataclass, field
11
12
  from pathlib import Path
12
- from typing import Any, Callable, Literal, Optional, Union
13
+ from typing import Any, Literal
13
14
 
14
15
  import click
15
16
  import yaml
@@ -90,7 +91,7 @@ def build_dependency_graph(dir_params: DirectoryParameters) -> dict[Path, list[P
90
91
 
91
92
 
92
93
  def build_virtual_dependency_graph(
93
- dir_params: DirectoryParameters, *, existing_graph: Optional[dict[Path, list[Path]]] = None
94
+ dir_params: DirectoryParameters, *, existing_graph: dict[Path, list[Path]] | None = None
94
95
  ) -> dict[str, list[str]]:
95
96
  if existing_graph is None:
96
97
  graph = build_dependency_graph(dir_params)
@@ -230,7 +231,7 @@ def find_cycles(
230
231
  return path_accumulator
231
232
 
232
233
 
233
- def print_graph(graph: Union[dict[str, list[str]], dict[Path, list[Path]]]) -> None:
234
+ def print_graph(graph: dict[str, list[str]] | dict[Path, list[Path]]) -> None:
234
235
  print(json.dumps({str(k): list(str(v) for v in vs) for k, vs in graph.items()}, indent=4))
235
236
 
236
237
 
@@ -288,7 +289,7 @@ class Package:
288
289
  is_file: Literal[False] = False
289
290
 
290
291
 
291
- FileOrPackage = Union[File, Package]
292
+ FileOrPackage = File | Package
292
293
 
293
294
 
294
295
  def parse_file_or_package(identifier: str) -> FileOrPackage:
@@ -335,7 +336,7 @@ def config(func: Callable[..., None]) -> Callable[..., None]:
335
336
  default=None,
336
337
  help="Path to the YAML configuration file.",
337
338
  )
338
- def inner(config_path: Optional[str], *args: Any, **kwargs: Any) -> None:
339
+ def inner(config_path: str | None, *args: Any, **kwargs: Any) -> None:
339
340
  exclude_paths = []
340
341
  ignore_cycles_in: list[str] = []
341
342
  ignore_specific_files: list[str] = []