chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc1__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 (453) hide show
  1. chia/_tests/blockchain/blockchain_test_utils.py +2 -3
  2. chia/_tests/blockchain/test_augmented_chain.py +2 -3
  3. chia/_tests/blockchain/test_blockchain.py +261 -44
  4. chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
  5. chia/_tests/blockchain/test_build_chains.py +197 -1
  6. chia/_tests/blockchain/test_get_block_generator.py +1 -1
  7. chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
  8. chia/_tests/clvm/benchmark_costs.py +1 -1
  9. chia/_tests/clvm/coin_store.py +3 -4
  10. chia/_tests/clvm/test_message_conditions.py +2 -2
  11. chia/_tests/clvm/test_puzzle_compression.py +2 -3
  12. chia/_tests/clvm/test_puzzles.py +1 -2
  13. chia/_tests/clvm/test_singletons.py +2 -3
  14. chia/_tests/clvm/test_spend_sim.py +7 -7
  15. chia/_tests/cmds/cmd_test_utils.py +30 -25
  16. chia/_tests/cmds/test_dev_gh.py +1 -1
  17. chia/_tests/cmds/test_farm_cmd.py +1 -1
  18. chia/_tests/cmds/test_show.py +1 -2
  19. chia/_tests/cmds/wallet/test_did.py +101 -56
  20. chia/_tests/cmds/wallet/test_nft.py +109 -84
  21. chia/_tests/cmds/wallet/test_notifications.py +1 -1
  22. chia/_tests/cmds/wallet/test_offer.toffer +1 -1
  23. chia/_tests/cmds/wallet/test_vcs.py +8 -8
  24. chia/_tests/cmds/wallet/test_wallet.py +100 -46
  25. chia/_tests/conftest.py +31 -20
  26. chia/_tests/connection_utils.py +1 -1
  27. chia/_tests/core/consensus/stores/__init__.py +0 -0
  28. chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
  29. chia/_tests/core/consensus/test_block_creation.py +2 -31
  30. chia/_tests/core/consensus/test_pot_iterations.py +38 -3
  31. chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
  32. chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
  33. chia/_tests/core/daemon/test_daemon.py +80 -0
  34. chia/_tests/core/data_layer/test_data_layer.py +1 -1
  35. chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
  36. chia/_tests/core/data_layer/test_data_rpc.py +14 -10
  37. chia/_tests/core/data_layer/test_data_store.py +5 -5
  38. chia/_tests/core/farmer/test_farmer_api.py +2 -2
  39. chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
  40. chia/_tests/core/full_node/ram_db.py +3 -1
  41. chia/_tests/core/full_node/stores/test_block_store.py +28 -16
  42. chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
  43. chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
  44. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  45. chia/_tests/core/full_node/test_address_manager.py +200 -27
  46. chia/_tests/core/full_node/test_block_height_map.py +2 -2
  47. chia/_tests/core/full_node/test_conditions.py +7 -6
  48. chia/_tests/core/full_node/test_full_node.py +456 -40
  49. chia/_tests/core/full_node/test_generator_tools.py +32 -2
  50. chia/_tests/core/full_node/test_hint_management.py +1 -1
  51. chia/_tests/core/full_node/test_node_load.py +20 -21
  52. chia/_tests/core/full_node/test_performance.py +3 -4
  53. chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
  54. chia/_tests/core/full_node/test_subscriptions.py +1 -2
  55. chia/_tests/core/full_node/test_transactions.py +9 -5
  56. chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
  57. chia/_tests/core/large_block.py +1 -2
  58. chia/_tests/core/make_block_generator.py +3 -4
  59. chia/_tests/core/mempool/test_mempool.py +36 -86
  60. chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
  61. chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
  62. chia/_tests/core/mempool/test_mempool_manager.py +421 -69
  63. chia/_tests/core/mempool/test_mempool_performance.py +3 -2
  64. chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
  65. chia/_tests/core/server/flood.py +1 -1
  66. chia/_tests/core/server/test_dos.py +1 -1
  67. chia/_tests/core/server/test_node_discovery.py +41 -27
  68. chia/_tests/core/server/test_rate_limits.py +1 -1
  69. chia/_tests/core/server/test_server.py +1 -1
  70. chia/_tests/core/services/test_services.py +5 -5
  71. chia/_tests/core/ssl/test_ssl.py +1 -1
  72. chia/_tests/core/test_cost_calculation.py +6 -6
  73. chia/_tests/core/test_crawler.py +2 -2
  74. chia/_tests/core/test_crawler_rpc.py +1 -1
  75. chia/_tests/core/test_db_conversion.py +3 -1
  76. chia/_tests/core/test_db_validation.py +5 -3
  77. chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
  78. chia/_tests/core/test_filter.py +4 -1
  79. chia/_tests/core/test_full_node_rpc.py +99 -82
  80. chia/_tests/core/test_program.py +2 -2
  81. chia/_tests/core/util/test_block_cache.py +1 -1
  82. chia/_tests/core/util/test_keychain.py +2 -2
  83. chia/_tests/core/util/test_lockfile.py +1 -1
  84. chia/_tests/core/util/test_log_exceptions.py +5 -5
  85. chia/_tests/core/util/test_streamable.py +81 -22
  86. chia/_tests/db/test_db_wrapper.py +1 -3
  87. chia/_tests/environments/wallet.py +5 -5
  88. chia/_tests/farmer_harvester/test_farmer.py +9 -7
  89. chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
  90. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  91. chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
  92. chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
  93. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
  94. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
  95. chia/_tests/generator/test_compression.py +1 -2
  96. chia/_tests/generator/test_rom.py +8 -4
  97. chia/_tests/plot_sync/test_plot_sync.py +3 -3
  98. chia/_tests/plot_sync/test_receiver.py +3 -3
  99. chia/_tests/plot_sync/test_sender.py +1 -1
  100. chia/_tests/plot_sync/test_sync_simulated.py +3 -3
  101. chia/_tests/plot_sync/util.py +2 -2
  102. chia/_tests/pools/test_pool_cmdline.py +48 -21
  103. chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
  104. chia/_tests/pools/test_pool_rpc.py +237 -105
  105. chia/_tests/pools/test_pool_wallet.py +11 -2
  106. chia/_tests/pools/test_wallet_pool_store.py +5 -4
  107. chia/_tests/rpc/test_rpc_client.py +1 -1
  108. chia/_tests/simulation/test_simulation.py +13 -8
  109. chia/_tests/simulation/test_simulator.py +2 -2
  110. chia/_tests/timelord/test_new_peak.py +191 -47
  111. chia/_tests/timelord/test_timelord.py +1 -1
  112. chia/_tests/tools/test_full_sync.py +0 -2
  113. chia/_tests/tools/test_run_block.py +3 -1
  114. chia/_tests/util/benchmark_cost.py +3 -3
  115. chia/_tests/util/benchmarks.py +2 -2
  116. chia/_tests/util/blockchain.py +11 -5
  117. chia/_tests/util/blockchain_mock.py +1 -4
  118. chia/_tests/util/coin_store.py +29 -0
  119. chia/_tests/util/constants.py +2 -18
  120. chia/_tests/util/full_sync.py +3 -3
  121. chia/_tests/util/generator_tools_testing.py +2 -3
  122. chia/_tests/util/key_tool.py +2 -3
  123. chia/_tests/util/misc.py +33 -31
  124. chia/_tests/util/network_protocol_data.py +19 -17
  125. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  126. chia/_tests/util/protocol_messages_json.py +3 -1
  127. chia/_tests/util/run_block.py +2 -2
  128. chia/_tests/util/setup_nodes.py +7 -7
  129. chia/_tests/util/spend_sim.py +47 -55
  130. chia/_tests/util/test_condition_tools.py +5 -4
  131. chia/_tests/util/test_config.py +2 -2
  132. chia/_tests/util/test_dump_keyring.py +1 -1
  133. chia/_tests/util/test_full_block_utils.py +12 -14
  134. chia/_tests/util/test_misc.py +2 -2
  135. chia/_tests/util/test_paginator.py +4 -4
  136. chia/_tests/util/test_priority_mutex.py +2 -2
  137. chia/_tests/util/test_replace_str_to_bytes.py +15 -5
  138. chia/_tests/util/test_ssl_check.py +1 -1
  139. chia/_tests/util/test_testnet_overrides.py +13 -3
  140. chia/_tests/util/time_out_assert.py +4 -2
  141. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
  142. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
  143. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
  144. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
  145. chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
  146. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
  147. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
  148. chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
  149. chia/_tests/wallet/conftest.py +11 -12
  150. chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
  151. chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
  152. chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
  153. chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
  154. chia/_tests/wallet/nft_wallet/config.py +1 -1
  155. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
  156. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
  157. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
  158. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
  159. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
  160. chia/_tests/wallet/rpc/test_wallet_rpc.py +305 -184
  161. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
  162. chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
  163. chia/_tests/wallet/test_clvm_casts.py +88 -0
  164. chia/_tests/wallet/test_coin_management.py +1 -1
  165. chia/_tests/wallet/test_coin_selection.py +1 -1
  166. chia/_tests/wallet/test_conditions.py +1 -1
  167. chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
  168. chia/_tests/wallet/test_notifications.py +5 -3
  169. chia/_tests/wallet/test_sign_coin_spends.py +6 -6
  170. chia/_tests/wallet/test_signer_protocol.py +13 -12
  171. chia/_tests/wallet/test_singleton.py +1 -1
  172. chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
  173. chia/_tests/wallet/test_util.py +2 -2
  174. chia/_tests/wallet/test_wallet.py +108 -29
  175. chia/_tests/wallet/test_wallet_action_scope.py +9 -2
  176. chia/_tests/wallet/test_wallet_blockchain.py +2 -3
  177. chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
  178. chia/_tests/wallet/test_wallet_node.py +2 -4
  179. chia/_tests/wallet/test_wallet_retry.py +4 -2
  180. chia/_tests/wallet/test_wallet_state_manager.py +191 -5
  181. chia/_tests/wallet/test_wallet_test_framework.py +1 -1
  182. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
  183. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
  184. chia/_tests/wallet/wallet_block_tools.py +6 -6
  185. chia/_tests/weight_proof/test_weight_proof.py +10 -48
  186. chia/apis.py +1 -1
  187. chia/cmds/beta.py +1 -1
  188. chia/cmds/chia.py +9 -9
  189. chia/cmds/cmd_classes.py +12 -11
  190. chia/cmds/cmd_helpers.py +1 -1
  191. chia/cmds/cmds_util.py +12 -9
  192. chia/cmds/coin_funcs.py +2 -2
  193. chia/cmds/configure.py +2 -2
  194. chia/cmds/data.py +0 -2
  195. chia/cmds/data_funcs.py +1 -1
  196. chia/cmds/db_validate_func.py +1 -2
  197. chia/cmds/dev/__init__.py +0 -0
  198. chia/cmds/dev/data.py +273 -0
  199. chia/cmds/{gh.py → dev/gh.py} +5 -5
  200. chia/cmds/dev/main.py +22 -0
  201. chia/cmds/dev/mempool.py +78 -0
  202. chia/cmds/dev/mempool_funcs.py +63 -0
  203. chia/cmds/farm_funcs.py +5 -4
  204. chia/cmds/init_funcs.py +11 -11
  205. chia/cmds/keys.py +2 -2
  206. chia/cmds/keys_funcs.py +4 -4
  207. chia/cmds/netspace_funcs.py +1 -1
  208. chia/cmds/peer_funcs.py +2 -2
  209. chia/cmds/plotnft_funcs.py +72 -26
  210. chia/cmds/rpc.py +1 -1
  211. chia/cmds/show_funcs.py +5 -5
  212. chia/cmds/signer.py +8 -7
  213. chia/cmds/sim_funcs.py +8 -9
  214. chia/cmds/wallet.py +2 -2
  215. chia/cmds/wallet_funcs.py +165 -131
  216. chia/{util → consensus}/augmented_chain.py +1 -2
  217. chia/consensus/block_body_validation.py +54 -40
  218. chia/consensus/block_creation.py +42 -76
  219. chia/consensus/block_header_validation.py +32 -26
  220. chia/consensus/block_record.py +0 -3
  221. chia/consensus/blockchain.py +23 -32
  222. chia/consensus/blockchain_interface.py +1 -5
  223. chia/consensus/check_time_locks.py +57 -0
  224. chia/consensus/coin_store_protocol.py +151 -0
  225. chia/consensus/coinbase.py +0 -6
  226. chia/consensus/condition_costs.py +4 -0
  227. chia/{util → consensus}/condition_tools.py +4 -5
  228. chia/consensus/cost_calculator.py +1 -1
  229. chia/consensus/default_constants.py +32 -9
  230. chia/consensus/deficit.py +1 -3
  231. chia/consensus/difficulty_adjustment.py +1 -2
  232. chia/consensus/find_fork_point.py +1 -3
  233. chia/consensus/full_block_to_block_record.py +1 -6
  234. chia/{util → consensus}/generator_tools.py +1 -3
  235. chia/consensus/get_block_challenge.py +30 -7
  236. chia/consensus/make_sub_epoch_summary.py +1 -5
  237. chia/consensus/multiprocess_validation.py +21 -20
  238. chia/consensus/pot_iterations.py +74 -13
  239. chia/{util → consensus}/prev_transaction_block.py +1 -1
  240. chia/consensus/vdf_info_computation.py +1 -3
  241. chia/daemon/keychain_proxy.py +5 -5
  242. chia/daemon/server.py +22 -5
  243. chia/data_layer/data_layer.py +92 -51
  244. chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
  245. chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
  246. chia/data_layer/data_layer_util.py +4 -6
  247. chia/data_layer/data_layer_wallet.py +42 -69
  248. chia/data_layer/dl_wallet_store.py +12 -6
  249. chia/data_layer/download_data.py +3 -3
  250. chia/data_layer/s3_plugin_service.py +0 -1
  251. chia/farmer/farmer.py +3 -4
  252. chia/farmer/farmer_api.py +11 -7
  253. chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
  254. chia/full_node/block_height_map.py +7 -6
  255. chia/full_node/block_store.py +5 -7
  256. chia/full_node/bundle_tools.py +1 -2
  257. chia/full_node/coin_store.py +143 -124
  258. chia/{types → full_node}/eligible_coin_spends.py +39 -70
  259. chia/full_node/fee_estimator.py +1 -1
  260. chia/full_node/fee_estimator_interface.py +0 -8
  261. chia/full_node/fee_tracker.py +25 -25
  262. chia/full_node/full_node.py +70 -53
  263. chia/full_node/full_node_api.py +57 -40
  264. chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
  265. chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
  266. chia/full_node/full_node_store.py +23 -8
  267. chia/full_node/mempool.py +206 -53
  268. chia/full_node/mempool_check_conditions.py +20 -63
  269. chia/full_node/mempool_manager.py +26 -40
  270. chia/full_node/subscriptions.py +1 -3
  271. chia/full_node/tx_processing_queue.py +50 -3
  272. chia/full_node/weight_proof.py +46 -37
  273. chia/harvester/harvester.py +1 -1
  274. chia/harvester/harvester_api.py +22 -7
  275. chia/introducer/introducer.py +1 -1
  276. chia/introducer/introducer_api.py +1 -1
  277. chia/plot_sync/exceptions.py +1 -1
  278. chia/plot_sync/receiver.py +1 -1
  279. chia/plot_sync/sender.py +2 -2
  280. chia/pools/pool_puzzles.py +13 -18
  281. chia/pools/pool_wallet.py +23 -46
  282. chia/protocols/farmer_protocol.py +11 -3
  283. chia/protocols/full_node_protocol.py +1 -4
  284. chia/protocols/harvester_protocol.py +3 -3
  285. chia/protocols/pool_protocol.py +1 -2
  286. chia/protocols/shared_protocol.py +3 -3
  287. chia/protocols/timelord_protocol.py +1 -3
  288. chia/protocols/wallet_protocol.py +3 -3
  289. chia/rpc/rpc_client.py +7 -8
  290. chia/rpc/rpc_server.py +3 -3
  291. chia/rpc/util.py +3 -1
  292. chia/seeder/crawler.py +1 -1
  293. chia/seeder/crawler_api.py +1 -1
  294. chia/seeder/dns_server.py +2 -0
  295. chia/seeder/start_crawler.py +3 -3
  296. chia/server/address_manager.py +286 -38
  297. chia/server/address_manager_store.py +0 -215
  298. chia/{types → server}/aliases.py +7 -7
  299. chia/server/api_protocol.py +1 -1
  300. chia/server/chia_policy.py +1 -1
  301. chia/server/node_discovery.py +76 -113
  302. chia/server/rate_limits.py +1 -1
  303. chia/server/resolve_peer_info.py +43 -0
  304. chia/server/server.py +5 -5
  305. chia/server/start_data_layer.py +4 -4
  306. chia/server/start_farmer.py +5 -4
  307. chia/server/start_full_node.py +5 -4
  308. chia/server/start_harvester.py +7 -5
  309. chia/server/start_introducer.py +2 -2
  310. chia/server/start_service.py +1 -1
  311. chia/server/start_timelord.py +7 -5
  312. chia/server/start_wallet.py +7 -5
  313. chia/server/ws_connection.py +1 -1
  314. chia/simulator/add_blocks_in_batches.py +2 -2
  315. chia/simulator/block_tools.py +245 -201
  316. chia/simulator/full_node_simulator.py +38 -10
  317. chia/simulator/setup_services.py +12 -12
  318. chia/simulator/simulator_full_node_rpc_api.py +2 -2
  319. chia/simulator/simulator_full_node_rpc_client.py +2 -2
  320. chia/simulator/simulator_test_tools.py +2 -2
  321. chia/simulator/start_simulator.py +1 -1
  322. chia/simulator/wallet_tools.py +10 -18
  323. chia/ssl/create_ssl.py +1 -1
  324. chia/timelord/iters_from_block.py +14 -14
  325. chia/timelord/timelord.py +15 -11
  326. chia/timelord/timelord_api.py +14 -2
  327. chia/timelord/timelord_state.py +20 -14
  328. chia/types/blockchain_format/program.py +53 -10
  329. chia/types/blockchain_format/proof_of_space.py +73 -19
  330. chia/types/coin_spend.py +3 -56
  331. chia/types/generator_types.py +28 -0
  332. chia/types/internal_mempool_item.py +1 -2
  333. chia/types/mempool_item.py +12 -7
  334. chia/types/unfinished_header_block.py +1 -2
  335. chia/types/validation_state.py +1 -2
  336. chia/types/weight_proof.py +1 -3
  337. chia/util/action_scope.py +3 -3
  338. chia/util/block_cache.py +1 -2
  339. chia/util/byte_types.py +1 -1
  340. chia/util/casts.py +21 -0
  341. chia/util/config.py +0 -37
  342. chia/util/db_wrapper.py +8 -1
  343. chia/util/errors.py +3 -2
  344. chia/util/initial-config.yaml +21 -5
  345. chia/util/keychain.py +6 -7
  346. chia/util/keyring_wrapper.py +5 -5
  347. chia/util/limited_semaphore.py +1 -1
  348. chia/util/priority_mutex.py +1 -1
  349. chia/util/streamable.py +63 -5
  350. chia/util/task_timing.py +1 -1
  351. chia/util/virtual_project_analysis.py +1 -1
  352. chia/wallet/cat_wallet/cat_info.py +7 -3
  353. chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
  354. chia/wallet/cat_wallet/cat_utils.py +1 -1
  355. chia/wallet/cat_wallet/cat_wallet.py +44 -36
  356. chia/wallet/cat_wallet/lineage_store.py +7 -0
  357. chia/wallet/cat_wallet/r_cat_wallet.py +273 -0
  358. chia/wallet/conditions.py +5 -10
  359. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
  360. chia/wallet/derivation_record.py +33 -0
  361. chia/wallet/derive_keys.py +3 -3
  362. chia/wallet/did_wallet/did_info.py +12 -3
  363. chia/wallet/did_wallet/did_wallet.py +132 -101
  364. chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
  365. chia/wallet/driver_protocol.py +3 -1
  366. chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
  367. chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
  368. chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
  369. chia/wallet/nft_wallet/nft_wallet.py +69 -112
  370. chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
  371. chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
  372. chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
  373. chia/wallet/nft_wallet/uncurry_nft.py +4 -6
  374. chia/wallet/notification_manager.py +2 -3
  375. chia/wallet/outer_puzzles.py +7 -2
  376. chia/wallet/puzzle_drivers.py +1 -1
  377. chia/wallet/puzzles/clawback/drivers.py +5 -4
  378. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
  379. chia/wallet/puzzles/singleton_top_layer.py +2 -1
  380. chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
  381. chia/wallet/puzzles/tails.py +1 -3
  382. chia/wallet/signer_protocol.py +5 -6
  383. chia/wallet/singleton.py +5 -4
  384. chia/wallet/singleton_record.py +1 -1
  385. chia/wallet/trade_manager.py +18 -20
  386. chia/wallet/trade_record.py +3 -6
  387. chia/wallet/trading/offer.py +12 -13
  388. chia/wallet/uncurried_puzzle.py +2 -2
  389. chia/wallet/util/compute_additions.py +58 -0
  390. chia/wallet/util/compute_hints.py +3 -3
  391. chia/wallet/util/compute_memos.py +4 -4
  392. chia/wallet/util/curry_and_treehash.py +2 -1
  393. chia/wallet/util/debug_spend_bundle.py +1 -1
  394. chia/wallet/util/merkle_tree.py +1 -1
  395. chia/wallet/util/peer_request_cache.py +1 -2
  396. chia/wallet/util/tx_config.py +3 -8
  397. chia/wallet/util/wallet_sync_utils.py +10 -5
  398. chia/wallet/util/wallet_types.py +1 -0
  399. chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
  400. chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
  401. chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
  402. chia/wallet/vc_wallet/vc_drivers.py +50 -8
  403. chia/wallet/vc_wallet/vc_store.py +3 -5
  404. chia/wallet/vc_wallet/vc_wallet.py +15 -22
  405. chia/wallet/wallet.py +36 -46
  406. chia/wallet/wallet_action_scope.py +73 -4
  407. chia/wallet/wallet_blockchain.py +1 -3
  408. chia/wallet/wallet_interested_store.py +1 -1
  409. chia/wallet/wallet_nft_store.py +3 -3
  410. chia/wallet/wallet_node.py +17 -16
  411. chia/wallet/wallet_node_api.py +4 -5
  412. chia/wallet/wallet_pool_store.py +1 -1
  413. chia/wallet/wallet_protocol.py +2 -0
  414. chia/wallet/wallet_puzzle_store.py +1 -1
  415. chia/{rpc → wallet}/wallet_request_types.py +670 -81
  416. chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
  417. chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
  418. chia/wallet/wallet_singleton_store.py +8 -7
  419. chia/wallet/wallet_spend_bundle.py +4 -3
  420. chia/wallet/wallet_state_manager.py +320 -191
  421. chia/wallet/wallet_weight_proof_handler.py +1 -2
  422. chia/wallet/wsm_apis.py +98 -0
  423. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/RECORD +443 -436
  425. mozilla-ca/cacert.pem +3 -165
  426. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
  427. chia/cmds/dev.py +0 -18
  428. chia/types/blockchain_format/slots.py +0 -9
  429. chia/types/blockchain_format/sub_epoch_summary.py +0 -5
  430. chia/types/end_of_slot_bundle.py +0 -5
  431. chia/types/full_block.py +0 -5
  432. chia/types/header_block.py +0 -5
  433. chia/types/spend_bundle_conditions.py +0 -7
  434. chia/types/transaction_queue_entry.py +0 -56
  435. chia/types/unfinished_block.py +0 -5
  436. /chia/cmds/{installers.py → dev/installers.py} +0 -0
  437. /chia/cmds/{sim.py → dev/sim.py} +0 -0
  438. /chia/{util → cmds}/dump_keyring.py +0 -0
  439. /chia/{full_node → consensus}/signage_point.py +0 -0
  440. /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
  441. /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
  442. /chia/{util → full_node}/full_block_utils.py +0 -0
  443. /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
  444. /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
  445. /chia/{full_node → protocols}/fee_estimate.py +0 -0
  446. /chia/{server → protocols}/outbound_message.py +0 -0
  447. /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
  448. /chia/{util → simulator}/vdf_prover.py +0 -0
  449. /chia/{util → ssl}/ssl_check.py +0 -0
  450. /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
  451. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/entry_points.txt +0 -0
