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
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Optional
5
4
 
6
5
  from chia_rs.sized_bytes import bytes32
7
6
  from chia_rs.sized_ints import uint64
@@ -16,7 +15,7 @@ from chia.wallet.vc_wallet.cr_cat_drivers import ProofsChecker
16
15
  @dataclass(frozen=True)
17
16
  class CATInfo(Streamable):
18
17
  limitations_program_hash: bytes32
19
- my_tail: Optional[Program] # this is the program
18
+ my_tail: Program | None # this is the program
20
19
 
21
20
 
22
21
  @streamable
@@ -41,8 +40,8 @@ class CATCoinData(Streamable):
41
40
  @dataclass(frozen=True)
42
41
  class LegacyCATInfo(Streamable):
43
42
  limitations_program_hash: bytes32
44
- my_tail: Optional[Program] # this is the program
45
- lineage_proofs: list[tuple[bytes32, Optional[LineageProof]]] # {coin.name(): lineage_proof}
43
+ my_tail: Program | None # this is the program
44
+ lineage_proofs: list[tuple[bytes32, LineageProof | None]] # {coin.name(): lineage_proof}
46
45
 
47
46
 
48
47
  @streamable
@@ -1,7 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections.abc import Callable
3
4
  from dataclasses import dataclass
4
- from typing import Any, Callable, Optional
5
+ from typing import Any
5
6
 
6
7
  from chia_rs import CoinSpend
7
8
  from chia_rs.sized_bytes import bytes32
@@ -23,13 +24,13 @@ from chia.wallet.uncurried_puzzle import UncurriedPuzzle, uncurry_puzzle
23
24
 
24
25
  @dataclass(frozen=True)
25
26
  class CATOuterPuzzle:
26
- _match: Callable[[UncurriedPuzzle], Optional[PuzzleInfo]]
27
+ _match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
27
28
  _construct: Callable[[PuzzleInfo, Program], Program]
28
29
  _solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
29
- _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Optional[Program]], Optional[Program]]
30
- _get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
30
+ _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
31
+ _get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
31
32
 
32
- def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
33
+ def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
33
34
  args = match_cat_puzzle(puzzle)
34
35
  if args is None:
35
36
  return None
@@ -44,31 +45,31 @@ class CATOuterPuzzle:
44
45
  return PuzzleInfo(constructor_dict)
45
46
 
46
47
  def get_inner_puzzle(
47
- self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
48
- ) -> Optional[Program]:
48
+ self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
49
+ ) -> Program | None:
49
50
  args = match_cat_puzzle(puzzle_reveal)
50
51
  if args is None:
51
52
  raise ValueError("This driver is not for the specified puzzle reveal")
52
53
  _, _, inner_puzzle = args
53
54
  also = constructor.also()
54
55
  if also is not None:
55
- deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(
56
+ deep_inner_puzzle: Program | None = self._get_inner_puzzle(
56
57
  also, uncurry_puzzle(inner_puzzle), solution.first() if solution is not None else None
57
58
  )
58
59
  return deep_inner_puzzle
59
60
  else:
60
61
  return inner_puzzle
61
62
 
62
- def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Optional[Program]:
63
+ def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
63
64
  my_inner_solution: Program = solution.first()
64
65
  also = constructor.also()
65
66
  if also:
66
- deep_inner_solution: Optional[Program] = self._get_inner_solution(also, my_inner_solution)
67
+ deep_inner_solution: Program | None = self._get_inner_solution(also, my_inner_solution)
67
68
  return deep_inner_solution
68
69
  else:
69
70
  return my_inner_solution
70
71
 
71
- def asset_id(self, constructor: PuzzleInfo) -> Optional[bytes32]:
72
+ def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
72
73
  return bytes32(constructor["tail"])
73
74
 
74
75
  def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  from collections.abc import Iterator
5
- from typing import Optional, Union
6
5
 
7
6
  from chia_puzzles_py.programs import CAT_PUZZLE, CAT_PUZZLE_HASH
8
7
  from chia_rs import G2Element
@@ -44,7 +43,7 @@ class SpendableCAT:
44
43
  limitations_program_reveal: Program = dataclasses.field(default_factory=empty_program)
45
44
 
46
45
 
47
- def match_cat_puzzle(puzzle: UncurriedPuzzle) -> Optional[Iterator[Program]]:
46
+ def match_cat_puzzle(puzzle: UncurriedPuzzle) -> Iterator[Program] | None:
48
47
  """
49
48
  Given the curried puzzle and args, test if it's a CAT and,
50
49
  if it is, return the curried arguments
@@ -67,8 +66,8 @@ def get_innerpuzzle_from_puzzle(puzzle: Program) -> Program:
67
66
  def construct_cat_puzzle(
68
67
  mod_code: Program,
69
68
  limitations_program_hash: bytes32,
70
- inner_puzzle_or_hash: Union[Program, bytes32],
71
- mod_code_hash: Optional[bytes32] = None,
69
+ inner_puzzle_or_hash: Program | bytes32,
70
+ mod_code_hash: bytes32 | None = None,
72
71
  ) -> Program:
73
72
  """
74
73
  Given an inner puzzle and a tail hash, calculate a puzzle program for a specific cc.
@@ -4,7 +4,7 @@ import dataclasses
4
4
  import logging
5
5
  import time
6
6
  import traceback
7
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
7
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
8
8
 
9
9
  from chia_rs import G1Element
10
10
  from chia_rs.sized_bytes import bytes32
@@ -39,7 +39,6 @@ from chia.wallet.conditions import (
39
39
  CreateCoin,
40
40
  CreateCoinAnnouncement,
41
41
  UnknownCondition,
42
- parse_timelock_info,
43
42
  )
44
43
  from chia.wallet.derivation_record import DerivationRecord
45
44
  from chia.wallet.lineage_proof import LineageProof
@@ -49,7 +48,6 @@ from chia.wallet.puzzles.tails import ALL_LIMITATIONS_PROGRAMS
49
48
  from chia.wallet.transaction_record import TransactionRecord
50
49
  from chia.wallet.uncurried_puzzle import uncurry_puzzle
51
50
  from chia.wallet.util.compute_additions import compute_additions_with_cost
52
- from chia.wallet.util.compute_memos import compute_memos
53
51
  from chia.wallet.util.curry_and_treehash import curry_and_treehash
54
52
  from chia.wallet.util.transaction_type import TransactionType
55
53
  from chia.wallet.util.wallet_sync_utils import fetch_coin_spend_for_coin_state
@@ -97,8 +95,8 @@ class CATWallet:
97
95
  wallet_info_type: ClassVar[type[CATInfo]] = CATInfo
98
96
 
99
97
  @staticmethod
100
- def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
101
- return f"CAT {limitations_program_hash_hex[:16]}..."
98
+ def default_wallet_name_for_unknown_cat(limitations_program_hash: bytes32) -> str:
99
+ return f"CAT {limitations_program_hash.hex()[:16]}..."
102
100
 
103
101
  @staticmethod
104
102
  async def create_new_cat_wallet(
@@ -108,7 +106,7 @@ class CATWallet:
108
106
  amount: uint64,
109
107
  action_scope: WalletActionScope,
110
108
  fee: uint64 = uint64(0),
111
- name: Optional[str] = None,
109
+ name: str | None = None,
112
110
  push: bool = True,
113
111
  ) -> CATWallet:
114
112
  self = CATWallet()
@@ -154,7 +152,7 @@ class CATWallet:
154
152
  # since we didn't yet know the TAIL. Now we know the TAIL, we can update the name
155
153
  # according to the template name for unknown/new CATs.
156
154
  if original_name is None:
157
- name = self.default_wallet_name_for_unknown_cat(self.cat_info.limitations_program_hash.hex())
155
+ name = self.default_wallet_name_for_unknown_cat(self.cat_info.limitations_program_hash)
158
156
  await self.set_name(name)
159
157
 
160
158
  # Change and actual CAT coin
@@ -202,30 +200,27 @@ class CATWallet:
202
200
  cls,
203
201
  wallet_state_manager: WalletStateManager,
204
202
  wallet: Wallet,
205
- limitations_program_hash_hex: str,
206
- name: Optional[str] = None,
203
+ limitations_program_hash: bytes32,
204
+ name: str | None = None,
207
205
  ) -> Self:
208
206
  self = cls()
209
207
  self.standard_wallet = wallet
210
208
  self.log = logging.getLogger(__name__)
211
209
 
212
- limitations_program_hash_hex = bytes32.from_hexstr(limitations_program_hash_hex).hex() # Normalize the format
213
-
214
210
  for id, w in wallet_state_manager.wallets.items():
215
211
  if w.type() == cls.type():
216
212
  assert isinstance(w, cls)
217
- if w.get_asset_id() == limitations_program_hash_hex:
213
+ if w.get_asset_id() == limitations_program_hash:
218
214
  self.log.warning("Not creating wallet for already existing CAT wallet")
219
215
  return w
220
216
 
221
217
  self.wallet_state_manager = wallet_state_manager
222
- if limitations_program_hash_hex in DEFAULT_CATS:
223
- cat_info = DEFAULT_CATS[limitations_program_hash_hex]
218
+ if limitations_program_hash.hex() in DEFAULT_CATS:
219
+ cat_info = DEFAULT_CATS[limitations_program_hash.hex()]
224
220
  name = cat_info["name"]
225
221
  elif name is None:
226
- name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
222
+ name = self.default_wallet_name_for_unknown_cat(limitations_program_hash)
227
223
 
228
- limitations_program_hash = bytes32.from_hexstr(limitations_program_hash_hex)
229
224
  self.cat_info = cls.wallet_info_type(limitations_program_hash, None)
230
225
  info_as_string = bytes(self.cat_info).hex()
231
226
  self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, self.wallet_type, info_as_string)
@@ -256,14 +251,14 @@ class CATWallet:
256
251
  wallet_state_manager: WalletStateManager,
257
252
  wallet: Wallet,
258
253
  puzzle_driver: PuzzleInfo,
259
- name: Optional[str] = None,
254
+ name: str | None = None,
260
255
  # We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
261
- potential_subclasses: Optional[dict[AssetType, Any]] = None,
256
+ potential_subclasses: dict[AssetType, Any] | None = None,
262
257
  ) -> Any:
263
258
  if potential_subclasses is None:
264
259
  potential_subclasses = {}
265
260
 
266
- next_layer: Optional[PuzzleInfo] = puzzle_driver.also()
261
+ next_layer: PuzzleInfo | None = puzzle_driver.also()
267
262
  if next_layer is not None:
268
263
  if AssetType(next_layer.type()) in potential_subclasses:
269
264
  return await potential_subclasses[AssetType(next_layer.type())].create_from_puzzle_info(
@@ -276,7 +271,7 @@ class CATWallet:
276
271
  return await cls.get_or_create_wallet_for_cat(
277
272
  wallet_state_manager,
278
273
  wallet,
279
- puzzle_driver["tail"].hex(),
274
+ puzzle_driver["tail"],
280
275
  name,
281
276
  )
282
277
 
@@ -315,7 +310,7 @@ class CATWallet:
315
310
  def id(self) -> uint32:
316
311
  return self.wallet_info.id
317
312
 
318
- async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
313
+ async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
319
314
  if record_list is None:
320
315
  record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.id())
321
316
 
@@ -328,7 +323,7 @@ class CATWallet:
328
323
  self.log.info(f"Confirmed balance for cat wallet {self.id()} is {amount}")
329
324
  return uint128(amount)
330
325
 
331
- async def get_unconfirmed_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
326
+ async def get_unconfirmed_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
332
327
  return await self.wallet_state_manager.get_unconfirmed_balance(self.id(), unspent_records)
333
328
 
334
329
  @property
