chia-blockchain 2.5.7rc4__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 +6 -6
  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 +15 -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.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc4.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.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/wallet/wallet.py CHANGED
@@ -1,8 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- import time
5
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
4
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
6
5
 
7
6
  from chia_rs import AugSchemeMPL, CoinSpend, G1Element, G2Element, PrivateKey
8
7
  from chia_rs.sized_bytes import bytes32
@@ -13,16 +12,13 @@ from chia.types.blockchain_format.coin import Coin
13
12
  from chia.types.blockchain_format.program import Program
14
13
  from chia.types.blockchain_format.serialized_program import SerializedProgram
15
14
  from chia.types.coin_spend import make_spend
16
- from chia.types.signing_mode import CHIP_0002_SIGN_MESSAGE_PREFIX, SigningMode
17
15
  from chia.util.hash import std_hash
18
- from chia.util.streamable import Streamable
19
16
  from chia.wallet.coin_selection import select_coins
20
17
  from chia.wallet.conditions import (
21
18
  AssertCoinAnnouncement,
22
19
  Condition,
23
20
  CreateCoin,
24
21
  CreateCoinAnnouncement,
25
- parse_timelock_info,
26
22
  )
27
23
  from chia.wallet.derivation_record import DerivationRecord
28
24
  from chia.wallet.derive_keys import (
@@ -53,9 +49,8 @@ from chia.wallet.signer_protocol import (
53
49
  TransactionInfo,
54
50
  )
55
51
  from chia.wallet.transaction_record import TransactionRecord
56
- from chia.wallet.util.compute_memos import compute_memos
57
52
  from chia.wallet.util.puzzle_decorator import PuzzleDecoratorManager
58
- from chia.wallet.util.transaction_type import CLAWBACK_INCOMING_TRANSACTION_TYPES, TransactionType
53
+ from chia.wallet.util.transaction_type import CLAWBACK_INCOMING_TRANSACTION_TYPES
59
54
  from chia.wallet.util.wallet_types import WalletIdentifier, WalletType
60
55
  from chia.wallet.wallet_action_scope import WalletActionScope
61
56
  from chia.wallet.wallet_coin_record import WalletCoinRecord
@@ -99,15 +94,15 @@ class Wallet:
99
94
  # avoid full block TXs
100
95
  return int(self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM / 5 / self.cost_of_single_tx)
101
96
 
102
- async def get_max_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> set[WalletCoinRecord]:
103
- spendable: list[WalletCoinRecord] = list(
104
- await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), records)
97
+ async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
98
+ return uint128(
99
+ sum(
100
+ cr.coin.amount
101
+ for cr in await self.wallet_state_manager.get_spendable_coins_for_wallet(
102
+ self.id(), records, in_one_block=True
103
+ )
104
+ )
105
105
  )
106
- spendable.sort(reverse=True, key=lambda record: record.coin.amount)
107
- return set(spendable[0 : min(len(spendable), self.max_send_quantity)])
108
-
109
- async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
110
- return uint128(sum(cr.coin.amount for cr in await self.get_max_spendable_coins()))
111
106
 
112
107
  @classmethod
113
108
  def type(cls) -> WalletType:
@@ -116,13 +111,16 @@ class Wallet:
116
111
  def id(self) -> uint32:
117
112
  return self.wallet_id
118
113
 
119
- async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
114
+ def convert_secret_key_to_synthetic(self, secret_key: PrivateKey) -> PrivateKey:
115
+ return calculate_synthetic_secret_key(secret_key, DEFAULT_HIDDEN_PUZZLE_HASH)
116
+
117
+ async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
120
118
  return await self.wallet_state_manager.get_confirmed_balance_for_wallet(self.id(), record_list)
121
119
 
122
- async def get_unconfirmed_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
120
+ async def get_unconfirmed_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
123
121
  return await self.wallet_state_manager.get_unconfirmed_balance(self.id(), unspent_records)
124
122
 
125
- async def get_spendable_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
123
+ async def get_spendable_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
126
124
  spendable = await self.wallet_state_manager.get_confirmed_spendable_balance_for_wallet(
127
125
  self.id(), unspent_records
128
126
  )
@@ -208,7 +206,9 @@ class Wallet:
208
206
  Note: Must be called under wallet state manager lock