@@ -24,10 +24,10 @@ from chia.util.file_keyring import FileKeyring
24
24
  # WARNING: Changing the default passphrase will prevent passphrase-less users from accessing
25
25
  # their existing keys. Using a new default passphrase requires migrating existing users to
26
26
  # the new passphrase.
27
- DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE = "$ chia passphrase set # all the cool kids are doing it!"
27
+ DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE = "$ chia passphrase set # all the cool kids are doing it!" # noqa: S105
28
28
 
29
- MASTER_PASSPHRASE_SERVICE_NAME = "Chia Passphrase"
30
- MASTER_PASSPHRASE_USER_NAME = "Chia Passphrase"
29
+ MASTER_PASSPHRASE_SERVICE_NAME = "Chia Passphrase" # noqa: S105
30
+ MASTER_PASSPHRASE_USER_NAME = "Chia Passphrase" # noqa: S105
31
31
 
32
32
 
33
33
  OSPassphraseStore = Union[MacKeyring, WinKeyring]
@@ -112,7 +112,7 @@ def obtain_current_passphrase(prompt: str = DEFAULT_PASSPHRASE_PROMPT, use_passp
112
112
 
113
113
  time.sleep(FAILED_ATTEMPT_DELAY)
114
114
  print("Incorrect passphrase\n")
115
- raise KeychainMaxUnlockAttempts()
115
+ raise KeychainMaxUnlockAttempts
116
116
 
117
117
 
118
118
  class KeyringWrapper:
@@ -254,7 +254,7 @@ class KeyringWrapper:
254
254
  and current_passphrase is not None
255
255
  and not self.master_passphrase_is_valid(current_passphrase)
256
256
  ):