@@ -340,15 +335,15 @@ class CATWallet:
340
335
  # avoid full block TXs
341
336
  return int(self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM / 2 / self.cost_of_single_tx)
342
337
 
343
- async def get_max_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> set[WalletCoinRecord]:
344
- spendable: list[WalletCoinRecord] = list(
345
- await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), records)
338
+ async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
339
+ return uint128(
340
+ sum(
341
+ cr.coin.amount
342
+ for cr in await self.wallet_state_manager.get_spendable_coins_for_wallet(
343
+ self.id(), records, in_one_block=True
344
+ )
345
+ )
346
346
  )
347
- spendable.sort(reverse=True, key=lambda record: record.coin.amount)
348
- return set(spendable[0 : min(len(spendable), self.max_send_quantity)])
349
-
350
- async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
351
- return uint128(sum(cr.coin.amount for cr in await self.get_max_spendable_coins()))
352
347
 
353
348
  def get_name(self) -> str:
354
349
  return self.wallet_info.name
@@ -358,11 +353,11 @@ class CATWallet:
358
353
  self.wallet_info = new_info
359
354
  await self.wallet_state_manager.user_store.update_wallet(self.wallet_info)
360
355
 
361
- def get_asset_id(self) -> str:
362
- return bytes(self.cat_info.limitations_program_hash).hex()
356
+ def get_asset_id(self) -> bytes32:
357
+ return self.cat_info.limitations_program_hash
363
358
 
364
359
  async def coin_added(
365
- self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data: Optional[CATCoinData]
360
+ self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data: CATCoinData | None
366
361
  ) -> None:
367
362
  """Notification from wallet state manager that wallet has been received."""
368
363
  self.log.info(f"CAT wallet has been notified that {coin.name().hex()} was added")
@@ -396,7 +391,7 @@ class CATWallet:
396
391
  except Exception as e:
397
392
  self.log.debug(f"Exception: {e}, traceback: {traceback.format_exc()}")
398
393
 
399
- async def puzzle_solution_received(self, coin: Coin, parent_coin_data: Optional[CATCoinData]) -> None:
394
+ async def puzzle_solution_received(self, coin: Coin, parent_coin_data: CATCoinData | None) -> None:
400
395
  coin_name = coin.parent_coin_info
401
396
  if parent_coin_data is not None:
402
397
  assert isinstance(parent_coin_data, CATCoinData)
@@ -443,8 +438,8 @@ class CATWallet:
443
438
 
444
439
  return derivation_record.puzzle_hash
445
440
 
446
- async def get_spendable_balance(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
447
- coins = await self.get_cat_spendable_coins(records)
441
+ async def get_spendable_balance(self, records: set[WalletCoinRecord] | None = None) -> uint128:
442
+ coins = await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), records)
448
443
  amount = 0
449
444
  for record in coins:
450
445
  amount += record.coin.amount
@@ -477,19 +472,9 @@ class CATWallet:
477
472
 
478
473
  return uint64(addition_amount)
479
474
 
480
- async def get_cat_spendable_coins(self, records: Optional[set[WalletCoinRecord]] = None) -> list[WalletCoinRecord]:
481
- result: list[WalletCoinRecord] = []
482
-
483
- record_list: set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
484
- self.id(), records
485
- )
486
-
487
- for record in record_list:
488
- lineage = await self.get_lineage_proof_for_coin(record.coin)
489
- if lineage is not None and not lineage.is_none():
490
- result.append(record)
491
-
492
- return list(await self.get_max_spendable_coins(set(result)))
475
+ async def is_coin_spendable(self, record: WalletCoinRecord) -> bool:
476
+ lineage = await self.get_lineage_proof_for_coin(record.coin)
477
+ return lineage is not None and not lineage.is_none()
493
478
 
