chia-blockchain 2.5.7rc3__py3-none-any.whl → 2.5.8rc1__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 (528) 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_build_chains.py +2 -4
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  7. chia/_tests/clvm/coin_store.py +4 -7
  8. chia/_tests/clvm/test_clvm_step.py +4 -4
  9. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  10. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  11. chia/_tests/clvm/test_singletons.py +2 -4
  12. chia/_tests/clvm/test_spend_sim.py +2 -2
  13. chia/_tests/cmds/cmd_test_utils.py +27 -45
  14. chia/_tests/cmds/test_cmd_framework.py +6 -6
  15. chia/_tests/cmds/test_daemon.py +3 -3
  16. chia/_tests/cmds/test_show.py +4 -4
  17. chia/_tests/cmds/test_tx_config_args.py +1 -2
  18. chia/_tests/cmds/testing_classes.py +4 -5
  19. chia/_tests/cmds/wallet/test_did.py +24 -27
  20. chia/_tests/cmds/wallet/test_nft.py +12 -10
  21. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  22. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  23. chia/_tests/conftest.py +59 -30
  24. chia/_tests/connection_utils.py +2 -2
  25. chia/_tests/core/cmds/test_beta.py +4 -4
  26. chia/_tests/core/cmds/test_keys.py +2 -3
  27. chia/_tests/core/cmds/test_wallet.py +15 -15
  28. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  29. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  30. chia/_tests/core/daemon/test_daemon.py +11 -11
  31. chia/_tests/core/data_layer/conftest.py +2 -2
  32. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  33. chia/_tests/core/data_layer/test_data_store.py +10 -10
  34. chia/_tests/core/data_layer/util.py +11 -11
  35. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  36. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  37. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  38. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  39. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  40. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  41. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  42. chia/_tests/core/full_node/test_conditions.py +21 -23
  43. chia/_tests/core/full_node/test_full_node.py +225 -62
  44. chia/_tests/core/full_node/test_hint_management.py +2 -4
  45. chia/_tests/core/full_node/test_performance.py +0 -1
  46. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  47. chia/_tests/core/full_node/test_transactions.py +1 -2
  48. chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
  49. chia/_tests/core/mempool/test_mempool.py +29 -37
  50. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  51. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  52. chia/_tests/core/mempool/test_mempool_manager.py +963 -839
  53. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  54. chia/_tests/core/server/serve.py +7 -7
  55. chia/_tests/core/server/test_dos.py +1 -2
  56. chia/_tests/core/server/test_event_loop.py +12 -4
  57. chia/_tests/core/server/test_loop.py +7 -8
  58. chia/_tests/core/server/test_rate_limits.py +9 -8
  59. chia/_tests/core/server/test_server.py +61 -1
  60. chia/_tests/core/services/test_services.py +2 -2
  61. chia/_tests/core/ssl/test_ssl.py +2 -2
  62. chia/_tests/core/test_cost_calculation.py +2 -6
  63. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  64. chia/_tests/core/test_filter.py +0 -1
  65. chia/_tests/core/test_full_node_rpc.py +2 -2
  66. chia/_tests/core/test_merkle_set.py +1 -2
  67. chia/_tests/core/test_seeder.py +4 -4
  68. chia/_tests/core/util/test_config.py +4 -4
  69. chia/_tests/core/util/test_jsonify.py +2 -2
  70. chia/_tests/core/util/test_keychain.py +3 -3
  71. chia/_tests/core/util/test_lockfile.py +2 -1
  72. chia/_tests/core/util/test_log_exceptions.py +1 -2
  73. chia/_tests/core/util/test_streamable.py +17 -17
  74. chia/_tests/db/test_db_wrapper.py +3 -2
  75. chia/_tests/environments/wallet.py +14 -14
  76. chia/_tests/ether.py +4 -3
  77. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  78. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  79. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  80. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  81. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  82. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  83. chia/_tests/harvester/test_harvester_api.py +11 -4
  84. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  85. chia/_tests/plot_sync/test_receiver.py +11 -10
  86. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  87. chia/_tests/plot_sync/util.py +1 -2
  88. chia/_tests/plotting/test_plot_manager.py +7 -6
  89. chia/_tests/plotting/test_prover.py +30 -38
  90. chia/_tests/pools/test_pool_cmdline.py +4 -6
  91. chia/_tests/pools/test_pool_rpc.py +203 -61
  92. chia/_tests/pools/test_pool_wallet.py +3 -3
  93. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  94. chia/_tests/process_junit.py +2 -2
  95. chia/_tests/rpc/test_rpc_client.py +4 -4
  96. chia/_tests/rpc/test_rpc_server.py +3 -3
  97. chia/_tests/simulation/test_simulation.py +12 -25
  98. chia/_tests/solver/test_solver_service.py +13 -4
  99. chia/_tests/testconfig.py +2 -2
  100. chia/_tests/timelord/test_new_peak.py +22 -11
  101. chia/_tests/tools/test_run_block.py +0 -2
  102. chia/_tests/tools/test_virtual_project.py +2 -1
  103. chia/_tests/util/benchmarks.py +1 -0
  104. chia/_tests/util/blockchain.py +38 -36
  105. chia/_tests/util/blockchain_mock.py +11 -11
  106. chia/_tests/util/build_network_protocol_files.py +2 -1
  107. chia/_tests/util/coin_store.py +2 -1
  108. chia/_tests/util/config.py +1 -1
  109. chia/_tests/util/db_connection.py +2 -3
  110. chia/_tests/util/full_sync.py +9 -11
  111. chia/_tests/util/gen_ssl_certs.py +4 -5
  112. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  113. chia/_tests/util/misc.py +24 -24
  114. chia/_tests/util/network_protocol_data.py +20 -3
  115. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  116. chia/_tests/util/protocol_messages_json.py +292 -3
  117. chia/_tests/util/setup_nodes.py +62 -47
  118. chia/_tests/util/spend_sim.py +57 -57
  119. chia/_tests/util/test_async_pool.py +2 -3
  120. chia/_tests/util/test_chia_version.py +1 -3
  121. chia/_tests/util/test_config.py +3 -3
  122. chia/_tests/util/test_full_block_utils.py +6 -3
  123. chia/_tests/util/test_limited_semaphore.py +1 -2
  124. chia/_tests/util/test_misc.py +2 -2
  125. chia/_tests/util/test_network.py +1 -2
  126. chia/_tests/util/test_priority_mutex.py +3 -3
  127. chia/_tests/util/test_recursive_replace.py +5 -6
  128. chia/_tests/util/test_replace_str_to_bytes.py +8 -10
  129. chia/_tests/util/test_testnet_overrides.py +3 -3
  130. chia/_tests/util/time_out_assert.py +2 -2
  131. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  132. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  133. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  134. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  135. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  136. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  137. chia/_tests/wallet/conftest.py +6 -6
  138. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  139. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  140. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  141. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  142. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  145. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  146. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  147. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  148. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  149. chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
  150. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  151. chia/_tests/wallet/test_coin_management.py +2 -2
  152. chia/_tests/wallet/test_conditions.py +45 -51
  153. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  154. chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
  155. chia/_tests/wallet/test_notifications.py +14 -14
  156. chia/_tests/wallet/test_signer_protocol.py +5 -5
  157. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  158. chia/_tests/wallet/test_transaction_store.py +20 -20
  159. chia/_tests/wallet/test_util.py +2 -2
  160. chia/_tests/wallet/test_wallet.py +380 -228
  161. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  162. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  163. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  164. chia/_tests/wallet/test_wallet_node.py +14 -14
  165. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  166. chia/_tests/wallet/test_wallet_utils.py +2 -3
  167. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  168. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  169. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  170. chia/_tests/wallet/wallet_block_tools.py +12 -11
  171. chia/_tests/weight_proof/config.py +1 -0
  172. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  173. chia/apis/__init__.py +21 -0
  174. chia/apis/farmer_stub.py +102 -0
  175. chia/apis/full_node_stub.py +372 -0
  176. chia/apis/harvester_stub.py +57 -0
  177. chia/apis/introducer_stub.py +35 -0
  178. chia/apis/solver_stub.py +30 -0
  179. chia/apis/stub_protocol_registry.py +21 -0
  180. chia/apis/timelord_stub.py +39 -0
  181. chia/apis/wallet_stub.py +161 -0
  182. chia/cmds/beta.py +3 -4
  183. chia/cmds/beta_funcs.py +4 -3
  184. chia/cmds/check_wallet_db.py +4 -4
  185. chia/cmds/chia.py +1 -2
  186. chia/cmds/cmd_classes.py +11 -13
  187. chia/cmds/cmd_helpers.py +11 -11
  188. chia/cmds/cmds_util.py +15 -15
  189. chia/cmds/coin_funcs.py +6 -7
  190. chia/cmds/coins.py +2 -3
  191. chia/cmds/configure.py +1 -2
  192. chia/cmds/data.py +42 -42
  193. chia/cmds/data_funcs.py +81 -81
  194. chia/cmds/db.py +4 -5
  195. chia/cmds/db_backup_func.py +2 -2
  196. chia/cmds/db_upgrade_func.py +3 -3
  197. chia/cmds/db_validate_func.py +2 -2
  198. chia/cmds/dev/data.py +4 -4
  199. chia/cmds/dev/gh.py +5 -5
  200. chia/cmds/dev/installers.py +2 -3
  201. chia/cmds/dev/mempool.py +3 -4
  202. chia/cmds/dev/mempool_funcs.py +4 -4
  203. chia/cmds/dev/sim.py +8 -8
  204. chia/cmds/dump_keyring.py +3 -3
  205. chia/cmds/farm.py +6 -8
  206. chia/cmds/farm_funcs.py +25 -24
  207. chia/cmds/init_funcs.py +4 -4
  208. chia/cmds/keys.py +16 -18
  209. chia/cmds/keys_funcs.py +36 -36
  210. chia/cmds/netspace.py +1 -3
  211. chia/cmds/netspace_funcs.py +1 -2
  212. chia/cmds/options.py +3 -2
  213. chia/cmds/param_types.py +17 -16
  214. chia/cmds/passphrase.py +6 -7
  215. chia/cmds/passphrase_funcs.py +11 -13
  216. chia/cmds/peer.py +1 -3
  217. chia/cmds/peer_funcs.py +3 -3
  218. chia/cmds/plotnft.py +6 -7
  219. chia/cmds/plotnft_funcs.py +37 -26
  220. chia/cmds/rpc.py +3 -3
  221. chia/cmds/show.py +3 -5
  222. chia/cmds/show_funcs.py +9 -9
  223. chia/cmds/sim_funcs.py +25 -26
  224. chia/cmds/solver.py +1 -3
  225. chia/cmds/solver_funcs.py +1 -2
  226. chia/cmds/start_funcs.py +2 -2
  227. chia/cmds/wallet.py +76 -81
  228. chia/cmds/wallet_funcs.py +206 -177
  229. chia/consensus/augmented_chain.py +6 -6
  230. chia/consensus/block_body_validation.py +19 -15
  231. chia/consensus/block_creation.py +25 -21
  232. chia/consensus/block_header_validation.py +27 -13
  233. chia/consensus/block_height_map.py +3 -6
  234. chia/consensus/block_height_map_protocol.py +2 -2
  235. chia/consensus/block_record.py +2 -4
  236. chia/consensus/blockchain.py +58 -40
  237. chia/consensus/blockchain_interface.py +7 -7
  238. chia/consensus/coin_store_protocol.py +5 -6
  239. chia/consensus/condition_tools.py +4 -4
  240. chia/consensus/cost_calculator.py +2 -3
  241. chia/consensus/default_constants.py +16 -13
  242. chia/consensus/deficit.py +1 -3
  243. chia/consensus/difficulty_adjustment.py +3 -5
  244. chia/consensus/find_fork_point.py +2 -4
  245. chia/consensus/full_block_to_block_record.py +11 -13
  246. chia/consensus/generator_tools.py +2 -3
  247. chia/consensus/get_block_challenge.py +42 -26
  248. chia/consensus/get_block_generator.py +2 -3
  249. chia/consensus/make_sub_epoch_summary.py +8 -7
  250. chia/consensus/multiprocess_validation.py +31 -20
  251. chia/consensus/pos_quality.py +6 -23
  252. chia/consensus/pot_iterations.py +17 -44
  253. chia/consensus/signage_point.py +4 -5
  254. chia/consensus/vdf_info_computation.py +2 -4
  255. chia/daemon/client.py +8 -8
  256. chia/daemon/keychain_proxy.py +31 -37
  257. chia/daemon/server.py +32 -33
  258. chia/daemon/windows_signal.py +4 -3
  259. chia/data_layer/data_layer.py +86 -77
  260. chia/data_layer/data_layer_rpc_api.py +9 -9
  261. chia/data_layer/data_layer_rpc_client.py +13 -15
  262. chia/data_layer/data_layer_server.py +3 -3
  263. chia/data_layer/data_layer_util.py +14 -14
  264. chia/data_layer/data_layer_wallet.py +94 -101
  265. chia/data_layer/data_store.py +50 -50
  266. chia/data_layer/dl_wallet_store.py +9 -12
  267. chia/data_layer/download_data.py +8 -9
  268. chia/data_layer/s3_plugin_service.py +5 -9
  269. chia/data_layer/start_data_layer.py +5 -5
  270. chia/farmer/farmer.py +31 -31
  271. chia/farmer/farmer_api.py +45 -33
  272. chia/farmer/farmer_rpc_api.py +5 -4
  273. chia/farmer/farmer_rpc_client.py +6 -6
  274. chia/farmer/start_farmer.py +12 -7
  275. chia/full_node/block_store.py +13 -16
  276. chia/full_node/check_fork_next_block.py +1 -2
  277. chia/full_node/coin_store.py +15 -16
  278. chia/full_node/eligible_coin_spends.py +3 -3
  279. chia/full_node/fee_estimate_store.py +2 -3
  280. chia/full_node/fee_tracker.py +1 -2
  281. chia/full_node/full_block_utils.py +4 -4
  282. chia/full_node/full_node.py +238 -224
  283. chia/full_node/full_node_api.py +193 -150
  284. chia/full_node/full_node_rpc_api.py +53 -31
  285. chia/full_node/full_node_rpc_client.py +18 -19
  286. chia/full_node/full_node_store.py +45 -43
  287. chia/full_node/hint_management.py +2 -2
  288. chia/full_node/mempool.py +17 -19
  289. chia/full_node/mempool_manager.py +89 -42
  290. chia/full_node/pending_tx_cache.py +2 -3
  291. chia/full_node/start_full_node.py +5 -5
  292. chia/full_node/sync_store.py +3 -4
  293. chia/full_node/tx_processing_queue.py +34 -13
  294. chia/full_node/weight_proof.py +61 -48
  295. chia/harvester/harvester.py +25 -24
  296. chia/harvester/harvester_api.py +61 -38
  297. chia/harvester/harvester_rpc_api.py +10 -10
  298. chia/harvester/start_harvester.py +4 -4
  299. chia/introducer/introducer.py +3 -3
  300. chia/introducer/introducer_api.py +6 -4
  301. chia/introducer/start_introducer.py +4 -4
  302. chia/legacy/keyring.py +3 -3
  303. chia/plot_sync/delta.py +1 -2
  304. chia/plot_sync/receiver.py +20 -17
  305. chia/plot_sync/sender.py +15 -10
  306. chia/plotters/bladebit.py +7 -7
  307. chia/plotters/chiapos.py +2 -2
  308. chia/plotters/madmax.py +4 -4
  309. chia/plotters/plotters.py +4 -4
  310. chia/plotters/plotters_util.py +3 -3
  311. chia/plotting/cache.py +20 -14
  312. chia/plotting/check_plots.py +26 -35
  313. chia/plotting/create_plots.py +22 -23
  314. chia/plotting/manager.py +21 -14
  315. chia/plotting/prover.py +59 -42
  316. chia/plotting/util.py +16 -16
  317. chia/pools/pool_config.py +2 -1
  318. chia/pools/pool_puzzles.py +11 -12
  319. chia/pools/pool_wallet.py +34 -57
  320. chia/pools/pool_wallet_info.py +39 -10
  321. chia/protocols/farmer_protocol.py +8 -9
  322. chia/protocols/fee_estimate.py +3 -4
  323. chia/protocols/full_node_protocol.py +3 -4
  324. chia/protocols/harvester_protocol.py +27 -15
  325. chia/protocols/outbound_message.py +3 -3
  326. chia/protocols/pool_protocol.py +8 -9
  327. chia/protocols/shared_protocol.py +1 -2
  328. chia/protocols/solver_protocol.py +9 -2
  329. chia/protocols/timelord_protocol.py +4 -7
  330. chia/protocols/wallet_protocol.py +11 -12
  331. chia/rpc/rpc_client.py +9 -9
  332. chia/rpc/rpc_server.py +17 -17
  333. chia/rpc/util.py +2 -2
  334. chia/seeder/crawler.py +8 -8
  335. chia/seeder/crawler_api.py +21 -27
  336. chia/seeder/crawler_rpc_api.py +2 -2
  337. chia/seeder/dns_server.py +21 -21
  338. chia/seeder/start_crawler.py +4 -4
  339. chia/server/address_manager.py +15 -16
  340. chia/server/api_protocol.py +11 -11
  341. chia/server/chia_policy.py +46 -26
  342. chia/server/introducer_peers.py +2 -3
  343. chia/server/node_discovery.py +19 -19
  344. chia/server/rate_limit_numbers.py +4 -5
  345. chia/server/rate_limits.py +4 -4
  346. chia/server/resolve_peer_info.py +4 -4
  347. chia/server/server.py +49 -52
  348. chia/server/signal_handlers.py +6 -6
  349. chia/server/start_service.py +17 -17
  350. chia/server/upnp.py +4 -6
  351. chia/server/ws_connection.py +52 -37
  352. chia/simulator/add_blocks_in_batches.py +1 -3
  353. chia/simulator/block_tools.py +312 -200
  354. chia/simulator/full_node_simulator.py +56 -35
  355. chia/simulator/keyring.py +2 -3
  356. chia/simulator/setup_services.py +16 -15
  357. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  358. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  359. chia/simulator/simulator_protocol.py +1 -2
  360. chia/simulator/simulator_test_tools.py +3 -3
  361. chia/simulator/start_simulator.py +7 -7
  362. chia/simulator/wallet_tools.py +10 -10
  363. chia/solver/solver.py +10 -10
  364. chia/solver/solver_api.py +10 -8
  365. chia/solver/solver_rpc_api.py +2 -2
  366. chia/solver/start_solver.py +4 -4
  367. chia/ssl/cacert.pem +148 -90
  368. chia/ssl/chia_ca.crt +14 -10
  369. chia/ssl/chia_ca_old.crt +19 -0
  370. chia/ssl/create_ssl.py +4 -4
  371. chia/ssl/renewedselfsignedca.conf +4 -0
  372. chia/ssl/ssl_check.py +1 -2
  373. chia/timelord/iters_from_block.py +1 -4
  374. chia/timelord/start_timelord.py +4 -4
  375. chia/timelord/timelord.py +44 -40
  376. chia/timelord/timelord_api.py +6 -4
  377. chia/timelord/timelord_launcher.py +2 -2
  378. chia/timelord/timelord_rpc_api.py +2 -2
  379. chia/timelord/timelord_state.py +11 -12
  380. chia/types/block_protocol.py +1 -3
  381. chia/types/blockchain_format/coin.py +1 -3
  382. chia/types/blockchain_format/program.py +11 -8
  383. chia/types/blockchain_format/proof_of_space.py +123 -76
  384. chia/types/blockchain_format/tree_hash.py +3 -3
  385. chia/types/blockchain_format/vdf.py +1 -2
  386. chia/types/coin_spend.py +3 -3
  387. chia/types/mempool_item.py +5 -5
  388. chia/types/mempool_submission_status.py +2 -3
  389. chia/types/peer_info.py +1 -2
  390. chia/types/unfinished_header_block.py +3 -4
  391. chia/types/validation_state.py +1 -2
  392. chia/util/action_scope.py +8 -8
  393. chia/util/async_pool.py +5 -5
  394. chia/util/bech32m.py +1 -2
  395. chia/util/beta_metrics.py +2 -2
  396. chia/util/block_cache.py +4 -4
  397. chia/util/chia_logging.py +2 -2
  398. chia/util/chia_version.py +1 -2
  399. chia/util/config.py +15 -16
  400. chia/util/db_wrapper.py +26 -27
  401. chia/util/default_root.py +1 -2
  402. chia/util/errors.py +3 -3
  403. chia/util/file_keyring.py +14 -14
  404. chia/util/files.py +2 -3
  405. chia/util/hash.py +4 -4
  406. chia/util/initial-config.yaml +3 -5
  407. chia/util/inline_executor.py +2 -1
  408. chia/util/ip_address.py +1 -2
  409. chia/util/keychain.py +25 -27
  410. chia/util/keyring_wrapper.py +18 -19
  411. chia/util/lock.py +3 -4
  412. chia/util/log_exceptions.py +1 -2
  413. chia/util/lru_cache.py +2 -2
  414. chia/util/network.py +6 -6
  415. chia/util/path.py +2 -3
  416. chia/util/priority_mutex.py +2 -2
  417. chia/util/profiler.py +1 -2
  418. chia/util/safe_cancel_task.py +1 -2
  419. chia/util/streamable.py +22 -8
  420. chia/util/task_referencer.py +1 -1
  421. chia/util/timing.py +3 -3
  422. chia/util/virtual_project_analysis.py +6 -5
  423. chia/util/ws_message.py +2 -2
  424. chia/wallet/cat_wallet/cat_info.py +3 -4
  425. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  426. chia/wallet/cat_wallet/cat_utils.py +3 -4
  427. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  428. chia/wallet/cat_wallet/lineage_store.py +3 -4
  429. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  430. chia/wallet/coin_selection.py +9 -10
  431. chia/wallet/conditions.py +120 -105
  432. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  433. chia/wallet/derivation_record.py +1 -2
  434. chia/wallet/derive_keys.py +2 -4
  435. chia/wallet/did_wallet/did_info.py +10 -11
  436. chia/wallet/did_wallet/did_wallet.py +36 -82
  437. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  438. chia/wallet/driver_protocol.py +5 -7
  439. chia/wallet/lineage_proof.py +4 -4
  440. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  441. chia/wallet/nft_wallet/nft_info.py +8 -9
  442. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  443. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  444. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  445. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  446. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  447. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  448. chia/wallet/notification_manager.py +3 -3
  449. chia/wallet/notification_store.py +44 -61
  450. chia/wallet/outer_puzzles.py +6 -7
  451. chia/wallet/puzzle_drivers.py +34 -6
  452. chia/wallet/puzzles/clawback/drivers.py +6 -6
  453. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  454. chia/wallet/puzzles/load_clvm.py +1 -1
  455. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  456. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  457. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  458. chia/wallet/puzzles/tails.py +3 -3
  459. chia/wallet/singleton.py +5 -7
  460. chia/wallet/singleton_record.py +3 -3
  461. chia/wallet/start_wallet.py +5 -5
  462. chia/wallet/trade_manager.py +37 -58
  463. chia/wallet/trade_record.py +4 -4
  464. chia/wallet/trading/offer.py +59 -46
  465. chia/wallet/trading/trade_store.py +8 -9
  466. chia/wallet/transaction_record.py +8 -8
  467. chia/wallet/uncurried_puzzle.py +1 -2
  468. chia/wallet/util/clvm_streamable.py +12 -12
  469. chia/wallet/util/compute_hints.py +4 -5
  470. chia/wallet/util/curry_and_treehash.py +1 -2
  471. chia/wallet/util/merkle_tree.py +2 -3
  472. chia/wallet/util/peer_request_cache.py +8 -8
  473. chia/wallet/util/signing.py +85 -0
  474. chia/wallet/util/tx_config.py +15 -6
  475. chia/wallet/util/wallet_sync_utils.py +14 -16
  476. chia/wallet/util/wallet_types.py +2 -2
  477. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  478. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  479. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  480. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  481. chia/wallet/vc_wallet/vc_store.py +5 -6
  482. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  483. chia/wallet/wallet.py +50 -78
  484. chia/wallet/wallet_action_scope.py +11 -11
  485. chia/wallet/wallet_blockchain.py +12 -12
  486. chia/wallet/wallet_coin_record.py +12 -6
  487. chia/wallet/wallet_coin_store.py +24 -25
  488. chia/wallet/wallet_interested_store.py +3 -5
  489. chia/wallet/wallet_nft_store.py +10 -11
  490. chia/wallet/wallet_node.py +53 -61
  491. chia/wallet/wallet_node_api.py +5 -3
  492. chia/wallet/wallet_protocol.py +23 -23
  493. chia/wallet/wallet_puzzle_store.py +15 -18
  494. chia/wallet/wallet_request_types.py +778 -114
  495. chia/wallet/wallet_retry_store.py +1 -3
  496. chia/wallet/wallet_rpc_api.py +572 -909
  497. chia/wallet/wallet_rpc_client.py +87 -279
  498. chia/wallet/wallet_singleton_store.py +3 -4
  499. chia/wallet/wallet_state_manager.py +332 -106
  500. chia/wallet/wallet_transaction_store.py +11 -14
  501. chia/wallet/wallet_user_store.py +4 -6
  502. chia/wallet/wallet_weight_proof_handler.py +4 -4
  503. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
  505. chia/apis.py +0 -21
  506. chia/consensus/check_time_locks.py +0 -57
  507. chia/data_layer/puzzles/__init__.py +0 -0
  508. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  509. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  510. chia/types/coin_record.py +0 -44
  511. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  512. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  513. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  514. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  515. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  516. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  517. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  518. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  520. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  521. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  522. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  524. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  525. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  526. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  import json