209
207
  """
210
208
  spendable_amount: uint128 = await self.get_spendable_balance()
211
- spendable_coins: list[WalletCoinRecord] = list(await self.get_max_spendable_coins())
209
+ spendable_coins: list[WalletCoinRecord] = list(
210
+ await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), in_one_block=True)
211
+ )
212
212
 
213
213
  # Try to use coins from the store, if there isn't enough of "unused"
214
214
  # coins use change coins that are not confirmed yet
@@ -234,14 +234,14 @@ class Wallet:
234
234
  newpuzzlehashes: list[bytes32],
235
235
  action_scope: WalletActionScope,
236
236
  fee: uint64 = uint64(0),
237
- origin_id: Optional[bytes32] = None,
238
- coins: Optional[set[Coin]] = None,
239
- memos: Optional[list[list[bytes]]] = None,
237
+ origin_id: bytes32 | None = None,
238
+ coins: set[Coin] | None = None,
239
+ memos: list[list[bytes]] | None = None,
240
240
  negative_change_allowed: bool = False,
241
- puzzle_decorator_override: Optional[list[dict[str, Any]]] = None,
241
+ puzzle_decorator_override: list[dict[str, Any]] | None = None,
242
242
  extra_conditions: tuple[Condition, ...] = tuple(),
243
- reserve_fee: Optional[uint64] = None,
244
- preferred_change_puzzle_hash: Optional[bytes32] = None,
243
+ reserve_fee: uint64 | None = None,
244
+ preferred_change_puzzle_hash: bytes32 | None = None,
245
245
  ) -> list[CoinSpend]:
246
246
  """
247
247
  Generates a unsigned transaction in form of List(Puzzle, Solutions)
@@ -274,7 +274,7 @@ class Wallet:
274
274
  assert change >= 0
275
275
 
276
276
  spends: list[CoinSpend] = []
277
- primary_announcement: Optional[AssertCoinAnnouncement] = None
277
+ primary_announcement: AssertCoinAnnouncement | None = None
278
278
 
279
279
  # Check for duplicates
280
280
  all_primaries_list = list(zip(amounts, newpuzzlehashes))
@@ -363,38 +363,22 @@ class Wallet:
363
363
  self.log.debug(f"Spends is {spends}")
364
364
  return spends
365
365
 
366
- async def sign_message(self, message: str, puzzle_hash: bytes32, mode: SigningMode) -> tuple[G1Element, G2Element]:
367
- # CHIP-0002 message signing as documented at:
368
- # https://github.com/Chia-Network/chips/blob/80e4611fe52b174bf1a0382b9dff73805b18b8c6/CHIPs/chip-0002.md#signmessage
369
- private = await self.wallet_state_manager.get_private_key(puzzle_hash)
370
- synthetic_secret_key = calculate_synthetic_secret_key(private, DEFAULT_HIDDEN_PUZZLE_HASH)
371
- synthetic_pk = synthetic_secret_key.get_g1()
372
- if mode == SigningMode.CHIP_0002_HEX_INPUT:
373
- hex_message: bytes = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, bytes.fromhex(message))).get_tree_hash()
374
- elif mode == SigningMode.BLS_MESSAGE_AUGMENTATION_UTF8_INPUT:
375
- hex_message = bytes(message, "utf-8")
376
- elif mode == SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT:
377
- hex_message = bytes.fromhex(message)
378
- else:
379
- hex_message = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, message)).get_tree_hash()
380
- return synthetic_pk, AugSchemeMPL.sign(synthetic_secret_key, hex_message)
381
-
382
366
  async def generate_signed_transaction(
383
367
  self,
384
368
  amounts: list[uint64],
385
369
  puzzle_hashes: list[bytes32],
386
370
  action_scope: WalletActionScope,
387
371
  fee: uint64 = uint64(0),
388
- coins: Optional[set[Coin]] = None,
389
- memos: Optional[list[list[bytes]]] = None,
372
+ coins: set[Coin] | None = None,
373
+ memos: list[list[bytes]] | None = None,
390
374
  extra_conditions: tuple[Condition, ...] = tuple(),
391
375
  **kwargs: Unpack[GSTOptionalArgs],
392
376
  ) -> None:
393
- origin_id: Optional[bytes32] = kwargs.get("origin_id", None)
377
+ origin_id: bytes32 | None = kwargs.get("origin_id", None)
394
378
  negative_change_allowed: bool = kwargs.get("negative_change_allowed", False)