494
479
  async def select_coins(
495
480
  self,
@@ -501,7 +486,9 @@ class CATWallet:
501
486
  Note: Must be called under wallet state manager lock
502
487
  """
503
488
  spendable_amount: uint128 = await self.get_spendable_balance()
504
- spendable_coins: list[WalletCoinRecord] = await self.get_cat_spendable_coins()
489
+ spendable_coins: list[WalletCoinRecord] = list(
490
+ await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), in_one_block=True)
491
+ )
505
492
 
506
493
  # Try to use coins from the store, if there isn't enough of "unused"
507
494
  # coins use change coins that are not confirmed yet
@@ -522,24 +509,24 @@ class CATWallet:
522
509
  return coins
523
510
 
524
511
  async def inner_puzzle_for_cat_puzhash(self, cat_hash: bytes32) -> Program:
525
- record: Optional[
526
- DerivationRecord
527
- ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(cat_hash)
512
+ record: (
513
+ DerivationRecord | None
514
+ ) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(cat_hash)
528
515
  if record is None:
529
516
  raise RuntimeError(f"Missing Derivation Record for CAT puzzle_hash {cat_hash}")
530
517
  inner_puzzle: Program = self.standard_wallet.puzzle_for_pk(record.pubkey)
531
518
  return inner_puzzle
532
519
 
533
520
  async def convert_puzzle_hash(self, puzzle_hash: bytes32) -> bytes32:
534
- record: Optional[
535
- DerivationRecord
536
- ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(puzzle_hash)
521
+ record: (
522
+ DerivationRecord | None
523
+ ) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(puzzle_hash)
537
524
  if record is None:
538
525
  return puzzle_hash # TODO: check if we have a test for this case!
539
526
  else:
540
527
  return (await self.inner_puzzle_for_cat_puzhash(puzzle_hash)).get_tree_hash()
541
528
 
542
- async def get_lineage_proof_for_coin(self, coin: Coin) -> Optional[LineageProof]:
529
+ async def get_lineage_proof_for_coin(self, coin: Coin) -> LineageProof | None:
543
530
  return await self.lineage_store.get_lineage_proof(coin.parent_coin_info)
544
531
 
545
532
  async def create_tandem_xch_tx(
@@ -548,13 +535,13 @@ class CATWallet:
548
535
  amount_to_claim: uint64,
549
536
  action_scope: WalletActionScope,
550
537
  extra_conditions: tuple[Condition, ...] = tuple(),
551
- ) -> Optional[AssertCoinAnnouncement]:
538
+ ) -> AssertCoinAnnouncement | None:
552
539
  """
553
540
  This function creates a non-CAT transaction to pay fees, contribute funds for issuance, and absorb melt value.
554
541
  It is meant to be called in `generate_unsigned_spendbundle` and as such should be called under the
555
542
  wallet_state_manager lock
556
543
  """
557
- announcement: Optional[AssertCoinAnnouncement] = None
544
+ announcement: AssertCoinAnnouncement | None = None
558
545
  async with self.wallet_state_manager.new_action_scope(
559
546
  action_scope.config.tx_config, push=False
560
547
  ) as inner_action_scope:
@@ -622,8 +609,8 @@ class CATWallet:
622
609
  payments: list[CreateCoin],
623
610
  action_scope: WalletActionScope,
624
611
  fee: uint64 = uint64(0),
625
- cat_discrepancy: Optional[tuple[int, Program, Program]] = None, # (extra_delta, tail_reveal, tail_solution)
626
- coins: Optional[set[Coin]] = None,
612
+ cat_discrepancy: tuple[int, Program, Program] | None = None, # (extra_delta, tail_reveal, tail_solution)
613
+ coins: set[Coin] | None = None,
627
614
  extra_conditions: tuple[Condition, ...] = tuple(),
628
615
  ) -> WalletSpendBundle:
629
616
  if cat_discrepancy is not None:
@@ -683,7 +670,7 @@ class CATWallet:
683
670
  cat_condition = UnknownCondition(
684
671
  opcode=Program.to(51),
685
672
  args=[
686
- Program.to(None),
673
+ Program.NIL,
687
674
  Program.to(-113),
688
675
  tail_reveal,
689
676
  tail_solution,
@@ -757,13 +744,13 @@ class CATWallet:
757
744
  puzzle_hashes: list[bytes32],
758
745
  action_scope: WalletActionScope,
759
746
  fee: uint64 = uint64(0),
760
- coins: Optional[set[Coin]] = None,
761
- memos: Optional[list[list[bytes]]] = None,
747
+ coins: set[Coin] | None = None,
748
+ memos: list[list[bytes]] | None = None,
762
749
  extra_conditions: tuple[Condition, ...] = tuple(),
763
750
  **kwargs: Unpack[GSTOptionalArgs],
764
751
  ) -> None:
765
752
  # (extra_delta, tail_reveal, tail_solution)
766
- cat_discrepancy: Optional[tuple[int, Program, Program]] = kwargs.get("cat_discrepancy", None)
753
+ cat_discrepancy: tuple[int, Program, Program] | None = kwargs.get("cat_discrepancy", None)
767
754
  if memos is None:
768
755
  memos = [[] for _ in range(len(puzzle_hashes))]
769
756
 
@@ -794,29 +781,20 @@ class CATWallet:
794
781
  removal for tx in interface.side_effects.transactions for removal in tx.additions
795
782
  }
796
783
  interface.side_effects.transactions.append(
797
- TransactionRecord(
798
- confirmed_at_height=uint32(0),
799
- created_at_time=uint64(time.time()),
800
- to_puzzle_hash=puzzle_hashes[0],
801
- to_address=self.wallet_state_manager.encode_puzzle_hash(puzzle_hashes[0]),
784
+ self.wallet_state_manager.new_outgoing_transaction(
785
+ wallet_id=self.id(),
786
+ puzzle_hash=puzzle_hashes[0],
802
787
  amount=uint64(payment_sum),
803
- fee_amount=fee,
804
- confirmed=False,
805
- sent=uint32(0),
788
+ fee=fee,
806
789
  spend_bundle=spend_bundle,
807
790
  additions=list(set(spend_bundle.additions()) - other_tx_additions),
808
791
  removals=list(set(spend_bundle.removals()) - other_tx_removals),
809
- wallet_id=self.id(),
810
- sent_to=[],
811
- trade_id=None,
812
- type=uint32(TransactionType.OUTGOING_TX.value),
813
792
  name=spend_bundle.name(),
814
- memos=compute_memos(spend_bundle),
815
- valid_times=parse_timelock_info(extra_conditions),
793
+ extra_conditions=extra_conditions,
816
794
  )
817
795
  )
818
796
 
819
- async def add_lineage(self, name: bytes32, lineage: Optional[LineageProof]) -> None:
797
+ async def add_lineage(self, name: bytes32, lineage: LineageProof | None) -> None:
820
798
  """
821
799
  Lineage proofs are stored as a list of parent coins and the lineage proof you will need if they are the
822
800
  parent of the coin you are trying to spend. 'If I'm your parent, here's the info you need to spend yourself'
@@ -840,16 +818,16 @@ class CATWallet:
840
818
  async def match_puzzle_info(self, puzzle_driver: PuzzleInfo) -> bool:
841
819
  return (
842
820
  AssetType(puzzle_driver.type()) == AssetType.CAT
843
- and puzzle_driver["tail"] == bytes.fromhex(self.get_asset_id())
821
+ and puzzle_driver["tail"] == self.get_asset_id()
844
822
  and puzzle_driver.also() is None
845
823
  )
846
824
 
847
825
  async def get_puzzle_info(self, asset_id: bytes32) -> PuzzleInfo:
848
- return PuzzleInfo({"type": AssetType.CAT.value, "tail": "0x" + self.get_asset_id()})
826
+ return PuzzleInfo({"type": AssetType.CAT.value, "tail": "0x" + self.get_asset_id().hex()})
849
827
 
850
828
  async def get_coins_to_offer(
851
829
  self,
852
- asset_id: Optional[bytes32],
830
+ asset_id: bytes32 | None,
853
831
  amount: uint64,
854
832
  action_scope: WalletActionScope,
855
833
  ) -> set[Coin]:
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Optional
5
4
 
6
5
  from chia_rs.sized_bytes import bytes32
7
6
 
@@ -22,9 +21,9 @@ class CATLineageStore:
22
21
  table_name: str
23
22
 
24
23
  @classmethod
25
- async def create(cls, db_wrapper: DBWrapper2, asset_id: str) -> CATLineageStore:
24
+ async def create(cls, db_wrapper: DBWrapper2, asset_id: bytes32) -> CATLineageStore:
26
25
  self = cls()
27
- self.table_name = f"lineage_proofs_{asset_id}"
26
+ self.table_name = f"lineage_proofs_{asset_id.hex()}"
28
27
  self.db_wrapper = db_wrapper
29
28
  async with self.db_wrapper.writer_maybe_transaction() as conn:
30
29
  await conn.execute(f"CREATE TABLE IF NOT EXISTS {self.table_name}(coin_id text PRIMARY KEY, lineage blob)")
@@ -46,7 +45,7 @@ class CATLineageStore:
46
45
  )
