chia-blockchain 2.5.4rc1__py3-none-any.whl → 2.5.5__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 +529 -69
  63. chia/_tests/core/mempool/test_mempool_performance.py +3 -2
  64. chia/_tests/core/mempool/test_singleton_fast_forward.py +61 -132
  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 +495 -265
  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 +153 -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 +53 -47
  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 +274 -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.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.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.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
@@ -4,7 +4,7 @@ import functools
4
4
  from collections.abc import Iterable
5
5
  from dataclasses import dataclass, replace
6
6
  from enum import IntEnum
7
- from typing import Optional, TypeVar
7
+ from typing import Optional
8
8
 
9
9
  from chia_puzzles_py.programs import (
10
10
  CONDITIONS_W_FEE_ANNOUNCE,
@@ -16,13 +16,15 @@ from chia_puzzles_py.programs import (
16
16
  from chia_puzzles_py.programs import (
17
17
  CREDENTIAL_RESTRICTION_HASH as CREDENTIAL_RESTRICTION_HASH_BYTES,
18
18
  )
19
+ from chia_rs import CoinSpend
19
20
  from chia_rs.sized_bytes import bytes32
20
21
  from chia_rs.sized_ints import uint16, uint64
21
- from clvm.casts import int_to_bytes
22
+ from typing_extensions import Self
22
23
 
23
24
  from chia.types.blockchain_format.coin import Coin, coin_as_list
24
25
  from chia.types.blockchain_format.program import Program
25
- from chia.types.coin_spend import CoinSpend, make_spend
26
+ from chia.types.coin_spend import make_spend
27
+ from chia.util.casts import int_to_bytes
26
28
  from chia.util.hash import std_hash
27
29
  from chia.util.streamable import Streamable, streamable
28
30
  from chia.wallet.cat_wallet.cat_utils import CAT_MOD, construct_cat_puzzle
@@ -165,9 +167,6 @@ def construct_pending_approval_state(puzzle_hash: bytes32, amount: uint64) -> Pr
165
167
  return PENDING_VC_ANNOUNCEMENT.curry(Program.to([[51, puzzle_hash, amount, [puzzle_hash]]]))
166
168
 
167
169
 
168
- _T_CRCAT = TypeVar("_T_CRCAT", bound="CRCAT")
169
-
170
-
171
170
  @dataclass(frozen=True)
172
171
  class CRCAT:
173
172
  coin: Coin
@@ -179,7 +178,7 @@ class CRCAT:
179
178
 
180
179
  @classmethod
181
180
  def launch(
182
- cls: type[_T_CRCAT],
181
+ cls,
183
182
  # General CAT launching info
184
183
  origin_coin: Coin,
185
184
  payment: CreateCoin,
@@ -307,12 +306,12 @@ class CRCAT:
307
306
  return solution.at("f").at("rrrrrrf")
308
307
 
309
308
  @classmethod
310
- def get_current_from_coin_spend(cls: type[_T_CRCAT], spend: CoinSpend) -> CRCAT: # pragma: no cover
309
+ def get_current_from_coin_spend(cls, spend: CoinSpend) -> CRCAT: # pragma: no cover
311
310
  uncurried_puzzle: UncurriedPuzzle = uncurry_puzzle(spend.puzzle_reveal)
312
311
  first_uncurried_cr_layer: UncurriedPuzzle = uncurry_puzzle(uncurried_puzzle.args.at("rrf"))
313
312
  second_uncurried_cr_layer: UncurriedPuzzle = uncurry_puzzle(first_uncurried_cr_layer.mod)
314
313
  lineage_proof = LineageProof.from_program(
315
- spend.solution.to_program().at("rf"),
314
+ Program.from_serialized(spend.solution).at("rf"),
316
315
  [LineageProofField.PARENT_NAME, LineageProofField.INNER_PUZZLE_HASH, LineageProofField.AMOUNT],
317
316
  )
318
317
  return CRCAT(
@@ -326,7 +325,7 @@ class CRCAT:
326
325
 
327
326
  @classmethod
328
327
  def get_next_from_coin_spend(
329
- cls: type[_T_CRCAT],
328
+ cls,
330
329
  parent_spend: CoinSpend,
331
330
  conditions: Optional[Program] = None, # For optimization purposes, the conditions may already have been run
332
331
  ) -> list[CRCAT]:
@@ -338,8 +337,8 @@ class CRCAT:
338
337
  as the spend output a remark condition that was (REMARK authorized_providers proofs_checker)
339
338
  """
340
339
  coin_name: bytes32 = parent_spend.coin.name()
341
- puzzle: Program = parent_spend.puzzle_reveal.to_program()
342
- solution: Program = parent_spend.solution.to_program()
340
+ puzzle = Program.from_serialized(parent_spend.puzzle_reveal)
341
+ solution = Program.from_serialized(parent_spend.solution)
343
342
 
344
343
  # Get info by uncurrying
345
344
  _, tail_hash_as_prog, potential_cr_layer = puzzle.uncurry()[1].as_iter()
@@ -515,8 +514,8 @@ class CRCAT:
515
514
 
516
515
  @classmethod
517
516
  def spend_many(
518
- cls: type[_T_CRCAT],
519
- inner_spends: list[tuple[_T_CRCAT, int, Program, Program]], # CRCAT, extra_delta, inner puzzle, inner solution
517
+ cls,
518
+ inner_spends: list[tuple[Self, int, Program, Program]], # CRCAT, extra_delta, inner puzzle, inner solution
520
519
  # CR layer solving info
521
520
  proof_of_inclusions: Program,
522
521
  proof_checker_solution: Program,
@@ -538,7 +537,7 @@ class CRCAT:
538
537
  def prev_index(index: int) -> int:
539
538
  return index - 1
540
539
 
541
- sorted_inner_spends: list[tuple[_T_CRCAT, int, Program, Program]] = sorted(
540
+ sorted_inner_spends: list[tuple[Self, int, Program, Program]] = sorted(
542
541
  inner_spends,
543
542
  key=lambda spend: spend[0].coin.name(),
544
543
  )
@@ -609,16 +608,16 @@ class CRCATSpend:
609
608
  @classmethod
610
609
  def from_coin_spend(cls, spend: CoinSpend) -> CRCATSpend: # pragma: no cover
611
610
  inner_puzzle: Program = CRCAT.get_inner_puzzle(uncurry_puzzle(spend.puzzle_reveal))
612
- inner_solution: Program = CRCAT.get_inner_solution(spend.solution.to_program())
611
+ inner_solution: Program = CRCAT.get_inner_solution(Program.from_serialized(spend.solution))
613
612
  inner_conditions: Program = inner_puzzle.run(inner_solution)
614
613
  return cls(
615
614
  CRCAT.get_current_from_coin_spend(spend),
616
615
  inner_puzzle,
617
616
  inner_solution,
618
617
  CRCAT.get_next_from_coin_spend(spend, conditions=inner_conditions),
619
- spend.solution.to_program().at("f").at("rrrrf") == Program.to(None),
618
+ Program.from_serialized(spend.solution).at("f").at("rrrrf") == Program.to(None),
620
619
  list(inner_conditions.as_iter()),
621
- spend.solution.to_program().at("f").at("f"),
620
+ Program.from_serialized(spend.solution).at("f").at("f"),
622
621
  )
623
622
 
624
623
 
@@ -3,17 +3,16 @@ from __future__ import annotations
3
3
  import logging
4
4
  import time
5
5
  import traceback
6
- from typing import TYPE_CHECKING, Any, Optional
6
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional
7
7
 
8
- from chia_rs import G1Element, G2Element
8
+ from chia_rs import CoinSpend, G1Element, G2Element
9
9
  from chia_rs.sized_bytes import bytes32
10
10
  from chia_rs.sized_ints import uint8, uint32, uint64, uint128
11
- from typing_extensions import Unpack
11
+ from typing_extensions import Self, Unpack
12
12
 
13
13
  from chia.server.ws_connection import WSChiaConnection
14
14
  from chia.types.blockchain_format.coin import Coin, coin_as_list
15
15
  from chia.types.blockchain_format.program import Program
16
- from chia.types.coin_spend import CoinSpend
17
16
  from chia.util.byte_types import hexstr_to_bytes
18
17
  from chia.util.hash import std_hash
19
18
  from chia.util.streamable import VersionedBlob
@@ -69,6 +68,8 @@ class CRCATWallet(CATWallet):
69
68
  wallet_info: WalletInfo
70
69
  info: CRCATInfo
71
70
  standard_wallet: Wallet
71
+ wallet_type: ClassVar[WalletType] = WalletType.CRCAT
72
+ wallet_info_type: ClassVar[type[CRCATInfo]] = CRCATInfo
72
73
 
73
74
  @staticmethod
74
75
  def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
@@ -91,18 +92,19 @@ class CRCATWallet(CATWallet):
91
92
  ) -> CATWallet: # pragma: no cover
92
93
  raise NotImplementedError("create_new_cat_wallet is a legacy method and is not available on CR-CAT wallets")
93
94
 
94
- @staticmethod
95
+ @classmethod
95
96
  async def get_or_create_wallet_for_cat(
97
+ cls,
96
98
  wallet_state_manager: WalletStateManager,
97
99
  wallet: Wallet,
98
100
  limitations_program_hash_hex: str,
99
101
  name: Optional[str] = None,
100
102
  authorized_providers: Optional[list[bytes32]] = None,
101
103
  proofs_checker: Optional[ProofsChecker] = None,
102
- ) -> CRCATWallet:
104
+ ) -> Self:
103
105
  if authorized_providers is None or proofs_checker is None: # pragma: no cover
104
106
  raise ValueError("get_or_create_wallet_for_cat was call on CRCATWallet without proper arguments")
105
- self = CRCATWallet()
107
+ self = cls()
106
108
  self.standard_wallet = wallet
107
109
  if name is None:
108
110
  name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
@@ -111,15 +113,15 @@ class CRCATWallet(CATWallet):
111
113
  tail_hash = bytes32.from_hexstr(limitations_program_hash_hex)
112
114
 
113
115
  for id, w in wallet_state_manager.wallets.items():
114
- if w.type() == CRCATWallet.type():
115
- assert isinstance(w, CRCATWallet)
116
+ if w.type() == cls.type():
117
+ assert isinstance(w, cls)
116
118
  if w.get_asset_id() == limitations_program_hash_hex:
117
119
  self.log.warning("Not creating wallet for already existing CR-CAT wallet")
118
120
  return w
119
121
 
120
122
  self.wallet_state_manager = wallet_state_manager
121
123
 
122
- self.info = CRCATInfo(tail_hash, None, authorized_providers, proofs_checker)
124
+ self.info = cls.wallet_info_type(tail_hash, None, authorized_providers, proofs_checker)
123
125
  info_as_string = bytes(self.info).hex()
124
126
  self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, WalletType.CRCAT, info_as_string)
125
127
 
@@ -160,7 +162,7 @@ class CRCATWallet(CATWallet):
160
162
  self.wallet_state_manager = wallet_state_manager
161
163
  self.wallet_info = wallet_info
162
164
  self.standard_wallet = wallet
163
- self.info = CRCATInfo.from_bytes(hexstr_to_bytes(self.wallet_info.data))
165
+ self.info = self.wallet_info_type.from_bytes(hexstr_to_bytes(self.wallet_info.data))
164
166
  return self
165
167
 
166
168
  @classmethod
@@ -175,7 +177,7 @@ class CRCATWallet(CATWallet):
175
177
  replace_self.log = logging.getLogger(cat_wallet.get_name())
176
178
  replace_self.log.info(f"Converting CAT wallet {cat_wallet.id()} to CR-CAT wallet")
177
179
  replace_self.wallet_state_manager = cat_wallet.wallet_state_manager
178
- replace_self.info = CRCATInfo(
180
+ replace_self.info = cls.wallet_info_type(
179
181
  cat_wallet.cat_info.limitations_program_hash, None, authorized_providers, proofs_checker
180
182
  )
181
183
  await cat_wallet.wallet_state_manager.user_store.update_wallet(
@@ -197,7 +199,7 @@ class CRCATWallet(CATWallet):
197
199
  return self.wallet_info.id
198
200
 
199
201
  def get_asset_id(self) -> str:
200
- return self.info.limitations_program_hash.hex()
202
+ return bytes(self.info.limitations_program_hash).hex()
201
203
 
202
204
  async def set_tail_program(self, tail_program: str) -> None: # pragma: no cover
203
205
  raise NotImplementedError("set_tail_program is a legacy method and is not available on CR-CAT wallets")
@@ -449,19 +451,18 @@ class CRCATWallet(CATWallet):
449
451
  if origin_crcat_record is None:
450
452
  raise RuntimeError("A CR-CAT coin was selected that we don't have a record for") # pragma: no cover
451
453
  origin_crcat = self.coin_record_to_crcat(origin_crcat_record)
452
- if action_scope.config.tx_config.override(
453
- reuse_puzhash=(
454
- True if not add_authorizations_to_cr_cats else action_scope.config.tx_config.reuse_puzhash
455
- )
456
- ).reuse_puzhash:
457
- change_puzhash = origin_crcat.inner_puzzle_hash
458
- for payment in payments:
459
- if change_puzhash == payment.puzzle_hash and change == payment.amount:
460
- # We cannot create two coins has same id, create a new puzhash for the change
461
- change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
462
- break
454
+
455
+ if add_authorizations_to_cr_cats:
456
+ change_puzhash = await action_scope.get_puzzle_hash(self.wallet_state_manager)
463
457
  else:
464
- change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
458
+ change_puzhash = origin_crcat.inner_puzzle_hash
459
+ for payment in payments:
460
+ if change_puzhash == payment.puzzle_hash and change == payment.amount:
461
+ # We cannot create two coins has same id, create a new puzhash for the change
462
+ change_puzhash = await action_scope.get_puzzle_hash(
463
+ self.wallet_state_manager, override_reuse_puzhash_with=False
464
+ )
465
+ break
465
466
  primaries.append(CreateCoin(change_puzhash, uint64(change), [change_puzhash]))
466
467
 
467
468
  # Find the VC Wallet
@@ -586,7 +587,7 @@ class CRCATWallet(CATWallet):
586
587
  if add_authorizations_to_cr_cats:
587
588
  await vc_wallet.generate_signed_transaction(
588
589
  [uint64(1)],
589
- [await self.standard_wallet.get_puzzle_hash(new=not action_scope.config.tx_config.reuse_puzhash)],
590
+ [await action_scope.get_puzzle_hash(self.wallet_state_manager)],
590
591
  action_scope,
591
592
  vc_id=vc.launcher_id,
592
593
  extra_conditions=(
@@ -769,7 +770,7 @@ class CRCATWallet(CATWallet):
769
770
  # Make the VC TX
770
771
  await vc_wallet.generate_signed_transaction(
771
772
  [uint64(1)],
772
- [await self.standard_wallet.get_puzzle_hash(new=not action_scope.config.tx_config.reuse_puzhash)],
773
+ [await action_scope.get_puzzle_hash(self.wallet_state_manager)],
773
774
  action_scope,
774
775
  vc_id=vc.launcher_id,
775
776
  extra_conditions=(
@@ -780,6 +781,7 @@ class CRCATWallet(CATWallet):
780
781
  ),
781
782
  )
782
783
 
784
+ to_puzzle_hash = await action_scope.get_puzzle_hash(self.wallet_state_manager, override_reuse_puzhash_with=True)
783
785
  async with action_scope.use() as interface:
784
786
  other_additions: set[Coin] = {rem for tx in interface.side_effects.transactions for rem in tx.additions}
785
787
  other_removals: set[Coin] = {rem for tx in interface.side_effects.transactions for rem in tx.removals}
@@ -787,7 +789,7 @@ class CRCATWallet(CATWallet):
787
789
  TransactionRecord(
788
790
  confirmed_at_height=uint32(0),
789
791
  created_at_time=uint64(int(time.time())),
790
- to_puzzle_hash=await self.wallet_state_manager.main_wallet.get_puzzle_hash(False),
792
+ to_puzzle_hash=to_puzzle_hash,
791
793
  amount=uint64(sum(c.amount for c in coins)),
792
794
  fee_amount=fee,
793
795
  confirmed=False,
@@ -19,7 +19,7 @@ class CROuterPuzzle:
19
19
  _match: Callable[[UncurriedPuzzle], Optional[PuzzleInfo]]
20
20
  _construct: Callable[[PuzzleInfo, Program], Program]
21
21
  _solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
22
- _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle], Optional[Program]]
22
+ _get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Optional[Program]], Optional[Program]]
23
23
  _get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
24
24
 
25
25
  def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
@@ -37,14 +37,16 @@ class CROuterPuzzle:
37
37
  constructor_dict["also"] = next_constructor.info
38
38
  return PuzzleInfo(constructor_dict)
39
39
 
40
- def get_inner_puzzle(self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle) -> Optional[Program]:
40
+ def get_inner_puzzle(
41
+ self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
42
+ ) -> Optional[Program]:
41
43
  args: Optional[tuple[list[bytes32], Program, Program]] = match_cr_layer(puzzle_reveal)
42
44
  if args is None:
43
45
  raise ValueError("This driver is not for the specified puzzle reveal") # pragma: no cover
44
46
  _, _, inner_puzzle = args
45
47
  also = constructor.also()
46
48
  if also is not None:
47
- deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle))
49
+ deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
48
50
  return deep_inner_puzzle
49
51
  else:
50
52
  return inner_puzzle
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, replace
4
- from typing import Optional, TypeVar
4
+ from typing import Any, Optional
5
5
 
6
6
  from chia_puzzles_py.programs import ACS_TRANSFER_PROGRAM as ACS_TRANSFER_PROGRAM_BYTES
7
7
  from chia_puzzles_py.programs import COVENANT_LAYER as COVENANT_LAYER_BYTES
@@ -20,16 +20,19 @@ from chia_puzzles_py.programs import REVOCATION_LAYER_HASH as REVOCATION_LAYER_H
20
20
  from chia_puzzles_py.programs import STANDARD_VC_REVOCATION_PUZZLE as STANDARD_VC_REVOCATION_PUZZLE_BYTES
21
21
  from chia_puzzles_py.programs import STD_PARENT_MORPHER as STD_PARENT_MORPHER_BYTES
22
22
  from chia_puzzles_py.programs import STD_PARENT_MORPHER_HASH as STD_PARENT_MORPHER_HASH_BYTES
23
+ from chia_rs import CoinSpend
23
24
  from chia_rs.sized_bytes import bytes32
24
25
  from chia_rs.sized_ints import uint64
26
+ from typing_extensions import Self
25
27
 
26
28
  from chia.types.blockchain_format.coin import Coin
27
29
  from chia.types.blockchain_format.program import Program
28
- from chia.types.coin_spend import CoinSpend, compute_additions, make_spend
30
+ from chia.types.coin_spend import make_spend
29
31
  from chia.util.hash import std_hash
30
32
  from chia.util.streamable import Streamable, streamable
31
33
  from chia.wallet.conditions import Condition, CreatePuzzleAnnouncement
32
34
  from chia.wallet.lineage_proof import LineageProof
35
+ from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
33
36
  from chia.wallet.puzzles.singleton_top_layer_v1_1 import (
34
37
  SINGLETON_LAUNCHER,
35
38
  SINGLETON_LAUNCHER_HASH,
@@ -40,6 +43,7 @@ from chia.wallet.puzzles.singleton_top_layer_v1_1 import (
40
43
  solution_for_singleton,
41
44
  )
42
45
  from chia.wallet.uncurried_puzzle import UncurriedPuzzle, uncurry_puzzle
46
+ from chia.wallet.util.compute_additions import compute_additions
43
47
 
44
48
  # Mods
45
49
  EXTIGENT_METADATA_LAYER = Program.from_bytes(EXIGENT_METADATA_LAYER_BYTES)
@@ -288,7 +292,6 @@ OWNERSHIP_LAYER_LAUNCHER_HASH = OWNERSHIP_LAYER_LAUNCHER.get_tree_hash()
288
292
  ########################
289
293
  # Verified Credentials #
290
294
  ########################
291
- _T_VerifiedCredential = TypeVar("_T_VerifiedCredential", bound="VerifiedCredential")
292
295
 
293
296
 
294
297
  @streamable
@@ -310,14 +313,14 @@ class VerifiedCredential(Streamable):
310
313
 
311
314
  @classmethod
312
315
  def launch(
313
- cls: type[_T_VerifiedCredential],
316
+ cls,
314
317
  origin_coins: list[Coin],
315
318
  provider_id: bytes32,
316
319
  new_inner_puzzle_hash: bytes32,
317
320
  memos: list[bytes32],
318
321
  fee: uint64 = uint64(0),
319
322
  extra_conditions: tuple[Condition, ...] = tuple(),
320
- ) -> tuple[list[Program], list[CoinSpend], _T_VerifiedCredential]:
323
+ ) -> tuple[list[Program], list[CoinSpend], Self]:
321
324
  """
322
325
  Launch a VC.
323
326
 
@@ -537,7 +540,7 @@ class VerifiedCredential(Streamable):
537
540
  return True, ""
538
541
 
539
542
  @classmethod
540
- def get_next_from_coin_spend(cls: type[_T_VerifiedCredential], parent_spend: CoinSpend) -> _T_VerifiedCredential:
543
+ def get_next_from_coin_spend(cls, parent_spend: CoinSpend) -> Self:
541
544
  """
542
545
  Given a coin spend, this will return the next VC that was create as an output of that spend. This is the main
543
546
  method to use when syncing. If a spend has been identified as having a VC puzzle reveal, running this method
@@ -548,7 +551,7 @@ class VerifiedCredential(Streamable):
548
551
 
549
552
  # BEGIN CODE
550
553
  parent_coin: Coin = parent_spend.coin
551
- solution: Program = parent_spend.solution.to_program()
554
+ solution = Program.from_serialized(parent_spend.solution)
552
555
 
553
556
  singleton: UncurriedPuzzle = uncurry_puzzle(parent_spend.puzzle_reveal)
554
557
  launcher_id: bytes32 = bytes32(singleton.args.at("frf").as_atom())
@@ -606,7 +609,7 @@ class VerifiedCredential(Streamable):
606
609
  parent_proof_hash=None if parent_proof_hash == Program.to(None) else parent_proof_hash,
607
610
  )
608
611
 
609
- new_vc: _T_VerifiedCredential = cls(
612
+ new_vc: Self = cls(
610
613
  coin,
611
614
  singleton_lineage_proof,
612
615
  eml_lineage_proof,
@@ -818,3 +821,42 @@ class VerifiedCredential(Streamable):
818
821
  slightly_incomplete_vc.coin.amount,
819
822
  ),
820
823
  )
824
+
825
+
826
+ # This class is sort of unparadigmatic as an outer puzzle.
827
+ # It lives somewhere between outer puzzle and inner puzzle, but the most convenient
828
+ # way to present it in this wallet is as an outer puzzle.
829
+ # This may lead to some peculiarities if use cases are to be expanded beyond simply using this
830
+ # inside of a CAT.
831
+ @dataclass(frozen=True)
832
+ class RevocationOuterPuzzle:
833
+ def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
834
+ args = match_revocation_layer(puzzle)
835
+ if args is None:
836
+ return None
837
+ hidden_puzzle_hash, _ = args
838
+ constructor_dict: dict[str, Any] = {
839
+ "type": "revocation layer",
840
+ "hidden_puzzle_hash": "0x" + hidden_puzzle_hash.hex(),
841
+ }
842
+ return PuzzleInfo(constructor_dict)
843
+
844
+ def get_inner_puzzle(
845
+ self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
846
+ ) -> Optional[Program]:
847
+ if solution is None:
848
+ raise ValueError("Cannot get_inner_puzzle of revocation layer without solution")
849
+
850
+ return solution.at("rf")
851
+
852
+ def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Optional[Program]:
853
+ return solution.at("rrf")
854
+
855
+ def asset_id(self, constructor: PuzzleInfo) -> Optional[bytes32]:
856
+ return bytes32(constructor["hidden_puzzle_hash"])
857
+
858
+ def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
859
+ return create_revocation_layer(constructor["hidden_puzzle_hash"], inner_puzzle.get_tree_hash())
860
+
861
+ def solve(self, constructor: PuzzleInfo, solver: Solver, inner_puzzle: Program, inner_solution: Program) -> Program:
862
+ return solve_revocation_layer(inner_puzzle, inner_solution) # deliberately no support for hidden puzzle spends
@@ -2,11 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
4
  from functools import cmp_to_key
5
- from typing import Optional, TypeVar
5
+ from typing import Optional
6
6
 
7
7
  from aiosqlite import Row
8
8
  from chia_rs.sized_bytes import bytes32
9
9
  from chia_rs.sized_ints import uint32, uint64
10
+ from typing_extensions import Self
10
11
 
11
12
  from chia.types.blockchain_format.coin import Coin
12
13
  from chia.types.blockchain_format.program import Program
@@ -81,9 +82,6 @@ class VCProofs:
81
82
  return new_tree
82
83
 
83
84
 
84
- _T_VCStore = TypeVar("_T_VCStore", bound="VCStore")
85
-
86
-
87
85
  @streamable
88
86
  @dataclasses.dataclass(frozen=True)
89
87
  class VCRecord(Streamable):
@@ -114,7 +112,7 @@ class VCStore:
114
112
  db_wrapper: DBWrapper2
115
113
 
116
114
  @classmethod
117
- async def create(cls: type[_T_VCStore], db_wrapper: DBWrapper2) -> _T_VCStore:
115
+ async def create(cls, db_wrapper: DBWrapper2) -> Self:
118
116
  self = cls()
119
117
 
120
118
  self.db_wrapper = db_wrapper
@@ -5,18 +5,17 @@ import time
5
5
  import traceback
6
6
  from typing import TYPE_CHECKING, Optional, TypeVar, Union
7
7
 
8
- from chia_rs import G1Element, G2Element
8
+ from chia_rs import CoinSpend, CoinState, G1Element, G2Element
9
9
  from chia_rs.sized_bytes import bytes32
10
10
  from chia_rs.sized_ints import uint32, uint64, uint128
11
- from clvm.casts import int_to_bytes
12
11
  from typing_extensions import Unpack
13
12
 
14
- from chia.protocols.wallet_protocol import CoinState
15
13
  from chia.server.ws_connection import WSChiaConnection
16
14
  from chia.types.blockchain_format.coin import Coin, coin_as_list
17
15
  from chia.types.blockchain_format.program import Program
18
16
  from chia.types.blockchain_format.serialized_program import SerializedProgram
19
- from chia.types.coin_spend import CoinSpend, make_spend
17
+ from chia.types.coin_spend import make_spend
18
+ from chia.util.casts import int_to_bytes
20
19
  from chia.util.hash import std_hash
21
20
  from chia.util.streamable import Streamable
22
21
  from chia.wallet.conditions import (
@@ -187,9 +186,7 @@ class VCWallet:
187
186
  if len(coins) == 0:
188
187
  raise ValueError("Cannot find a coin to mint the verified credential.") # pragma: no cover
189
188
  if inner_puzzle_hash is None: # pragma: no cover
190
- inner_puzzle_hash = await self.standard_wallet.get_puzzle_hash(
191
- new=not action_scope.config.tx_config.reuse_puzhash
192
- )
189
+ inner_puzzle_hash = await action_scope.get_puzzle_hash(self.wallet_state_manager)
193
190
  dpuzs, coin_spends, vc = VerifiedCredential.launch(
194
191
  coins,
195
192
  provider_did,
@@ -395,7 +392,7 @@ class VCWallet:
395
392
  else:
396
393
  await self.generate_signed_transaction(
397
394
  [uint64(1)],
398
- [await self.standard_wallet.get_puzzle_hash(new=not action_scope.config.tx_config.reuse_puzhash)],
395
+ [await action_scope.get_puzzle_hash(self.wallet_state_manager)],
399
396
  action_scope,
400
397
  fee,
401
398
  vc_id=vc.launcher_id,
@@ -544,15 +541,15 @@ class VCWallet:
544
541
  spend_to_fix: CoinSpend = spends_to_fix[crcat_spend.crcat.coin.name()]
545
542
  other_spends.append(
546
543
  spend_to_fix.replace(
547
- solution=SerializedProgram.from_program(
548
- spend_to_fix.solution.to_program().replace(
549
- ff=coin_args[coin_name][0],
550
- frf=Program.to(None), # not general
551
- frrf=bytes32.from_hexstr(coin_args[coin_name][2]),
552
- frrrf=bytes32.from_hexstr(coin_args[coin_name][3]),
553
- frrrrf=bytes32.from_hexstr(coin_args[coin_name][4]),
554
- )
555
- ),
544
+ solution=Program.from_serialized(spend_to_fix.solution)
545
+ .replace(
546
+ ff=coin_args[coin_name][0],
547
+ frf=Program.to(None), # not general
548
+ frrf=bytes32.from_hexstr(coin_args[coin_name][2]),
549
+ frrrf=bytes32.from_hexstr(coin_args[coin_name][3]),
550
+ frrrrf=bytes32.from_hexstr(coin_args[coin_name][4]),
551
+ )
552
+ .to_serialized(),
556
553
  )
557
554
  )
558
555
  else:
@@ -564,11 +561,7 @@ class VCWallet:
564
561
  for launcher_id, vc in vcs.items():
565
562
  await self.generate_signed_transaction(
566
563
  [uint64(1)],
567
- [
568
- await self.standard_wallet.get_puzzle_hash(
569
- new=not inner_action_scope.config.tx_config.reuse_puzhash
570
- )
571
- ],
564
+ [await action_scope.get_puzzle_hash(self.wallet_state_manager)],
572
565
  inner_action_scope,
573
566
  vc_id=launcher_id,
574
567
  extra_conditions=(