4
4
  import logging
5
5
  from sqlite3 import Row
6
- from typing import Optional, Union
7
6
 
8
7
  from chia_rs.sized_bytes import bytes32
9
8
  from chia_rs.sized_ints import uint32
@@ -110,7 +109,7 @@ class WalletNftStore:
110
109
  )
111
110
  return c.rowcount > 0
112
111
 
113
- async def save_nft(self, wallet_id: uint32, did_id: Optional[bytes32], nft_coin_info: NFTCoinInfo) -> None:
112
+ async def save_nft(self, wallet_id: uint32, did_id: bytes32 | None, nft_coin_info: NFTCoinInfo) -> None:
114
113
  async with self.db_wrapper.writer_maybe_transaction() as conn:
115
114
  columns = (
116
115
  "nft_id, nft_coin_id, wallet_id, did_id, coin, lineage_proof, mint_height, status, full_puzzle, "
@@ -143,9 +142,9 @@ class WalletNftStore:
143
142
  (int(nft_coin_info.latest_height) - REMOVE_BUFF_BLOCKS,),
144
143
  )
145
144
 
146
- async def count(self, wallet_id: Optional[uint32] = None, did_id: Optional[bytes32] = None) -> int:
145
+ async def count(self, wallet_id: uint32 | None = None, did_id: bytes32 | None = None) -> int:
147
146
  sql = "SELECT COUNT(nft_id) FROM users_nfts WHERE removed_height is NULL"