47
46
  await cursor.close()
48
47
 
49
- async def get_lineage_proof(self, coin_id: bytes32) -> Optional[LineageProof]:
48
+ async def get_lineage_proof(self, coin_id: bytes32) -> LineageProof | None:
50
49
  async with self.db_wrapper.reader_no_transaction() as conn:
51
50
  cursor = await conn.execute(
52
51
  f"SELECT * FROM {self.table_name} WHERE coin_id=?;",
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import logging
4
4
  from dataclasses import dataclass
5
5
  from enum import IntEnum
6
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
6
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
7
7
 
8
8
  from chia_rs import G1Element
9
9
  from chia_rs.sized_bytes import bytes32
@@ -71,8 +71,8 @@ class RCATWallet(CATWallet):
71
71
  create_new_cat_wallet = None # type: ignore[assignment]
72
72
 
73
73
  @staticmethod
74
- def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
75
- return f"Revocable-CAT {limitations_program_hash_hex[:16]}..."
74
+ def default_wallet_name_for_unknown_cat(limitations_program_hash: bytes32) -> str:
75
+ return f"Revocable-CAT {limitations_program_hash.hex()[:16]}..."
76
76
 
77
77
  # We need to override this with a different signature.
78
78
  # It's not immediately clear what is proper here, likely needs a bit of a refactor.
@@ -81,31 +81,28 @@ class RCATWallet(CATWallet):
81
81
  cls,
82
82
  wallet_state_manager: WalletStateManager,
83
83
  wallet: Wallet,
84
- limitations_program_hash_hex: str,
84
+ limitations_program_hash: bytes32,
85
85
  hidden_puzzle_hash: bytes32,
86
- name: Optional[str] = None,
86
+ name: str | None = None,
87
87
  ) -> Self:
88
88
  self = cls()
89
89
  self.standard_wallet = wallet
90
90
  self.log = logging.getLogger(__name__)
91
91
 
92
- limitations_program_hash_hex = bytes32.from_hexstr(limitations_program_hash_hex).hex() # Normalize the format
93
-
94
92
  for id, w in wallet_state_manager.wallets.items():
95
93
  if w.type() == cls.type():
96
94
  assert isinstance(w, cls)
97
- if w.get_asset_id() == limitations_program_hash_hex:
95
+ if w.get_asset_id() == limitations_program_hash:
98
96
  self.log.warning("Not creating wallet for already existing CAT wallet")
99
97
  return w
100
98
 
101
99
  self.wallet_state_manager = wallet_state_manager
102
- if limitations_program_hash_hex in DEFAULT_CATS:
103
- cat_info = DEFAULT_CATS[limitations_program_hash_hex]
100
+ if limitations_program_hash.hex() in DEFAULT_CATS:
101
+ cat_info = DEFAULT_CATS[limitations_program_hash.hex()]
104
102
  name = cat_info["name"]
105
103
  elif name is None:
106
- name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
104
+ name = self.default_wallet_name_for_unknown_cat(limitations_program_hash)
107
105
 
108
- limitations_program_hash = bytes32.from_hexstr(limitations_program_hash_hex)
109
106
  self.cat_info = cls.wallet_info_type(limitations_program_hash, None, hidden_puzzle_hash)