257
- raise KeychainCurrentPassphraseIsInvalid()
257
+ raise KeychainCurrentPassphraseIsInvalid
258
258
 
259
259
  self.set_cached_master_passphrase(new_passphrase, validated=True)
260
260
 
@@ -31,7 +31,7 @@ class LimitedSemaphore:
31
31
  @contextlib.asynccontextmanager
32
32
  async def acquire(self) -> AsyncIterator[int]:
33
33
  if self._available_count < 1:
34
- raise LimitedSemaphoreFullError()
34
+ raise LimitedSemaphoreFullError
35
35
 
36
36
  self._available_count -= 1
37
37
  try:
@@ -66,7 +66,7 @@ class PriorityMutex(Generic[_T_Priority]):
66
66
  if task is None:
67
67
  raise Exception(f"unable to check current task, got: {task!r}")
68
68
  if self._active is not None and self._active.task is task:
69
- raise NestedLockUnsupportedError()
69
+ raise NestedLockUnsupportedError
70
70
 
71
71
  element = _Element(task=task)
72
72
 
chia/util/streamable.py CHANGED
@@ -13,7 +13,7 @@ from typing import TYPE_CHECKING, Any, BinaryIO, Callable, ClassVar, Optional, T
13
13
 
14
14
  from chia_rs.sized_bytes import bytes32