148
- params: list[Union[uint32, bytes32]] = []
147
+ params: list[uint32 | bytes32] = []
149
148
  if wallet_id is not None:
150
149
  sql += " AND wallet_id=?"
151
150
  params.append(wallet_id)
@@ -158,9 +157,9 @@ class WalletNftStore:
158
157
  return int(count_row[0])
159
158
  return -1
160
159
 
161
- async def is_empty(self, wallet_id: Optional[uint32] = None) -> bool:
160
+ async def is_empty(self, wallet_id: uint32 | None = None) -> bool:
162
161
  sql = "SELECT 1 FROM users_nfts WHERE removed_height is NULL"
163
- params: list[Union[uint32, bytes32]] = []
162
+ params: list[uint32 | bytes32] = []
164
163
  if wallet_id is not None:
165
164
  sql += " AND wallet_id=?"
166
165
  params.append(wallet_id)
@@ -173,8 +172,8 @@ class WalletNftStore:
173
172
 
174
173
  async def get_nft_list(
175
174
  self,
176
- wallet_id: Optional[uint32] = None,
177
- did_id: Optional[bytes32] = None,
175
+ wallet_id: uint32 | None = None,
176
+ did_id: bytes32 | None = None,
178
177
  start_index: int = 0,
179
178
  count: int = 50,
180
179
  ) -> list[NFTCoinInfo]:
@@ -224,7 +223,7 @@ class WalletNftStore:
224
223
  )
225
224
  return True if rows and rows[0] == 1 else False
226
225
 
227
- async def get_nft_by_coin_id(self, nft_coin_id: bytes32) -> Optional[NFTCoinInfo]:
226
+ async def get_nft_by_coin_id(self, nft_coin_id: bytes32) -> NFTCoinInfo | None:
228
227
  async with self.db_wrapper.reader_no_transaction() as conn:
229
228
  rows = await conn.execute_fetchall(
230
229
  f"SELECT {NFT_COIN_INFO_COLUMNS} from users_nfts WHERE removed_height is NULL and nft_coin_id = ?",
@@ -237,10 +236,10 @@ class WalletNftStore:
237
236
  raise ValueError("Can only return one NFT, but found > 1 from given coin ids")
238
237
  return None
239
238
 
240
- async def get_nft_by_id(self, nft_id: bytes32, wallet_id: Optional[uint32] = None) -> Optional[NFTCoinInfo]:
239
+ async def get_nft_by_id(self, nft_id: bytes32, wallet_id: uint32 | None = None) -> NFTCoinInfo | None:
241
240
  async with self.db_wrapper.reader_no_transaction() as conn:
242
241
  sql = f"SELECT {NFT_COIN_INFO_COLUMNS} from users_nfts WHERE removed_height is NULL and nft_id=?"
243
- params: list[Union[uint32, str]] = [nft_id.hex()]
242
+ params: list[uint32 | str] = [nft_id.hex()]
244
243
  if wallet_id:
245
244
  sql += " and wallet_id=?"
246
245
  params.append(wallet_id)
@@ -11,7 +11,7 @@ import time
11
11
  import traceback
12
12
  from collections.abc import AsyncIterator
13
13
  from pathlib import Path
14
- from typing import TYPE_CHECKING, Any, ClassVar, Literal, Optional, Union, cast, overload
14
+ from typing import TYPE_CHECKING, Any, ClassVar, Literal, cast, overload
15
15
 
16
16
  import aiosqlite
17
17
  from chia_rs import AugSchemeMPL, CoinState, ConsensusConstants, G1Element, G2Element, HeaderBlock, PrivateKey
@@ -112,37 +112,37 @@ class WalletNode:
112
112
  config: dict[str, Any]
113
113
  root_path: Path
114
114
  constants: ConsensusConstants
115
- local_keychain: Optional[Keychain] = None
115
+ local_keychain: Keychain | None = None
116
116
 
117
117
  log: logging.Logger = logging.getLogger(__name__)
118
118
 
119
119
  # Sync data
120
- state_changed_callback: Optional[StateChangedProtocol] = None
121
- _wallet_state_manager: Optional[WalletStateManager] = None
122
- _weight_proof_handler: Optional[WalletWeightProofHandler] = None
123
- _server: Optional[ChiaServer] = None
124
- sync_task: Optional[asyncio.Task[None]] = None
125
- logged_in_fingerprint: Optional[int] = None
120
+ state_changed_callback: StateChangedProtocol | None = None
121
+ _wallet_state_manager: WalletStateManager | None = None
122
+ _weight_proof_handler: WalletWeightProofHandler | None = None
123
+ _server: ChiaServer | None = None
124
+ sync_task: asyncio.Task[None] | None = None
125
+ logged_in_fingerprint: int | None = None
126
126
  logged_in: bool = False
127
- _keychain_proxy: Optional[KeychainProxy] = None
127
+ _keychain_proxy: KeychainProxy | None = None
128
128
  _balance_cache: dict[int, Balance] = dataclasses.field(default_factory=dict)
129
129
  # Peers that we have long synced to
130
130
  synced_peers: set[bytes32] = dataclasses.field(default_factory=set)
131
- wallet_peers: Optional[WalletPeers] = None
131
+ wallet_peers: WalletPeers | None = None
132
132
  peer_caches: dict[bytes32, PeerRequestCache] = dataclasses.field(default_factory=dict)
133
- validation_semaphore: Optional[asyncio.Semaphore] = None
133
+ validation_semaphore: asyncio.Semaphore | None = None
134
134
  local_node_synced: bool = False
135
135
  LONG_SYNC_THRESHOLD: int = 300
136
136
  last_wallet_tx_resend_time: int = 0
137
137
  # Duration in seconds
138
138
  coin_state_retry_seconds: int = 10
139
139
  wallet_tx_resend_timeout_secs: int = 1800
140
- _new_peak_queue: Optional[NewPeakQueue] = None
140
+ _new_peak_queue: NewPeakQueue | None = None
141
141
 
142
142
  _shut_down: bool = False
143
- _process_new_subscriptions_task: Optional[asyncio.Task[None]] = None
144
- _retry_failed_states_task: Optional[asyncio.Task[None]] = None
145
- _secondary_peer_sync_task: Optional[asyncio.Task[None]] = None
143
+ _process_new_subscriptions_task: asyncio.Task[None] | None = None
144
+ _retry_failed_states_task: asyncio.Task[None] | None = None
145
+ _secondary_peer_sync_task: asyncio.Task[None] | None = None
146
146
  _tx_messages_in_progress: dict[bytes32, list[bytes32]] = dataclasses.field(default_factory=dict)
147
147
 
148
148
  @contextlib.asynccontextmanager
@@ -190,7 +190,7 @@ class WalletNode:
190
190
 
191
191
  return self._new_peak_queue
192
192
 
193
- def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
193
+ def get_connections(self, request_node_type: NodeType | None) -> list[dict[str, Any]]:
194
194
  return default_get_connections(server=self.server, request_node_type=request_node_type)
195
195
 
196
196
  async def ensure_keychain_proxy(self) -> KeychainProxy:
@@ -214,30 +214,26 @@ class WalletNode:
214
214
  cache.clear_after_height(reorg_height)
215
215
 
216
216
  @overload
217
- async def get_key_for_fingerprint(self, fingerprint: Optional[int]) -> Optional[G1Element]: ...
217
+ async def get_key_for_fingerprint(self, fingerprint: int | None) -> G1Element | None: ...
218
218
 
219
219
  @overload
220
- async def get_key_for_fingerprint(
221
- self, fingerprint: Optional[int], private: Literal[True]
222
- ) -> Optional[PrivateKey]: ...
220
+ async def get_key_for_fingerprint(self, fingerprint: int | None, private: Literal[True]) -> PrivateKey | None: ...
223
221
 
224
222
  @overload
225
- async def get_key_for_fingerprint(
226
- self, fingerprint: Optional[int], private: Literal[False]
227
- ) -> Optional[G1Element]: ...
223
+ async def get_key_for_fingerprint(self, fingerprint: int | None, private: Literal[False]) -> G1Element | None: ...
228
224
 
229
225
  @overload
230
226
  async def get_key_for_fingerprint(
231
- self, fingerprint: Optional[int], private: bool
232
- ) -> Optional[Union[PrivateKey, G1Element]]: ...
227
+ self, fingerprint: int | None, private: bool
228
+ ) -> PrivateKey | G1Element | None: ...
233
229
 