395
- puzzle_decorator_override: Optional[list[dict[str, Any]]] = kwargs.get("puzzle_decorator_override", None)
396
- reserve_fee: Optional[uint64] = kwargs.get("reserve_fee", None)
397
- preferred_change_puzzle_hash: Optional[bytes32] = kwargs.get("preferred_change_puzzle_hash", None)
379
+ puzzle_decorator_override: list[dict[str, Any]] | None = kwargs.get("puzzle_decorator_override", None)
380
+ reserve_fee: uint64 | None = kwargs.get("reserve_fee", None)
381
+ preferred_change_puzzle_hash: bytes32 | None = kwargs.get("preferred_change_puzzle_hash", None)
398
382
  """
399
383
  Use this to generate transaction.
400
384
  Note: this must be called under a wallet state manager lock
@@ -402,7 +386,7 @@ class Wallet:
402
386
  """
403
387
  non_change_amount = uint64(sum(amounts))
404
388
 
405
- self.log.debug("Generating transaction for: %s %s %s", puzzle_hashes, amounts, repr(coins))
389
+ self.log.debug("Generating transaction for: %s %s %r", puzzle_hashes, amounts, coins)
406
390
  transaction = await self._generate_unsigned_transaction(
407
391
  amounts,
408
392
  puzzle_hashes,
@@ -420,7 +404,6 @@ class Wallet:
420
404
  assert len(transaction) > 0
421
405
  spend_bundle = WalletSpendBundle(transaction, G2Element())
422
406
 
423
- now = uint64(time.time())
424
407
  add_list: list[Coin] = list(spend_bundle.additions())
425
408
  rem_list: list[Coin] = list(spend_bundle.removals())
426
409
 
@@ -434,25 +417,16 @@ class Wallet:
434
417
  to_ph = add_list[0].puzzle_hash if len(add_list) > 0 else bytes32.zeros
435
418
  async with action_scope.use() as interface:
436
419
  interface.side_effects.transactions.append(
437
- TransactionRecord(
438
- confirmed_at_height=uint32(0),
439
- created_at_time=now,
440
- to_puzzle_hash=to_ph,
441
- to_address=self.wallet_state_manager.encode_puzzle_hash(to_ph),
420
+ self.wallet_state_manager.new_outgoing_transaction(
421
+ wallet_id=self.id(),
422
+ puzzle_hash=to_ph,
442
423
  amount=uint64(non_change_amount),
443
- fee_amount=uint64(fee),
444
- confirmed=False,
445
- sent=uint32(0),
424
+ fee=fee,
446
425
  spend_bundle=spend_bundle,
447
426
  additions=add_list,
448
427
  removals=rem_list,
449
- wallet_id=self.id(),
450
- sent_to=[],
451
- trade_id=None,
452
- type=uint32(TransactionType.OUTGOING_TX.value),
453
428
  name=spend_bundle.name(),
454
- memos=compute_memos(spend_bundle),
455
- valid_times=parse_timelock_info(extra_conditions),
429
+ extra_conditions=extra_conditions,
456
430
  )
457
431
  )
458
432
 
@@ -460,10 +434,10 @@ class Wallet:
460
434
  self,
461
435
  fee: uint64,
462
436
  action_scope: WalletActionScope,
463
- coins: Optional[set[Coin]] = None,
437
+ coins: set[Coin] | None = None,
464
438
  extra_conditions: tuple[Condition, ...] = tuple(),
465
- reserve_fee: Optional[uint64] = None,
466
- preferred_change_puzzle_hash: Optional[bytes32] = None,
439
+ reserve_fee: uint64 | None = None,
440
+ preferred_change_puzzle_hash: bytes32 | None = None,
467
441
  ) -> None:
468
442
  if coins is None:
469
443
  coins = await self.select_coins(fee, action_scope)
@@ -480,7 +454,7 @@ class Wallet:
480
454
 
481
455
  async def get_coins_to_offer(
482
456
  self,
483
- asset_id: Optional[bytes32],
457
+ asset_id: bytes32 | None,
484
458
  amount: uint64,
485
459
  action_scope: WalletActionScope,
486
460
  ) -> set[Coin]:
@@ -494,9 +468,7 @@ class Wallet:
494
468
  return await self.select_coins(amount, sandbox)
495
469
 
496
470
  # WSChiaConnection is only imported for type checking
497
- async def coin_added(
498
- self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[Streamable]
499
- ) -> None:
471
+ async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: object | None) -> None:
500
472
  pass
501
473
 
502
474
  def get_name(self) -> str:
@@ -504,9 +476,9 @@ class Wallet:
504
476
 
505
477
  async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool:
506
478
  if hint == coin.puzzle_hash:
507
- wallet_identifier: Optional[
508
- WalletIdentifier
509
- ] = await self.wallet_state_manager.puzzle_store.get_wallet_identifier_for_puzzle_hash(coin.puzzle_hash)
479
+ wallet_identifier: (
480
+ WalletIdentifier | None
481
+ ) = await self.wallet_state_manager.puzzle_store.get_wallet_identifier_for_puzzle_hash(coin.puzzle_hash)
510
482
  if wallet_identifier is not None and wallet_identifier.id == self.id():