15
15
  from chia_rs.sized_ints import uint16, uint32, uint64
16
- from typing_extensions import Literal, get_args, get_origin
16
+ from typing_extensions import Literal, Self, get_args, get_origin
17
17
 
18
18
  from chia.util.byte_types import hexstr_to_bytes
19
19
  from chia.util.hash import std_hash
@@ -126,6 +126,10 @@ def is_type_Tuple(f_type: object) -> bool:
126
126
  return get_origin(f_type) is tuple or f_type is tuple
127
127
 
128
128
 
129
+ def is_type_Dict(f_type: object) -> bool:
130
+ return get_origin(f_type) is dict or f_type is dict
131
+
132
+
129
133
  def convert_optional(convert_func: ConvertFunctionType, item: Any) -> Any:
130
134
  if item is None:
131
135
  return None
@@ -146,6 +150,12 @@ def convert_list(convert_func: ConvertFunctionType, items: list[Any]) -> list[An
146
150
  return [convert_func(item) for item in items]
147
151
 
148
152
 
153
+ def convert_dict(
154
+ key_converter: ConvertFunctionType, value_converter: ConvertFunctionType, mapping: dict[Any, Any]
155
+ ) -> dict[Any, Any]:
156
+ return {key_converter(key): value_converter(value) for key, value in mapping.items()}
157
+
158
+
149
159
  def convert_hex_string(item: str) -> bytes:
150
160
  if not isinstance(item, str):
151
161
  raise InvalidTypeError(str, type(item))
@@ -213,6 +223,11 @@ def function_to_convert_one_item(
213
223
  convert_inner_func = function_to_convert_one_item(inner_type, json_parser)
214
224
  # Ignoring for now as the proper solution isn't obvious
215
225
  return lambda items: convert_list(convert_inner_func, items) # type: ignore[arg-type]
226
+ elif is_type_Dict(f_type):
227
+ inner_types = get_args(f_type)
228
+ key_converter = function_to_convert_one_item(inner_types[0], json_parser)
229
+ value_converter = function_to_convert_one_item(inner_types[1], json_parser)
230
+ return lambda mapping: convert_dict(key_converter, value_converter, mapping) # type: ignore[arg-type]
216
231
  elif hasattr(f_type, "from_json_dict"):
217
232
  if json_parser is None:
218
233
  json_parser = f_type.from_json_dict
@@ -257,6 +272,11 @@ def function_to_post_init_process_one_item(f_type: type[object]) -> ConvertFunct
257
272
  inner_type = get_args(f_type)[0]
258
273
  process_inner_func = function_to_post_init_process_one_item(inner_type)
259
274
  return lambda items: convert_list(process_inner_func, items) # type: ignore[arg-type]
275
+ if is_type_Dict(f_type):
276
+ inner_types = get_args(f_type)
277
+ key_converter = function_to_post_init_process_one_item(inner_types[0])
278
+ value_converter = function_to_post_init_process_one_item(inner_types[1])
279
+ return lambda mapping: convert_dict(key_converter, value_converter, mapping) # type: ignore[arg-type]
260
280
  return lambda item: post_init_process_item(f_type, item)
261
281
 
262
282
 
@@ -365,6 +385,19 @@ def parse_tuple(f: BinaryIO, list_parse_inner_type_f: list[ParseFunctionType]) -
365
385
  return tuple(full_list)
366
386
 
367
387
 
388
+ def parse_dict(
389
+ f: BinaryIO, key_parse_inner_type_f: ParseFunctionType, value_parse_inner_type_f: ParseFunctionType
390
+ ) -> dict[object, object]:
391
+ # We know this is a list of tuples but our parse_list hint doesn't help us here
392
+ keys_and_values: list[tuple[object, object]] = parse_list( # type: ignore[assignment]
393
+ f, lambda inner_f: parse_tuple(inner_f, [key_parse_inner_type_f, value_parse_inner_type_f])
394
+ )
395
+ parsed_dict: dict[object, object] = dict(keys_and_values)
396
+ if len(parsed_dict) < len(keys_and_values):
397
+ raise ValueError("duplicate dict keys found when deserializing")
398
+ return parsed_dict
399
+
400
+
368
401
  def parse_str(f: BinaryIO) -> str:
369
402
  str_size = parse_uint32(f)
370
403
  str_read_bytes = f.read(str_size)
@@ -399,6 +432,11 @@ def function_to_parse_one_item(f_type: type[Any]) -> ParseFunctionType:
399
432
  inner_types = get_args(f_type)
400
433
  list_parse_inner_type_f = [function_to_parse_one_item(_) for _ in inner_types]
401
434
  return lambda f: parse_tuple(f, list_parse_inner_type_f)
435
+ if is_type_Dict(f_type):
436
+ inner_types = get_args(f_type)
437
+ key_parse_inner_type_f = function_to_parse_one_item(inner_types[0])
438
+ value_parse_inner_type_f = function_to_parse_one_item(inner_types[1])
439
+ return lambda f: parse_dict(f, key_parse_inner_type_f, value_parse_inner_type_f)
402
440
  if f_type is str:
403
441
  return parse_str
404
442
  raise UnsupportedType(f"Type {f_type} does not have parse")
@@ -429,6 +467,21 @@ def stream_tuple(stream_inner_type_funcs: list[StreamFunctionType], item: Any, f
429
467
  stream_inner_type_funcs[i](item[i], f)
430
468
 
431
469
 
470
+ def stream_dict(
471
+ key_stream_inner_type_func: StreamFunctionType,
472
+ value_stream_inner_type_func: StreamFunctionType,
473
+ item: Any,
474
+ f: BinaryIO,
475
+ ) -> None:
476
+ return stream_list(
477
+ lambda inner_item, inner_f: stream_tuple(
478
+ [key_stream_inner_type_func, value_stream_inner_type_func], inner_item, inner_f
479
+ ),
480
+ list(item.items()),
481
+ f,
482
+ )
483
+
484
+
432
485
  def stream_str(item: Any, f: BinaryIO) -> None:
433
486
  str_bytes = item.encode("utf-8")
434
487
  write_uint32(f, uint32(len(str_bytes)))
@@ -469,6 +522,11 @@ def function_to_stream_one_item(f_type: type[Any]) -> StreamFunctionType:
469
522
  for i in range(len(inner_types)):
470
523
  stream_inner_type_funcs.append(function_to_stream_one_item(inner_types[i]))
471
524
  return lambda item, f: stream_tuple(stream_inner_type_funcs, item, f)
525
+ elif is_type_Dict(f_type):
526
+ inner_types = get_args(f_type)
527
+ key_stream_inner_type_func = function_to_stream_one_item(inner_types[0])
528
+ value_stream_inner_type_func = function_to_stream_one_item(inner_types[1])
529
+ return lambda item, f: stream_dict(key_stream_inner_type_func, value_stream_inner_type_func, item, f)
472
530
  elif f_type is str:
473
531
  return stream_str
474
532
  elif f_type is bool:
@@ -575,9 +633,9 @@ class Streamable:
575
633
  raise
576
634
 
577
635
  @classmethod
578
- def parse(cls: type[_T_Streamable], f: BinaryIO) -> _T_Streamable:
636
+ def parse(cls, f: BinaryIO) -> Self:
579
637
  # Create the object without calling __init__() to avoid unnecessary post-init checks in strictdataclass
580
- obj: _T_Streamable = object.__new__(cls)
638
+ obj: Self = object.__new__(cls)
581
639
  for field in cls._streamable_fields:
582
640
  object.__setattr__(obj, field.name, field.parse_function(f))
583
641
  return obj
@@ -590,7 +648,7 @@ class Streamable:
590
648
  return std_hash(bytes(self), skip_bytes_conversion=True)
591
649
 
592
650
  @classmethod
593
- def from_bytes(cls: type[_T_Streamable], blob: bytes) -> _T_Streamable:
651
+ def from_bytes(cls, blob: bytes) -> Self:
594
652
  f = io.BytesIO(blob)
595
653
  parsed = cls.parse(f)
596
654
  assert f.read() == b""
@@ -617,7 +675,7 @@ class Streamable:
617
675
  return ret
618
676
 
619
677
  @classmethod
620
- def from_json_dict(cls: type[_T_Streamable], json_dict: dict[str, Any]) -> _T_Streamable:
678
+ def from_json_dict(cls, json_dict: dict[str, Any]) -> Self:
621
679
  return streamable_from_dict(cls, json_dict)
622
680
 
623
681
 
chia/util/task_timing.py CHANGED
@@ -250,7 +250,7 @@ def start_task_instrumentation() -> None:
250
250
 
251
251
  def color(pct: float) -> str:
252
252
  assert pct >= 0 and pct <= 100
253
- return f"{((100 - pct) // 10) + 1}"
253
+ return f"{int((100 - pct) // 10) + 1}"
254
254
 
255
255
 
256
256
  def fontcolor(pct: float) -> str:
@@ -161,7 +161,7 @@ def find_all_dependency_paths(dependency_graph: dict[str, list[str]], start: str
161
161
  if current in visited:
162
162
  return
163
163
  if current == target and len(path) > 0:
164
- all_paths.append(path[1:] + [current])
164
+ all_paths.append([*path[1:], current])
165
165
  return
166
166
  visited.add(current)
167
167
  for provider in sorted(dependency_graph.get(current, [])):
@@ -19,6 +19,12 @@ class CATInfo(Streamable):
19
19
  my_tail: Optional[Program] # this is the program
20
20
 
21
21
 
22
+ @streamable
23
+ @dataclass(frozen=True)
24
+ class RCATInfo(CATInfo):
25
+ hidden_puzzle_hash: bytes32
26
+
27
+
22
28
  @streamable
23
29
  @dataclass(frozen=True)
24
30
  class CATCoinData(Streamable):
@@ -41,8 +47,6 @@ class LegacyCATInfo(Streamable):
41
47
 
42
48
  @streamable
43
49
  @dataclass(frozen=True)
44
- class CRCATInfo(Streamable):
45
- limitations_program_hash: bytes32
46
- my_tail: Optional[Program] # this is the program
50
+ class CRCATInfo(CATInfo):
47
51
  authorized_providers: list[bytes32]
48
52
  proofs_checker: ProofsChecker
@@ -3,12 +3,12 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass
4
4
  from typing import Any, Callable, Optional
5
5
 
6
+ from chia_rs import CoinSpend
6
7
  from chia_rs.sized_bytes import bytes32
7
8
  from chia_rs.sized_ints import uint64
8
9
 
9
10
  from chia.types.blockchain_format.coin import Coin
10
11
  from chia.types.blockchain_format.program import Program
11
- from chia.types.coin_spend import CoinSpend
12
12
  from chia.wallet.cat_wallet.cat_utils import (
13
13
  CAT_MOD,
14
14
  SpendableCAT,
@@ -26,7 +26,7 @@ class CATOuterPuzzle:
26
26
  _match: Callable[[UncurriedPuzzle], Optional[PuzzleInfo]]
27
27
  _construct: Callable[[PuzzleInfo, Program], Program]
28
28
  _solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
29
- _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle], Optional[Program]]
29
+ _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Optional[Program]], Optional[Program]]
30
30
  _get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
31
31
 
32
32
  def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
@@ -43,14 +43,18 @@ class CATOuterPuzzle:
43
43
  constructor_dict["also"] = next_constructor.info
44
44
  return PuzzleInfo(constructor_dict)
45
45
 
46
- def get_inner_puzzle(self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle) -> Optional[Program]:
46
+ def get_inner_puzzle(
47
+ self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
48
+ ) -> Optional[Program]:
47
49
  args = match_cat_puzzle(puzzle_reveal)
48
50
  if args is None:
49
51
  raise ValueError("This driver is not for the specified puzzle reveal")
50
52
  _, _, inner_puzzle = args
51
53
  also = constructor.also()
52
54
  if also is not None:
53
- deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle))
55
+ deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(
56
+ also, uncurry_puzzle(inner_puzzle), solution.first() if solution is not None else None
57
+ )
54
58
  return deep_inner_puzzle