234
230
  async def get_key_for_fingerprint(
235
- self, fingerprint: Optional[int], private: bool = False
236
- ) -> Optional[Union[PrivateKey, G1Element]]:
231
+ self, fingerprint: int | None, private: bool = False
232
+ ) -> PrivateKey | G1Element | None:
237
233
  try:
238
234
  keychain_proxy = await self.ensure_keychain_proxy()
239
235
  # Returns first key if fingerprint is None
240
- key: Optional[Union[PrivateKey, G1Element]] = await keychain_proxy.get_key_for_fingerprint(
236
+ key: PrivateKey | G1Element | None = await keychain_proxy.get_key_for_fingerprint(
241
237
  fingerprint, private=private
242
238
  )
243
239
  except KeychainIsEmpty:
@@ -257,14 +253,14 @@ class WalletNode:
257
253
  return key
258
254
 
259
255
  async def get_key(
260
- self, fingerprint: Optional[int], private: bool = True, find_a_default: bool = True
261
- ) -> Optional[Union[PrivateKey, G1Element]]:
256
+ self, fingerprint: int | None, private: bool = True, find_a_default: bool = True
257
+ ) -> PrivateKey | G1Element | None:
262
258
  """
263
259
  Attempt to get the private key for the given fingerprint. If the fingerprint is None,
264
260
  get_key_for_fingerprint() will return the first private key. Similarly, if a key isn't
265
261
  returned for the provided fingerprint, the first key will be returned.
266
262
  """
267
- key: Optional[Union[PrivateKey, G1Element]] = await self.get_key_for_fingerprint(fingerprint, private=private)
263
+ key: PrivateKey | G1Element | None = await self.get_key_for_fingerprint(fingerprint, private=private)
268
264
 
269
265
  if key is None and fingerprint is not None and find_a_default:
270
266
  key = await self.get_key_for_fingerprint(None, private=private)
@@ -304,7 +300,7 @@ class WalletNode:
304
300
  save_config(self.root_path, "config.yaml", config)
305
301
  return auto_claim_config.to_json_dict()
306
302
 
307
- async def reset_sync_db(self, db_path: Union[Path, str], fingerprint: int) -> bool:
303
+ async def reset_sync_db(self, db_path: Path | str, fingerprint: int) -> bool:
308
304
  conn: aiosqlite.Connection
309
305
  # are not part of core wallet tables, but might appear later
310
306
  ignore_tables = {"lineage_proofs_", "sqlite_", "MIGRATED_VALID_TIMES_TXS", "MIGRATED_VALID_TIMES_TRADES"}
@@ -388,7 +384,7 @@ class WalletNode:
388
384
 
389
385
  async def _start_with_fingerprint(
390
386
  self,
391
- fingerprint: Optional[int] = None,
387
+ fingerprint: int | None = None,
392
388
  ) -> bool:
393
389
  # Makes sure the coin_state_updates get higher priority than new_peak messages.
394
390
  # Delayed instantiation until here to avoid errors.
@@ -601,8 +597,8 @@ class WalletNode:
601
597
  while not self._shut_down:
602
598
  # Here we process four types of messages in the queue, where the first one has higher priority (lower
603
599
  # number in the queue), and priority decreases for each type.
604
- peer: Optional[WSChiaConnection] = None
605
- item: Optional[NewPeakItem] = None
600
+ peer: WSChiaConnection | None = None
601
+ item: NewPeakItem | None = None
606
602
  try:
607
603
  peer, item = None, None
608
604
  item = await self.new_peak_queue.get()
@@ -676,8 +672,8 @@ class WalletNode:
676
672
  path.write_text(str(fingerprint))
677
673
  self.log.info(f"Updated last used fingerprint: {fingerprint}")
678
674
 
679
- def get_last_used_fingerprint(self) -> Optional[int]:
680
- fingerprint: Optional[int] = None
675
+ def get_last_used_fingerprint(self) -> int | None:
676
+ fingerprint: int | None = None
681
677
  try:
682
678
  path = self.get_last_used_fingerprint_path()
683
679
  if path.exists():
@@ -760,7 +756,7 @@ class WalletNode:
760
756
  if self.wallet_peers is not None:
761
757
  await self.wallet_peers.on_connect(peer)
762
758
 
763
- async def perform_atomic_rollback(self, fork_height: int, cache: Optional[PeerRequestCache] = None) -> None:
759
+ async def perform_atomic_rollback(self, fork_height: int, cache: PeerRequestCache | None = None) -> None:
764
760
  self.log.info(f"perform_atomic_rollback to {fork_height}")
765
761
  # this is to start a write transaction
766
762
  async with self.wallet_state_manager.db_wrapper.writer():
@@ -882,8 +878,8 @@ class WalletNode:
882
878
  self,
883
879
  items_input: list[CoinState],
884
880
  peer: WSChiaConnection,
885
- fork_height: Optional[uint32] = None,
886
- height: Optional[uint32] = None,
881
+ fork_height: uint32 | None = None,
882
+ height: uint32 | None = None,
887
883
  ) -> bool:
888
884
  # Adds the state to the wallet state manager. If the peer is trusted, we do not validate. If the peer is
889
885
  # untrusted we do, but we might not add the state, since we need to receive the new_peak message as well.
@@ -1064,7 +1060,7 @@ class WalletNode:
1064
1060
  neither.append(node)
1065
1061
  return synced_and_trusted + synced + trusted + neither
1066
1062
 
1067
- async def get_timestamp_for_height_from_peer(self, height: uint32, peer: WSChiaConnection) -> Optional[uint64]:
1063
+ async def get_timestamp_for_height_from_peer(self, height: uint32, peer: WSChiaConnection) -> uint64 | None:
1068
1064
  """
1069
1065
  Returns the timestamp for transaction block at h=height, if not transaction block, backtracks until it finds
1070
1066
  a transaction block
@@ -1078,7 +1074,7 @@ class WalletNode:
1078
1074
  block = cache.get_block(uint32(request_height))
1079
1075
  if block is None:
1080
1076
  self.log.debug(f"get_timestamp_for_height_from_peer cache miss for height {request_height}")
1081
- response: Optional[list[HeaderBlock]] = await request_header_blocks(
1077
+ response: list[HeaderBlock] | None = await request_header_blocks(
1082
1078
  peer, uint32(request_height), uint32(request_height)
1083
1079
  )
1084
1080
  if response is not None and len(response) > 0:
@@ -1111,7 +1107,7 @@ class WalletNode:
1111
1107
  self.log.debug("state manager is None (shutdown)")
1112
1108
  return
1113
1109
 
1114
- peak_hb: Optional[HeaderBlock] = await self.wallet_state_manager.blockchain.get_peak_block()
1110
+ peak_hb: HeaderBlock | None = await self.wallet_state_manager.blockchain.get_peak_block()
1115
1111
  if peak_hb is not None and peak_hb.header_hash == new_peak.header_hash:
1116
1112
  self.log.debug("skip known peak.")
1117
1113
  return
@@ -1122,7 +1118,7 @@ class WalletNode:
1122
1118
  return
1123
1119
 
1124
1120
  request = RequestBlockHeader(new_peak.height)
1125
- response: Optional[RespondBlockHeader] = await peer.call_api(FullNodeAPI.request_block_header, request)
1121
+ response: RespondBlockHeader | None = await peer.call_api(FullNodeAPI.request_block_header, request)
1126
1122
  if response is None:
1127
1123
  self.log.warning(f"Peer {peer.get_peer_info()} did not respond in time.")
1128
1124
  await peer.close(120)
@@ -1291,7 +1287,7 @@ class WalletNode:
1291
1287
  return True
1292
1288
 
1293
1289
  async def wallet_short_sync_backtrack(self, header_block: HeaderBlock, peer: WSChiaConnection) -> int:
1294
- peak: Optional[HeaderBlock] = await self.wallet_state_manager.blockchain.get_peak_block()
1290
+ peak: HeaderBlock | None = await self.wallet_state_manager.blockchain.get_peak_block()
1295
1291
 
1296
1292
  top = header_block
1297
1293
  blocks = [top]
@@ -1303,7 +1299,7 @@ class WalletNode:
1303
1299
 
1304
1300
  while not self.wallet_state_manager.blockchain.contains_block(top.prev_header_hash) and top.height > 0:
1305
1301
  request_prev = RequestBlockHeader(uint32(top.height - 1))
1306
- response_prev: Optional[RespondBlockHeader] = await peer.call_api(
1302
+ response_prev: RespondBlockHeader | None = await peer.call_api(
1307
1303
  FullNodeAPI.request_block_header, request_prev
1308
1304
  )
1309
1305
  if response_prev is None or not isinstance(response_prev, RespondBlockHeader):
@@ -1384,7 +1380,7 @@ class WalletNode:
1384
1380
  coin_state: CoinState,
1385
1381
  peer: WSChiaConnection,
1386
1382
  peer_request_cache: PeerRequestCache,
1387
- fork_height: Optional[uint32],
1383
+ fork_height: uint32 | None,
1388
1384
  ) -> bool:
1389
1385
  """
1390
1386
  Returns True if the coin_state is valid and included in the blockchain proved by the weight proof.
@@ -1396,8 +1392,8 @@ class WalletNode:
1396
1392
  if can_use_peer_request_cache(coin_state, peer_request_cache, fork_height):
1397
1393
  return True
1398
1394
 