110
107
  info_as_string = bytes(self.cat_info).hex()
111
108
  self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, cls.wallet_type, info_as_string)
@@ -137,20 +134,20 @@ class RCATWallet(CATWallet):
137
134
  wallet_state_manager: WalletStateManager,
138
135
  wallet: Wallet,
139
136
  puzzle_driver: PuzzleInfo,
140
- name: Optional[str] = None,
137
+ name: str | None = None,
141
138
  # We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
142
- potential_subclasses: Optional[dict[AssetType, Any]] = None,
139
+ potential_subclasses: dict[AssetType, Any] | None = None,
143
140
  ) -> Any:
144
141
  if potential_subclasses is None:
145
142
  potential_subclasses = {}
146
143
 
147
- rev_layer: Optional[PuzzleInfo] = puzzle_driver.also()
144
+ rev_layer: PuzzleInfo | None = puzzle_driver.also()
148
145
  if rev_layer is None:
149
146
  raise ValueError("create_from_puzzle_info called on RCATWallet with a non R-CAT puzzle driver")
150
147
  return await cls.get_or_create_wallet_for_cat(
151
148
  wallet_state_manager,
152
149
  wallet,
153
- puzzle_driver["tail"].hex(),
150
+ puzzle_driver["tail"],
154
151
  bytes32(rev_layer["hidden_puzzle_hash"]),
155
152
  name,
156
153
  )
@@ -165,7 +162,7 @@ class RCATWallet(CATWallet):
165
162
  cat_wallet: CATWallet,
166
163
  hidden_puzzle_hash: bytes32,
167
164
  ) -> bool:
168
- if not cat_wallet.lineage_store.is_empty():
165
+ if not await cat_wallet.lineage_store.is_empty():
169
166
  cat_wallet.log.error("Received a revocable CAT to a CAT wallet that already has CATs")
170
167
  return False
171
168
  replace_self = cls()
@@ -219,9 +216,9 @@ class RCATWallet(CATWallet):
219
216
  primaries: list[CreateCoin],
220
217
  conditions: tuple[Condition, ...] = tuple(),
221
218
  ) -> Program:
222
- record: Optional[
223
- DerivationRecord
224
- ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(coin.puzzle_hash)
219
+ record: (
220
+ DerivationRecord | None
221
+ ) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(coin.puzzle_hash)
225
222
  if record is None:
226
223
  raise RuntimeError(f"Missing Derivation Record for CAT puzzle_hash {coin.puzzle_hash}")
227
224
  return solve_revocation_layer(
@@ -234,7 +231,7 @@ class RCATWallet(CATWallet):
234
231
  AssetType(puzzle_driver.type()) == AssetType.CAT
235
232
  and puzzle_driver["tail"] == self.cat_info.limitations_program_hash
236
233
  ):
237
- inner_puzzle_driver: Optional[PuzzleInfo] = puzzle_driver.also()
234
+ inner_puzzle_driver: PuzzleInfo | None = puzzle_driver.also()
238
235
  if inner_puzzle_driver is None:
239
236
  raise ValueError("Malformed puzzle driver passed to RCATWallet.match_puzzle_info")
240
237
  return (
@@ -247,7 +244,7 @@ class RCATWallet(CATWallet):
247
244
  return PuzzleInfo(
248
245
  {
249
246
  "type": AssetType.CAT.value,
250
- "tail": "0x" + self.get_asset_id(),
247
+ "tail": "0x" + self.get_asset_id().hex(),
251
248
  "also": {
252
249
  "type": AssetType.REVOCATION_LAYER.value,
253
250
  "hidden_puzzle_hash": "0x" + self.cat_info.hidden_puzzle_hash.hex(),