55
59
  else:
56
60
  return inner_puzzle
@@ -118,4 +122,4 @@ class CATOuterPuzzle:
118
122
  )
119
123
  )
120
124
  bundle = unsigned_spend_bundle_for_spendable_cats(CAT_MOD, spendable_cats)
121
- return next(cs.solution.to_program() for cs in bundle.coin_spends if cs.coin == target_coin)
125
+ return next(Program.from_serialized(cs.solution) for cs in bundle.coin_spends if cs.coin == target_coin)
@@ -8,11 +8,11 @@ from chia_puzzles_py.programs import CAT_PUZZLE, CAT_PUZZLE_HASH
8
8
  from chia_rs import G2Element
9
9
  from chia_rs.sized_bytes import bytes32
10
10
 
11
+ from chia.consensus.condition_tools import conditions_dict_for_solution
11
12
  from chia.types.blockchain_format.coin import Coin, coin_as_list
12
13
  from chia.types.blockchain_format.program import INFINITE_COST, Program
13
14
  from chia.types.coin_spend import make_spend
14
15
  from chia.types.condition_opcodes import ConditionOpcode
15
- from chia.util.condition_tools import conditions_dict_for_solution
16
16
  from chia.wallet.lineage_proof import LineageProof
17
17
  from chia.wallet.uncurried_puzzle import UncurriedPuzzle