511
483
  return True
512
484
  return False
@@ -514,9 +486,9 @@ class Wallet:
514
486
  def hardened_pubkey_for_path(self, path: list[int]) -> G1Element:
515
487
  return _derive_path(self.wallet_state_manager.get_master_private_key(), path).get_g1()
516
488
 
517
- async def sum_hint_for_pubkey(self, pk: bytes) -> Optional[SumHint]:
489
+ async def sum_hint_for_pubkey(self, pk: bytes) -> SumHint | None:
518
490
  pk_parsed: G1Element = G1Element.from_bytes(pk)
519
- dr: Optional[DerivationRecord] = await self.wallet_state_manager.puzzle_store.record_for_puzzle_hash(
491
+ dr: DerivationRecord | None = await self.wallet_state_manager.puzzle_store.record_for_puzzle_hash(
520
492
  puzzle_hash_for_synthetic_public_key(pk_parsed)
521
493
  )
522
494
  if dr is None:
@@ -527,9 +499,9 @@ class Wallet:
527
499
  pk,
528
500
  )
529
501
 
530
- async def path_hint_for_pubkey(self, pk: bytes) -> Optional[PathHint]:
502
+ async def path_hint_for_pubkey(self, pk: bytes) -> PathHint | None:
531
503
  pk_parsed: G1Element = G1Element.from_bytes(pk)
532
- index: Optional[uint32] = await self.wallet_state_manager.puzzle_store.index_for_pubkey(pk_parsed)
504
+ index: uint32 | None = await self.wallet_state_manager.puzzle_store.index_for_pubkey(pk_parsed)
533
505
  if index is None:
534
506
  index = await self.wallet_state_manager.puzzle_store.index_for_puzzle_hash(
535
507
  puzzle_hash_for_synthetic_public_key(pk_parsed)
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import contextlib
4
- from collections.abc import AsyncIterator
4
+ from collections.abc import AsyncIterator, Callable
5
5
  from dataclasses import dataclass, field, replace
6
- from typing import TYPE_CHECKING, Callable, Optional, cast, final
6
+ from typing import TYPE_CHECKING, cast, final
7
7
 
8
8
  from chia_rs.chia_rs import G1Element
9
9
  from chia_rs.sized_bytes import bytes32
@@ -33,7 +33,7 @@ class _StreamableWalletSideEffects(Streamable):
33
33
  extra_spends: list[WalletSpendBundle]
34
34
  selected_coins: list[Coin]
35
35
  singleton_records: list[SingletonRecord]
36
- get_unused_derivation_record_result: Optional[StreambleGetUnusedDerivationRecordResult]
36
+ get_unused_derivation_record_result: StreambleGetUnusedDerivationRecordResult | None
37
37
 
38
38
 
39
39
  @dataclass
@@ -43,7 +43,7 @@ class WalletSideEffects:
43
43
  extra_spends: list[WalletSpendBundle] = field(default_factory=list)
44
44
  selected_coins: list[Coin] = field(default_factory=list)
45
45
  singleton_records: list[SingletonRecord] = field(default_factory=list)
46
- get_unused_derivation_record_result: Optional[StreambleGetUnusedDerivationRecordResult] = None
46
+ get_unused_derivation_record_result: StreambleGetUnusedDerivationRecordResult | None = None
47
47
 
48
48
  def __bytes__(self) -> bytes:
49
49
  return bytes(_StreamableWalletSideEffects(**self.__dict__))
@@ -58,7 +58,7 @@ class WalletSideEffects:
58
58
  class WalletActionConfig:
59
59
  push: bool
60
60
  merge_spends: bool
61
- sign: Optional[bool]
61
+ sign: bool | None
62
62
  additional_signing_responses: list[SigningResponse]
63
63
  extra_spends: list[WalletSpendBundle]
64
64
  tx_config: TXConfig
@@ -98,12 +98,12 @@ class WalletActionScope(ActionScope[WalletSideEffects, WalletActionConfig]):
98
98
  return (await self._get_unused_derivation_path(wallet_state_manager)).record.puzzle_hash
99
99
 
100
100
  async def get_puzzle(
101
- self, wallet_state_manager: WalletStateManager, override_reuse_puzhash_with: Optional[bool] = None
101
+ self, wallet_state_manager: WalletStateManager, override_reuse_puzhash_with: bool | None = None
102
102
  ) -> Program:
103
103
  if (
104
104
  self.config.tx_config.reuse_puzhash or override_reuse_puzhash_with is True
105
105
  ) and override_reuse_puzhash_with is not False:
106
- record: Optional[DerivationRecord] = await wallet_state_manager.get_current_derivation_record_for_wallet(
106
+ record: DerivationRecord | None = await wallet_state_manager.get_current_derivation_record_for_wallet(
107
107
  wallet_state_manager.main_wallet.id()
108
108
  )
109
109
  if record is None:
@@ -114,12 +114,12 @@ class WalletActionScope(ActionScope[WalletSideEffects, WalletActionConfig]):
114
114
  return await self._get_new_puzzle(wallet_state_manager)
115
115
 
116
116
  async def get_puzzle_hash(
117
- self, wallet_state_manager: WalletStateManager, override_reuse_puzhash_with: Optional[bool] = None
117
+ self, wallet_state_manager: WalletStateManager, override_reuse_puzhash_with: bool | None = None
118
118
  ) -> bytes32:
119
119
  if (
120
120
  self.config.tx_config.reuse_puzhash or override_reuse_puzhash_with is True
121
121
  ) and override_reuse_puzhash_with is not False:
122
- record: Optional[DerivationRecord] = await wallet_state_manager.get_current_derivation_record_for_wallet(
122
+ record: DerivationRecord | None = await wallet_state_manager.get_current_derivation_record_for_wallet(
123
123
  wallet_state_manager.main_wallet.id()
124
124
  )
125
125
  if record is None:
@@ -135,10 +135,10 @@ async def new_wallet_action_scope(
135
135
  tx_config: TXConfig,
136
136
  push: bool = False,
137
137
  merge_spends: bool = True,
138
- sign: Optional[bool] = None,
138
+ sign: bool | None = None,
139
139
  additional_signing_responses: list[SigningResponse] = [],
140
140
  extra_spends: list[WalletSpendBundle] = [],
141
- puzzle_for_pk: Optional[Callable[[G1Element], Program]] = None,
141
+ puzzle_for_pk: Callable[[G1Element], Program] | None = None,
142
142
  ) -> AsyncIterator[WalletActionScope]:
143
143
  if puzzle_for_pk is None:
144
144
  puzzle_for_pk = wallet_state_manager.main_wallet.puzzle_for_pk
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING, ClassVar, Optional, cast
4
+ from typing import TYPE_CHECKING, ClassVar, cast
5
5
 
6
6
  from chia_rs import BlockRecord, ConsensusConstants, HeaderBlock
7
7
  from chia_rs.sized_bytes import bytes32
@@ -31,10 +31,10 @@ class WalletBlockchain:
31
31
  _basic_store: KeyValStore
32
32
  _weight_proof_handler: WalletWeightProofHandler
33
33
 
34
- synced_weight_proof: Optional[WeightProof]
34
+ synced_weight_proof: WeightProof | None
35
35
  _finished_sync_up_to: uint32
36
36
 
37
- _peak: Optional[HeaderBlock]
37
+ _peak: HeaderBlock | None
38
38
  _height_to_hash: dict[uint32, bytes32]
39
39
  _block_records: dict[bytes32, BlockRecord]
40
40
  _latest_timestamp: uint64
@@ -70,7 +70,7 @@ class WalletBlockchain:
70
70
  return self
71
71
 
72
72
  async def new_valid_weight_proof(self, weight_proof: WeightProof, records: list[BlockRecord]) -> None:
73
- peak: Optional[HeaderBlock] = await self.get_peak_block()
73
+ peak: HeaderBlock | None = await self.get_peak_block()
74
74
 
75
75
  if peak is not None and weight_proof.recent_chain_data[-1].weight <= peak.weight:
76
76
  # No update, don't change anything
@@ -93,7 +93,7 @@ class WalletBlockchain:
93
93
  await self.set_peak_block(weight_proof.recent_chain_data[-1], latest_timestamp)
94
94
  await self.clean_block_records()
95
95
 
96
- async def add_block(self, block: HeaderBlock) -> tuple[AddBlockResult, Optional[Err]]:
96
+ async def add_block(self, block: HeaderBlock) -> tuple[AddBlockResult, Err | None]:
97
97
  if self.contains_block(block.header_hash):
98
98
  return AddBlockResult.ALREADY_HAVE_BLOCK, None
99
99
  if not self.contains_block(block.prev_header_hash) and block.height > 0:
@@ -159,7 +159,7 @@ class WalletBlockchain:
159
159
 
160
160
  await self._basic_store.remove_object("PEAK_BLOCK")
161
161
 
162
- async def set_peak_block(self, block: HeaderBlock, timestamp: Optional[uint64] = None) -> None:
162
+ async def set_peak_block(self, block: HeaderBlock, timestamp: uint64 | None = None) -> None:
163
163
  await self._basic_store.set_object("PEAK_BLOCK", block)
164
164
  self._peak = block
165
165
  if timestamp is not None:
@@ -168,7 +168,7 @@ class WalletBlockchain:
168
168
  self._latest_timestamp = block.foliage_transaction_block.timestamp
169
169
  log.info(f"Peak set to: {self._peak.height} timestamp: {self._latest_timestamp}")
170
170
 
171
- async def get_peak_block(self) -> Optional[HeaderBlock]:
171
+ async def get_peak_block(self) -> HeaderBlock | None:
172
172
  if self._peak is not None:
173
173
  return self._peak
174
174
  header_block = await self._basic_store.get_object("PEAK_BLOCK", HeaderBlock)
@@ -183,7 +183,7 @@ class WalletBlockchain:
183
183
  await self.clean_block_records()
184
184
 
185
185
  async def get_finished_sync_up_to(self) -> uint32:
186
- h: Optional[uint32] = await self._basic_store.get_object("FINISHED_SYNC_UP_TO", uint32)
186
+ h: uint32 | None = await self._basic_store.get_object("FINISHED_SYNC_UP_TO", uint32)
187
187
  if h is None:
188
188
  return uint32(0)
189
189
  return h
@@ -191,7 +191,7 @@ class WalletBlockchain:
191
191
  def get_latest_timestamp(self) -> uint64:
192
192
  return self._latest_timestamp
193
193
 
194
- def contains_block(self, header_hash: bytes32, height: Optional[uint32] = None) -> bool:
194
+ def contains_block(self, header_hash: bytes32, height: uint32 | None = None) -> bool:
195
195
  """
196
196
  True if we have already added this block to the chain. This may return false for orphan blocks
197
197
  that we have added but no longer keep in memory.
@@ -204,18 +204,18 @@ class WalletBlockchain:
204
204
  def height_to_hash(self, height: uint32) -> bytes32:
205
205
  return self._height_to_hash[height]
206
206
 
207
- def try_block_record(self, header_hash: bytes32) -> Optional[BlockRecord]:
207
+ def try_block_record(self, header_hash: bytes32) -> BlockRecord | None:
208
208
  return self._block_records.get(header_hash)
209
209
 
210
210
  def height_to_block_record(self, height: uint32) -> BlockRecord:
211
- header_hash: Optional[bytes32] = self.height_to_hash(height)
211
+ header_hash: bytes32 | None = self.height_to_hash(height)
212
212
  assert header_hash is not None
213
213
  return self._block_records[header_hash]
214
214
 
215
215
  def block_record(self, header_hash: bytes32) -> BlockRecord:
216
216
  return self._block_records[header_hash]
217
217
 
218
- async def get_block_record_from_db(self, header_hash: bytes32) -> Optional[BlockRecord]:
218
+ async def get_block_record_from_db(self, header_hash: bytes32) -> BlockRecord | None:
219
219
  # the wallet doesn't have the blockchain DB, this implements the
220
220
  # blockchain_interface
221
221
  return self._block_records.get(header_hash)
@@ -1,19 +1,23 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import Any, Optional, Union
4
+ from typing import Any
5
5
 
6
+ from chia_rs import CoinRecord
6
7
  from chia_rs.sized_bytes import bytes32
7
8
  from chia_rs.sized_ints import uint8, uint32, uint64
8
9
 
9
10
  from chia.types.blockchain_format.coin import Coin
10
- from chia.types.coin_record import CoinRecord
11
11
  from chia.util.streamable import VersionedBlob
12
12
  from chia.wallet.puzzles.clawback.metadata import ClawbackMetadata, ClawbackVersion
13
13
  from chia.wallet.util.wallet_types import CoinType, StreamableWalletIdentifier, WalletType
14
14
  from chia.wallet.vc_wallet.cr_cat_drivers import CRCATMetadata, CRCATVersion
15
15
 
16
- MetadataTypes = Union[ClawbackMetadata, CRCATMetadata]
16
+ MetadataTypes = ClawbackMetadata | CRCATMetadata
17
+
18
+
19
+ class WalletCoinRecordMetadataParsingError(Exception):
20
+ pass
17
21
 
18
22
 
19
23
  @dataclass(frozen=True)
@@ -34,14 +38,14 @@ class WalletCoinRecord:
34
38
  # The launcher coin ID will change and will break all hardcode offer tests in CAT/NFT/DL, etc.
35
39
  # TODO Change hardcode offer in unit tests
36
40
  coin_type: CoinType = field(default=CoinType.NORMAL, hash=False)
37
- metadata: Optional[VersionedBlob] = field(default=None, hash=False)
41
+ metadata: VersionedBlob | None = field(default=None, hash=False)
38
42
 
39
43
  def wallet_identifier(self) -> StreamableWalletIdentifier:
40
44
  return StreamableWalletIdentifier(uint32(self.wallet_id), uint8(self.wallet_type))
41
45
 
42
46
  def parsed_metadata(self) -> MetadataTypes:
43
47
  if self.metadata is None:
44
- raise ValueError("Can't parse None metadata")
48
+ raise WalletCoinRecordMetadataParsingError("Can't parse None metadata")
45
49
  if self.coin_type == CoinType.CLAWBACK and self.metadata.version == ClawbackVersion.V1.value:
46
50
  return ClawbackMetadata.from_bytes(self.metadata.blob)
47
51
  if (
@@ -49,7 +53,9 @@ class WalletCoinRecord:
49
53
  and self.metadata.version == CRCATVersion.V1.value
50
54
  ):
51
55
  return CRCATMetadata.from_bytes(self.metadata.blob)
52
- raise ValueError(f"Unknown metadata {self.metadata} for coin_type {self.coin_type}")
56
+ raise WalletCoinRecordMetadataParsingError(
57
+ f"Unknown metadata {self.metadata} for coin_id {self.coin.name()} of type {self.coin_type}"
58
+ )
53
59
 
54
60
  def name(self) -> bytes32:
55
61
  return self.coin.name()
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  import sqlite3
4
4
  from dataclasses import dataclass
5
5
  from enum import IntEnum
6
- from typing import Optional
7
6
 
8
7
  from chia_rs.sized_bytes import bytes32
9
8
  from chia_rs.sized_ints import uint8, uint32, uint64
@@ -31,16 +30,16 @@ class CoinRecordOrder(IntEnum):
31
30
  class GetCoinRecords(Streamable):
32
31
  offset: uint32 = uint32(0)
33
32
  limit: uint32 = uint32.MAXIMUM
34
- wallet_id: Optional[uint32] = None
35
- wallet_type: Optional[uint8] = None # WalletType
36
- coin_type: Optional[uint8] = None # CoinType
37
- coin_id_filter: Optional[HashFilter] = None
38
- puzzle_hash_filter: Optional[HashFilter] = None
39
- parent_coin_id_filter: Optional[HashFilter] = None
40
- amount_filter: Optional[AmountFilter] = None
41
- amount_range: Optional[UInt64Range] = None
42
- confirmed_range: Optional[UInt32Range] = None
43
- spent_range: Optional[UInt32Range] = None
33
+ wallet_id: uint32 | None = None
34
+ wallet_type: uint8 | None = None # WalletType
35
+ coin_type: uint8 | None = None # CoinType
36
+ coin_id_filter: HashFilter | None = None
37
+ puzzle_hash_filter: HashFilter | None = None
38
+ parent_coin_id_filter: HashFilter | None = None
39
+ amount_filter: AmountFilter | None = None
40
+ amount_range: UInt64Range | None = None
41
+ confirmed_range: UInt32Range | None = None
42
+ spent_range: UInt32Range | None = None
44
43
  order: uint8 = uint8(CoinRecordOrder.confirmed_height)
45
44
  reverse: bool = False
46
45
  include_total_count: bool = False # Include the total number of entries for the query without applying offset/limit
@@ -50,7 +49,7 @@ class GetCoinRecords(Streamable):
50
49
  class GetCoinRecordsResult:
51
50
  records: list[WalletCoinRecord]
52
51
  coin_id_to_record: dict[bytes32, WalletCoinRecord]
53
- total_count: Optional[uint32]
52
+ total_count: uint32 | None
54
53
 
55
54
 
56
55
  class WalletCoinStore:
@@ -115,7 +114,7 @@ class WalletCoinStore:
115
114
  return int(0 if row is None else row[0])
116
115
 
117
116
  # Store CoinRecord in DB and ram cache
118
- async def add_coin_record(self, record: WalletCoinRecord, name: Optional[bytes32] = None) -> None:
117
+ async def add_coin_record(self, record: WalletCoinRecord, name: bytes32 | None = None) -> None:
119
118
  if name is None:
120
119
  name = record.name()
121
120
  assert record.spent == (record.spent_block_height != 0)
@@ -174,7 +173,7 @@ class WalletCoinStore:
174
173
  None if row[11] is None else VersionedBlob.from_bytes(row[11]),
175
174
  )
176
175
 
177
- async def get_coin_record(self, coin_name: bytes32) -> Optional[WalletCoinRecord]:
176
+ async def get_coin_record(self, coin_name: bytes32) -> WalletCoinRecord | None:
178
177
  """Returns CoinRecord with specified coin id."""
179
178
  async with self.db_wrapper.reader_no_transaction() as conn:
180
179
  rows = list(await conn.execute_fetchall("SELECT * from coin_record WHERE coin_name=?", (coin_name.hex(),)))
@@ -188,16 +187,16 @@ class WalletCoinStore:
188
187
  *,
189
188
  offset: uint32 = uint32(0),
190
189
  limit: uint32 = uint32.MAXIMUM,
191
- wallet_id: Optional[uint32] = None,
192
- wallet_type: Optional[WalletType] = None,
193
- coin_type: Optional[CoinType] = None,
194
- coin_id_filter: Optional[HashFilter] = None,
195
- puzzle_hash_filter: Optional[HashFilter] = None,
196
- parent_coin_id_filter: Optional[HashFilter] = None,
197
- amount_filter: Optional[AmountFilter] = None,
198
- amount_range: Optional[UInt64Range] = None,
199
- confirmed_range: Optional[UInt32Range] = None,
200
- spent_range: Optional[UInt32Range] = None,
190
+ wallet_id: uint32 | None = None,
191
+ wallet_type: WalletType | None = None,
192
+ coin_type: CoinType | None = None,
193
+ coin_id_filter: HashFilter | None = None,
194
+ puzzle_hash_filter: HashFilter | None = None,
195
+ parent_coin_id_filter: HashFilter | None = None,
196
+ amount_filter: AmountFilter | None = None,
197
+ amount_range: UInt64Range | None = None,
198
+ confirmed_range: UInt32Range | None = None,
199
+ spent_range: UInt32Range | None = None,
201
200
  order: CoinRecordOrder = CoinRecordOrder.confirmed_height,
202
201
  reverse: bool = False,
203
202
  include_total_count: bool = False,
@@ -282,7 +281,7 @@ class WalletCoinStore:
282
281
  )
283
282
  return [self.coin_record_from_row(row) for row in rows]
284
283
 
285
- async def get_first_coin_height(self) -> Optional[uint32]:
284
+ async def get_first_coin_height(self) -> uint32 | None:
286
285
  """Returns height of first confirmed coin"""
287
286
  async with self.db_wrapper.reader_no_transaction() as conn:
288
287
  rows = list(await conn.execute_fetchall("SELECT MIN(confirmed_height) FROM coin_record"))
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional
4
-
5
3
  from chia_rs import CoinState
6
4
  from chia_rs.sized_bytes import bytes32
7
5
  from chia_rs.sized_ints import uint32
@@ -61,7 +59,7 @@ class WalletInterestedStore:
61
59
  rows_hex = await cursor.fetchall()
62
60
  return [(bytes32(bytes.fromhex(row[0])), row[1]) for row in rows_hex]
63
61
 
64
- async def get_interested_puzzle_hash_wallet_id(self, puzzle_hash: bytes32) -> Optional[int]:
62
+ async def get_interested_puzzle_hash_wallet_id(self, puzzle_hash: bytes32) -> int | None:
65
63
  async with self.db_wrapper.reader_no_transaction() as conn:
66
64
  cursor = await conn.execute(
67
65
  "SELECT wallet_id FROM interested_puzzle_hashes WHERE puzzle_hash=?", (puzzle_hash.hex(),)
@@ -89,7 +87,7 @@ class WalletInterestedStore:
89
87
  self,
90
88
  asset_id: bytes32,
91
89
  name: str,
92
- first_seen_height: Optional[uint32],
90
+ first_seen_height: uint32 | None,
93
91
  sender_puzzle_hash: bytes32,
94
92
  ) -> None:
95
93
  """
@@ -131,7 +129,7 @@ class WalletInterestedStore:
131
129
  self,
132
130
  asset_id: bytes32,
133
131
  coin_state: CoinState,
134
- fork_height: Optional[uint32],
132
+ fork_height: uint32 | None,
135
133
  ) -> None:
136
134
  """
137
135
  Add an unacknowledged coin state of a CAT to the database. It will be inserted into the retry store when the