1399
- spent_height: Optional[uint32] = None if coin_state.spent_height is None else uint32(coin_state.spent_height)
1400
- confirmed_height: Optional[uint32] = (
1395
+ spent_height: uint32 | None = None if coin_state.spent_height is None else uint32(coin_state.spent_height)
1396
+ confirmed_height: uint32 | None = (
1401
1397
  None if coin_state.created_height is None else uint32(coin_state.created_height)
1402
1398
  )
1403
1399
  current = await self.wallet_state_manager.coin_store.get_coin_record(coin_state.coin.name())
@@ -1429,7 +1425,7 @@ class WalletNode:
1429
1425
  confirmed_height = current.confirmed_block_height
1430
1426
 
1431
1427
  # request header block for created height
1432
- state_block: Optional[HeaderBlock] = peer_request_cache.get_block(confirmed_height)
1428
+ state_block: HeaderBlock | None = peer_request_cache.get_block(confirmed_height)
1433
1429
  if state_block is None or reorg_mode:
1434
1430
  state_blocks = await request_header_blocks(peer, confirmed_height, confirmed_height)
1435
1431
  if state_blocks is None:
@@ -1467,7 +1463,7 @@ class WalletNode:
1467
1463
  # Peer is telling us that coin that was previously known to be spent is not spent anymore
1468
1464
  # Check old state
1469
1465
 
1470
- spent_state_blocks: Optional[list[HeaderBlock]] = await request_header_blocks(
1466
+ spent_state_blocks: list[HeaderBlock] | None = await request_header_blocks(
1471
1467
  peer, current.spent_block_height, current.spent_block_height
1472
1468
  )
1473
1469
  if spent_state_blocks is None:
@@ -1535,7 +1531,7 @@ class WalletNode:
1535
1531
  if stored_record.header_hash == block.header_hash:
1536
1532
  return True
1537
1533
 
1538
- weight_proof: Optional[WeightProof] = self.wallet_state_manager.blockchain.synced_weight_proof
1534
+ weight_proof: WeightProof | None = self.wallet_state_manager.blockchain.synced_weight_proof
1539
1535
  if weight_proof is None:
1540
1536
  return False
1541
1537
 
@@ -1593,9 +1589,7 @@ class WalletNode:
1593
1589
  return False
1594
1590
  all_peers_c = self.server.get_connections(NodeType.FULL_NODE)
1595
1591
  all_peers = [(con, self.is_trusted(con)) for con in all_peers_c]
1596
- blocks: Optional[list[HeaderBlock]] = await fetch_header_blocks_in_range(
1597
- start, end, peer_request_cache, all_peers
1598
- )
1592
+ blocks: list[HeaderBlock] | None = await fetch_header_blocks_in_range(start, end, peer_request_cache, all_peers)
1599
1593
  if blocks is None:
1600
1594
  log_level = logging.DEBUG if self._shut_down or peer.closed else logging.ERROR
1601
1595
  self.log.log(log_level, f"Error fetching blocks {start} {end}")
@@ -1675,10 +1669,10 @@ class WalletNode:
1675
1669
  return True
1676
1670
 
1677
1671
  async def get_coin_state(
1678
- self, coin_names: list[bytes32], peer: WSChiaConnection, fork_height: Optional[uint32] = None
1672
+ self, coin_names: list[bytes32], peer: WSChiaConnection, fork_height: uint32 | None = None
1679
1673
  ) -> list[CoinState]:
1680
1674
  msg = RegisterForCoinUpdates(coin_names, uint32(0))
1681
- coin_state: Optional[RespondToCoinUpdates] = await peer.call_api(FullNodeAPI.register_for_coin_updates, msg)
1675
+ coin_state: RespondToCoinUpdates | None = await peer.call_api(FullNodeAPI.register_for_coin_updates, msg)
1682
1676
  if coin_state is None or not isinstance(coin_state, RespondToCoinUpdates):
1683
1677
  raise PeerRequestException(f"Was not able to get states for {coin_names}")
1684
1678
 
@@ -1699,11 +1693,9 @@ class WalletNode:
1699
1693
  return coin_state.coin_states
1700
1694
 
1701
1695
  async def fetch_children(
1702
- self, coin_name: bytes32, peer: WSChiaConnection, fork_height: Optional[uint32] = None
1696
+ self, coin_name: bytes32, peer: WSChiaConnection, fork_height: uint32 | None = None
1703
1697
  ) -> list[CoinState]:
1704
- response: Optional[RespondChildren] = await peer.call_api(
1705
- FullNodeAPI.request_children, RequestChildren(coin_name)
1706
- )
1698
+ response: RespondChildren | None = await peer.call_api(FullNodeAPI.request_children, RequestChildren(coin_name))
1707
1699
  if response is None or not isinstance(response, RespondChildren):
1708
1700
  raise PeerRequestException(f"Was not able to obtain children {response}")
1709
1701
 
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING, ClassVar, cast
4
+ from typing import TYPE_CHECKING, ClassVar
5
5
 
6
6
  from chia_rs import RespondToPhUpdates
7
7
 
@@ -16,9 +16,11 @@ from chia.wallet.wallet_node import WalletNode
16
16
 
17
17
  class WalletNodeAPI:
18
18
  if TYPE_CHECKING:
19
- from chia.server.api_protocol import ApiProtocol
19
+ from chia.apis.wallet_stub import WalletNodeApiStub
20
20
 
21
- _protocol_check: ClassVar[ApiProtocol] = cast("WalletNodeAPI", None)
21
+ # Verify this class implements the WalletNodeApiStub protocol
22
+ def _protocol_check(self: WalletNodeAPI) -> WalletNodeApiStub:
23
+ return self
22
24
 
23
25
  log: logging.Logger
24
26
  wallet_node: WalletNode
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, Optional, TypeVar
3
+ from typing import TYPE_CHECKING, Any, TypeVar
4
4
 
5
5
  from chia_rs import G1Element
6
6
  from chia_rs.sized_bytes import bytes32
@@ -31,7 +31,7 @@ class WalletProtocol(Protocol[T_contra]):
31
31
  def id(self) -> uint32: ...
32
32
 
33
33
  async def coin_added(
34
- self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[T_contra]
34
+ self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: T_contra | None
35
35
  ) -> None: ...
36
36
 
37
37
  async def select_coins(
@@ -40,15 +40,15 @@ class WalletProtocol(Protocol[T_contra]):
40
40
  action_scope: WalletActionScope,
41
41
  ) -> set[Coin]: ...
42
42
 
43
- async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128: ...
43
+ async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128: ...
44
44
 
45
- async def get_unconfirmed_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128: ...
45
+ async def get_unconfirmed_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128: ...
46
46
 
47
- async def get_spendable_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128: ...
47
+ async def get_spendable_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128: ...
48
48
 
49
49
  async def get_pending_change_balance(self) -> uint64: ...
50
50
 
51
- async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128: ...
51
+ async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128: ...
52
52
 
53
53
  # not all wallet supports this. To signal support, make
54
54
  # require_derivation_paths() return true
@@ -66,8 +66,8 @@ class WalletProtocol(Protocol[T_contra]):
66
66
  puzzle_hashes: list[bytes32],
67
67
  action_scope: WalletActionScope,
68
68
  fee: uint64 = uint64(0),
69
- coins: Optional[set[Coin]] = None,
70
- memos: Optional[list[list[bytes]]] = None,
69
+ coins: set[Coin] | None = None,
70
+ memos: list[list[bytes]] | None = None,
71
71
  extra_conditions: tuple[Condition, ...] = tuple(),
72
72
  **kwargs: Unpack[GSTOptionalArgs],
73
73
  ) -> None: ...
@@ -78,29 +78,29 @@ class WalletProtocol(Protocol[T_contra]):
78
78
 
79
79
  class GSTOptionalArgs(TypedDict):
80
80
  # DataLayerWallet
81
- launcher_id: NotRequired[Optional[bytes32]]
82
- new_root_hash: NotRequired[Optional[bytes32]]
81
+ launcher_id: NotRequired[bytes32 | None]
82
+ new_root_hash: NotRequired[bytes32 | None]
83
83
  sign: NotRequired[bool]
84
84
  announce_new_state: NotRequired[bool]
85
85
  # CATWallet
86
- cat_discrepancy: NotRequired[Optional[tuple[int, Program, Program]]]
86
+ cat_discrepancy: NotRequired[tuple[int, Program, Program] | None]
87
87
  # NFTWallet
88
- nft_coin: NotRequired[Optional[NFTCoinInfo]]
89
- new_owner: NotRequired[Optional[bytes]]
90
- new_did_inner_hash: NotRequired[Optional[bytes]]
91
- trade_prices_list: NotRequired[Optional[Program]]
88
+ nft_coin: NotRequired[NFTCoinInfo | None]
89
+ new_owner: NotRequired[bytes | None]
90
+ new_did_inner_hash: NotRequired[bytes | None]
91
+ trade_prices_list: NotRequired[Program | None]
92
92
  additional_bundles: NotRequired[list[WalletSpendBundle]]
93
- metadata_update: NotRequired[Optional[tuple[str, str]]]
93
+ metadata_update: NotRequired[tuple[str, str] | None]
94
94
  # CR-CAT Wallet
95
95
  add_authorizations_to_cr_cats: NotRequired[bool]
96
96
  # VCWallet
97
- new_proof_hash: NotRequired[Optional[bytes32]]
98
- provider_inner_puzhash: NotRequired[Optional[bytes32]]
97
+ new_proof_hash: NotRequired[bytes32 | None]
98
+ provider_inner_puzhash: NotRequired[bytes32 | None]
99
99
  self_revoke: NotRequired[bool]
100
- vc_id: NotRequired[Optional[bytes32]]
100
+ vc_id: NotRequired[bytes32 | None]
101
101
  # Wallet
102
- origin_id: NotRequired[Optional[bytes32]]
102
+ origin_id: NotRequired[bytes32 | None]
103
103
  negative_change_allowed: NotRequired[bool]
104
- puzzle_decorator_override: NotRequired[Optional[list[dict[str, Any]]]]
105
- reserve_fee: NotRequired[Optional[uint64]]
106
- preferred_change_puzzle_hash: NotRequired[Optional[bytes32]]
104
+ puzzle_decorator_override: NotRequired[list[dict[str, Any]] | None]
105
+ reserve_fee: NotRequired[uint64 | None]
106
+ preferred_change_puzzle_hash: NotRequired[bytes32 | None]
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import logging
5
- from typing import Optional
6
5
 
7
6
  from chia_rs import G1Element
8
7
  from chia_rs.sized_bytes import bytes32
@@ -28,7 +27,7 @@ class WalletPuzzleStore:
28
27
  wallet_identifier_cache: LRUCache
29
28
  # maps wallet_id -> last_derivation_index
30
29
  last_wallet_derivation_index: dict[uint32, uint32]
31
- last_derivation_index: Optional[uint32]
30
+ last_derivation_index: uint32 | None
32
31
 
33
32
  @classmethod
34
33
  async def create(cls, db_wrapper: DBWrapper2):
@@ -110,9 +109,7 @@ class WalletPuzzleStore:
110
109
  )