18
18
  from chia.wallet.util.curry_and_treehash import calculate_hash_of_quoted_mod_hash
@@ -9,13 +9,12 @@ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
9
9
  from chia_rs import G1Element
10
10
  from chia_rs.sized_bytes import bytes32
11
11
  from chia_rs.sized_ints import uint32, uint64, uint128
12
- from typing_extensions import Unpack
12
+ from typing_extensions import Self, Unpack
13
13
 
14
14
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
15
15
  from chia.server.ws_connection import WSChiaConnection
16
16
  from chia.types.blockchain_format.coin import Coin
17
- from chia.types.blockchain_format.program import Program
18
- from chia.types.coin_spend import compute_additions_with_cost
17
+ from chia.types.blockchain_format.program import Program, run
19
18
  from chia.types.condition_opcodes import ConditionOpcode
20
19
  from chia.util.byte_types import hexstr_to_bytes
21
20
  from chia.util.errors import Err, ValidationError
@@ -49,6 +48,7 @@ from chia.wallet.puzzle_drivers import PuzzleInfo
49
48
  from chia.wallet.puzzles.tails import ALL_LIMITATIONS_PROGRAMS
50
49
  from chia.wallet.transaction_record import TransactionRecord
51
50
  from chia.wallet.uncurried_puzzle import uncurry_puzzle