111
110
  ).close()
112
111
 
113
- async def get_derivation_record(
114
- self, index: uint32, wallet_id: uint32, hardened: bool
115
- ) -> Optional[DerivationRecord]:
112
+ async def get_derivation_record(self, index: uint32, wallet_id: uint32, hardened: bool) -> DerivationRecord | None:
116
113
  """
117
114
  Returns the derivation record by index and wallet id.
118
115
  """
@@ -133,7 +130,7 @@ class WalletPuzzleStore:
133
130
 
134
131
  return None
135
132
 
136
- async def get_derivation_record_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[DerivationRecord]:
133
+ async def get_derivation_record_for_puzzle_hash(self, puzzle_hash: bytes32) -> DerivationRecord | None:
137
134
  """
138
135
  Returns the derivation record by index and wallet id.
139
136
  """
@@ -183,7 +180,7 @@ class WalletPuzzleStore:
183
180
  bool(row[5]),
184
181
  )
185
182
 
186
- async def index_for_pubkey(self, pubkey: G1Element) -> Optional[uint32]:
183
+ async def index_for_pubkey(self, pubkey: G1Element) -> uint32 | None:
187
184
  """
188
185
  Returns derivation paths for the given pubkey.
189
186
  Returns None if not present.
@@ -199,7 +196,7 @@ class WalletPuzzleStore:
199
196
 
200
197
  return None
201
198
 
202
- async def record_for_pubkey(self, pubkey: G1Element) -> Optional[DerivationRecord]:
199
+ async def record_for_pubkey(self, pubkey: G1Element) -> DerivationRecord | None:
203
200
  """
204
201
  Returns derivation record for the given pubkey.
205
202
  Returns None if not present.
@@ -216,7 +213,7 @@ class WalletPuzzleStore:
216
213
 
217
214
  return None if row is None else self.row_to_record(row)
218
215
 
219
- async def index_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[uint32]:
216
+ async def index_for_puzzle_hash(self, puzzle_hash: bytes32) -> uint32 | None:
220
217
  """
221
218
  Returns the derivation path for the puzzle_hash.
222
219
  Returns None if not present.
@@ -227,7 +224,7 @@ class WalletPuzzleStore:
227
224
  )
228
225
  return None if row is None else uint32(row[0])
229
226
 
230
- async def record_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[DerivationRecord]:
227
+ async def record_for_puzzle_hash(self, puzzle_hash: bytes32) -> DerivationRecord | None:
231
228
  """
232
229
  Returns the derivation path for the puzzle_hash.
233
230
  Returns None if not present.
@@ -246,7 +243,7 @@ class WalletPuzzleStore:
246
243
 
247
244
  return None
248
245
 
249
- async def get_wallet_identifier_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[WalletIdentifier]:
246
+ async def get_wallet_identifier_for_puzzle_hash(self, puzzle_hash: bytes32) -> WalletIdentifier | None:
250
247
  """
251
248
  Returns the derivation path for the puzzle_hash.
252
249
  Returns None if not present.
@@ -267,7 +264,7 @@ class WalletPuzzleStore:
267
264
 
268
265
  return None
269
266
 
270
- async def get_all_puzzle_hashes(self, wallet_id: Optional[int] = None) -> set[bytes32]:
267
+ async def get_all_puzzle_hashes(self, wallet_id: int | None = None) -> set[bytes32]:
271
268
  """
272
269
  Return a set containing all puzzle_hashes we generated.
273
270
  """
@@ -281,7 +278,7 @@ class WalletPuzzleStore:
281
278
  )
282
279
  return {bytes32.fromhex(row[0]) for row in rows}
283
280
 
284
- async def get_last_derivation_path(self) -> Optional[uint32]:
281
+ async def get_last_derivation_path(self) -> uint32 | None:
285
282
  """
286
283
  Returns the last derivation path by derivation_index.
287
284
  """
@@ -294,11 +291,11 @@ class WalletPuzzleStore:
294
291
  self.last_derivation_index = last_derivation_index
295
292
  return self.last_derivation_index
296
293
 
297
- async def get_last_derivation_path_for_wallet(self, wallet_id: int) -> Optional[uint32]:
294
+ async def get_last_derivation_path_for_wallet(self, wallet_id: int) -> uint32 | None:
298
295
  """
299
296
  Returns the last derivation path by derivation_index.
300
297
  """
301
- cached_derivation_index: Optional[uint32] = self.last_wallet_derivation_index.get(uint32(wallet_id))
298
+ cached_derivation_index: uint32 | None = self.last_wallet_derivation_index.get(uint32(wallet_id))
302
299
  if cached_derivation_index is not None:
303
300
  return cached_derivation_index
304
301
 
@@ -311,7 +308,7 @@ class WalletPuzzleStore:
311
308
  self.last_wallet_derivation_index[uint32(wallet_id)] = derivation_index
312
309
  return derivation_index
313
310
 
314
- async def get_current_derivation_record_for_wallet(self, wallet_id: uint32) -> Optional[DerivationRecord]:
311
+ async def get_current_derivation_record_for_wallet(self, wallet_id: uint32) -> DerivationRecord | None:
315
312
  """
316
313
  Returns the current derivation record by derivation_index.
317
314
  """
@@ -329,7 +326,7 @@ class WalletPuzzleStore:
329
326
 
330
327
  return None
331
328
 
332
- async def get_unused_derivation_path(self) -> Optional[uint32]:
329
+ async def get_unused_derivation_path(self) -> uint32 | None:
333
330
  """
334
331
  Returns the first unused derivation path by derivation_index.
335
332
  """
@@ -343,7 +340,7 @@ class WalletPuzzleStore:
343
340
 
344
341
  return None
345
342
 
346
- async def get_unused_derivation_path_for_wallet(self, wallet_id: uint32) -> Optional[uint32]:
343
+ async def get_unused_derivation_path_for_wallet(self, wallet_id: uint32) -> uint32 | None:
347
344
  """
348
345
  Returns the first unused derivation path by derivation_index.
349
346
  """