51
+ from chia.wallet.util.compute_additions import compute_additions_with_cost
52
52
  from chia.wallet.util.compute_memos import compute_memos
53
53
  from chia.wallet.util.curry_and_treehash import curry_and_treehash
54
54
  from chia.wallet.util.transaction_type import TransactionType
@@ -93,6 +93,8 @@ class CATWallet:
93
93
  cat_info: CATInfo
94
94
  standard_wallet: Wallet
95
95
  lineage_store: CATLineageStore
96
+ wallet_type: ClassVar[WalletType] = WalletType.CAT
97
+ wallet_info_type: ClassVar[type[CATInfo]] = CATInfo
96
98
 
97
99
  @staticmethod
98
100
  def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
@@ -120,7 +122,7 @@ class CATWallet:
120
122
 
121
123
  # We use 00 bytes because it's not optional. We must check this is overridden during issuance.
122
124
  empty_bytes = bytes32(32 * b"\0")
123
- self.cat_info = CATInfo(empty_bytes, None)
125
+ self.cat_info = self.wallet_info_type(empty_bytes, None)
124
126
  info_as_string = bytes(self.cat_info).hex()
125
127
  # If the name is not provided, it will be autogenerated based on the resulting tail hash.
126
128
  # For now, give the wallet a temporary name "CAT WALLET" until we get the tail hash
@@ -128,7 +130,7 @@ class CATWallet:
128
130
  if name is None:
129
131
  name = "CAT WALLET"
130
132
 
131
- self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, WalletType.CAT, info_as_string)
133
+ self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, self.wallet_type, info_as_string)
132
134
 
133
135
  try:
134
136
  spend_bundle = await ALL_LIMITATIONS_PROGRAMS[cat_tail_info["identifier"]].generate_issuance_bundle(
@@ -193,22 +195,23 @@ class CATWallet:
193
195
  interface.side_effects.transactions.append(cat_record)
194
196
  return self
195
197
 
196
- @staticmethod
198
+ @classmethod
197
199
  async def get_or_create_wallet_for_cat(
200
+ cls,
198
201
  wallet_state_manager: WalletStateManager,
199
202
  wallet: Wallet,
200
203
  limitations_program_hash_hex: str,
201
204
  name: Optional[str] = None,
202
- ) -> CATWallet:
203
- self = CATWallet()
205
+ ) -> Self:
206
+ self = cls()
204
207
  self.standard_wallet = wallet
205
208
  self.log = logging.getLogger(__name__)
206
209
 
207
210
  limitations_program_hash_hex = bytes32.from_hexstr(limitations_program_hash_hex).hex() # Normalize the format
208
211
 
209
212
  for id, w in wallet_state_manager.wallets.items():
210
- if w.type() == CATWallet.type():
211
- assert isinstance(w, CATWallet)
213
+ if w.type() == cls.type():
214
+ assert isinstance(w, cls)
212
215
  if w.get_asset_id() == limitations_program_hash_hex:
213
216
  self.log.warning("Not creating wallet for already existing CAT wallet")
214
217
  return w
@@ -221,9 +224,9 @@ class CATWallet:
221
224
  name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
222
225
 
223
226
  limitations_program_hash = bytes32.from_hexstr(limitations_program_hash_hex)
224
- self.cat_info = CATInfo(limitations_program_hash, None)
227
+ self.cat_info = cls.wallet_info_type(limitations_program_hash, None)
225
228
  info_as_string = bytes(self.cat_info).hex()
226
- self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, WalletType.CAT, info_as_string)
229
+ self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, self.wallet_type, info_as_string)
227
230
 
228
231
  self.lineage_store = await CATLineageStore.create(self.wallet_state_manager.db_wrapper, self.get_asset_id())
229
232
  await self.wallet_state_manager.add_new_wallet(self)
@@ -272,13 +275,14 @@ class CATWallet:
272
275
  name,
273
276
  )
274
277
 
275
- @staticmethod
278
+ @classmethod
276
279
  async def create(
280
+ cls,
277
281
  wallet_state_manager: WalletStateManager,
278
282
  wallet: Wallet,
279
283
  wallet_info: WalletInfo,
280
- ) -> CATWallet:
281
- self = CATWallet()
284
+ ) -> Self:
285
+ self = cls()
282
286
 
283
287
  self.log = logging.getLogger(__name__)
284
288
 
@@ -286,12 +290,12 @@ class CATWallet:
286
290
  self.wallet_info = wallet_info
287
291
  self.standard_wallet = wallet
288
292
  try:
289
- self.cat_info = CATInfo.from_bytes(hexstr_to_bytes(self.wallet_info.data))
293
+ self.cat_info = cls.wallet_info_type.from_bytes(hexstr_to_bytes(self.wallet_info.data))
290
294
  self.lineage_store = await CATLineageStore.create(self.wallet_state_manager.db_wrapper, self.get_asset_id())
291
295
  except AssertionError:
292
296
  # Do a migration of the lineage proofs
293
297
  cat_info = LegacyCATInfo.from_bytes(hexstr_to_bytes(self.wallet_info.data))
294
- self.cat_info = CATInfo(cat_info.limitations_program_hash, cat_info.my_tail)
298
+ self.cat_info = cls.wallet_info_type(cat_info.limitations_program_hash, cat_info.my_tail)
295
299
  self.lineage_store = await CATLineageStore.create(self.wallet_state_manager.db_wrapper, self.get_asset_id())
296
300
  for coin_id, lineage in cat_info.lineage_proofs:
297
301
  await self.add_lineage(coin_id, lineage)
@@ -301,7 +305,7 @@ class CATWallet:
301
305
 
302
306
  @classmethod
303
307
  def type(cls) -> WalletType:
304
- return WalletType.CAT
308
+ return cls.wallet_type
305
309
 
306
310
  def id(self) -> uint32:
307
311
  return self.wallet_info.id
@@ -352,15 +356,6 @@ class CATWallet:
352
356
  def get_asset_id(self) -> str:
353
357
  return bytes(self.cat_info.limitations_program_hash).hex()
354
358
 
355
- async def set_tail_program(self, tail_program: str) -> None:
356
- assert Program.fromhex(tail_program).get_tree_hash() == self.cat_info.limitations_program_hash
357
- await self.save_info(
358
- CATInfo(
359
- self.cat_info.limitations_program_hash,
360
- Program.fromhex(tail_program),
361
- )
362
- )
363
-
364
359
  async def coin_added(
365
360
  self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data: Optional[CATCoinData]
366
361
  ) -> None:
@@ -583,7 +578,7 @@ class CATWallet:
583
578
  selected_amount = sum(c.amount for c in chia_coins)
584
579
  await self.standard_wallet.generate_signed_transaction(
585
580
  [uint64(selected_amount + amount_to_claim - fee)],
586
- [(await self.standard_wallet.get_puzzle_hash(not action_scope.config.tx_config.reuse_puzhash))],
581
+ [await action_scope.get_puzzle_hash(self.wallet_state_manager)],
587
582
  inner_action_scope,
588
583
  coins=chia_coins,
589
584
  negative_change_allowed=True,
@@ -596,7 +591,7 @@ class CATWallet:
596
591
  continue
597
592
  for spend in tx.spend_bundle.coin_spends:
598
593
  if spend.coin.name() == origin_id:
599
- conditions = spend.puzzle_reveal.to_program().run(spend.solution.to_program()).as_python()
594
+ conditions = run(spend.puzzle_reveal, Program.from_serialized(spend.solution)).as_python()
600
595
  for condition in conditions:
601
596
  if condition[0] == ConditionOpcode.CREATE_COIN_ANNOUNCEMENT:
602
597
  message = condition[1]
@@ -609,6 +604,14 @@ class CATWallet:
609
604
 
610
605
  return announcement
611
606
 
607
+ async def make_inner_solution(
608
+ self,
609
+ coin: Coin,
610
+ primaries: list[CreateCoin],
611
+ conditions: tuple[Condition, ...] = tuple(),
612
+ ) -> Program:
613
+ return self.standard_wallet.make_solution(primaries=primaries, conditions=conditions)
614
+
612
615
  async def generate_unsigned_spendbundle(
613
616
  self,
614
617
  payments: list[CreateCoin],
@@ -657,10 +660,12 @@ class CATWallet:
657
660
  for payment in payments:
658
661
  if change_puzhash == payment.puzzle_hash and change == payment.amount:
659
662
  # We cannot create two coins has same id, create a new puzhash for the change
660
- change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
663
+ change_puzhash = await action_scope.get_puzzle_hash(
664
+ self.wallet_state_manager, override_reuse_puzhash_with=False
665
+ )
661
666
  break
662
667
  else:
663
- change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
668
+ change_puzhash = await action_scope.get_puzzle_hash(self.wallet_state_manager)
664
669
  primaries.append(CreateCoin(change_puzhash, uint64(change), [change_puzhash]))
665
670
 
666
671
  # Loop through the coins we've selected and gather the information we need to spend them
@@ -692,7 +697,8 @@ class CATWallet:
692
697
  action_scope,
693
698
  extra_conditions=(announcement.corresponding_assertion(),),
694
699
  )
695
- innersol = self.standard_wallet.make_solution(
700
+ innersol = await self.make_inner_solution(
701
+ coin=coin,
696
702
  primaries=primaries,
697
703
  conditions=(*extra_conditions, announcement),
698
704
  )
@@ -703,7 +709,8 @@ class CATWallet:
703
709
  action_scope,
704
710
  )
705
711
  assert xch_announcement is not None
706
- innersol = self.standard_wallet.make_solution(
712
+ innersol = await self.make_inner_solution(
713
+ coin=coin,
707
714
  primaries=primaries,
708
715
  conditions=(*extra_conditions, xch_announcement, announcement),
709
716
  )
@@ -711,13 +718,14 @@ class CATWallet:
711
718
  # TODO: what about when they are equal?
712
719
  raise Exception("Equality not handled")
713
720
  else:
714
- innersol = self.standard_wallet.make_solution(
721
+ innersol = await self.make_inner_solution(
722
+ coin=coin,
715
723
  primaries=primaries,
716
724
  conditions=(*extra_conditions, announcement),
717
725
  )
718
726
  else:
719
- innersol = self.standard_wallet.make_solution(
720
- primaries=[], conditions=(announcement.corresponding_assertion(),)
727
+ innersol = await self.make_inner_solution(
728
+ coin=coin, primaries=[], conditions=(announcement.corresponding_assertion(),)
721
729
  )
722
730
  inner_puzzle = await self.inner_puzzle_for_cat_puzhash(coin.puzzle_hash)
723
731
  lineage_proof = await self.get_lineage_proof_for_coin(coin)
@@ -73,3 +73,10 @@ class CATLineageStore:
73
73
  lineage_dict[bytes32.from_hexstr(row[0])] = LineageProof.from_bytes(row[1])
74
74
 
75
75
  return lineage_dict
76
+
77
+ async def is_empty(self) -> bool:
78
+ async with self.db_wrapper.reader_no_transaction() as conn:
79
+ cursor = await conn.execute(f"SELECT COUNT(*) FROM {self.table_name}")
80
+ row_count = await cursor.fetchone()
81
+ assert row_count is not None
82
+ return bool(row_count[0] == 0)