chia-blockchain 2.5.4rc2__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 +47 -45
  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.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc2.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.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,274 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from dataclasses import dataclass
5
+ from enum import IntEnum
6
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
7
+
8
+ from chia_rs import G1Element
9
+ from chia_rs.sized_bytes import bytes32
10
+ from chia_rs.sized_ints import uint8, uint16
11
+ from typing_extensions import Self
12
+
13
+ from chia.types.blockchain_format.coin import Coin
14
+ from chia.types.blockchain_format.program import Program
15
+ from chia.util.streamable import Streamable, streamable
16
+ from chia.wallet.cat_wallet.cat_constants import DEFAULT_CATS
17
+ from chia.wallet.cat_wallet.cat_info import CATCoinData, RCATInfo
18
+ from chia.wallet.cat_wallet.cat_utils import (
19
+ CAT_MOD,
20
+ CAT_MOD_HASH,
21
+ CAT_MOD_HASH_HASH,
22
+ QUOTED_CAT_MOD_HASH,
23
+ construct_cat_puzzle,
24
+ )
25
+ from chia.wallet.cat_wallet.cat_wallet import CATWallet
26
+ from chia.wallet.cat_wallet.lineage_store import CATLineageStore
27
+ from chia.wallet.conditions import (
28
+ Condition,
29
+ CreateCoin,
30
+ )
31
+ from chia.wallet.derivation_record import DerivationRecord
32
+ from chia.wallet.lineage_proof import LineageProof
33
+ from chia.wallet.outer_puzzles import AssetType
34
+ from chia.wallet.puzzle_drivers import PuzzleInfo
35
+ from chia.wallet.util.curry_and_treehash import curry_and_treehash
36
+ from chia.wallet.util.wallet_types import WalletType
37
+ from chia.wallet.vc_wallet.vc_drivers import create_revocation_layer, solve_revocation_layer
38
+ from chia.wallet.wallet import Wallet
39
+ from chia.wallet.wallet_info import WalletInfo
40
+ from chia.wallet.wallet_protocol import WalletProtocol
41
+
42
+ if TYPE_CHECKING:
43
+ from chia.wallet.wallet_state_manager import WalletStateManager
44
+
45
+
46
+ class RCATVersion(IntEnum):
47
+ V1 = uint16(1)
48
+
49
+
50
+ @streamable
51
+ @dataclass(frozen=True)
52
+ class RCATMetadata(Streamable):
53
+ lineage_proof: LineageProof
54
+ inner_puzzle_hash: bytes32
55
+
56
+
57
+ class RCATWallet(CATWallet):
58
+ if TYPE_CHECKING:
59
+ _protocol_check: ClassVar[WalletProtocol[CATCoinData]] = cast("RCATWallet", None)
60
+
61
+ wallet_state_manager: WalletStateManager
62
+ log: logging.Logger
63
+ wallet_info: WalletInfo
64
+ cat_info: RCATInfo
65
+ standard_wallet: Wallet
66
+ lineage_store: CATLineageStore
67
+ wallet_type: ClassVar[WalletType] = WalletType.RCAT
68
+ wallet_info_type: ClassVar[type[RCATInfo]] = RCATInfo
69
+
70
+ # this is a legacy method and is not available on R-CAT wallets
71
+ create_new_cat_wallet = None # type: ignore[assignment]
72
+
73
+ @staticmethod
74
+ def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
75
+ return f"Revocable-CAT {limitations_program_hash_hex[:16]}..."
76
+
77
+ # We need to override this with a different signature.
78
+ # It's not immediately clear what is proper here, likely needs a bit of a refactor.
79
+ @classmethod
80
+ async def get_or_create_wallet_for_cat( # type: ignore[override]
81
+ cls,
82
+ wallet_state_manager: WalletStateManager,
83
+ wallet: Wallet,
84
+ limitations_program_hash_hex: str,
85
+ hidden_puzzle_hash: bytes32,
86
+ name: Optional[str] = None,
87
+ ) -> Self:
88
+ self = cls()
89
+ self.standard_wallet = wallet
90
+ self.log = logging.getLogger(__name__)
91
+
92
+ limitations_program_hash_hex = bytes32.from_hexstr(limitations_program_hash_hex).hex() # Normalize the format
93
+
94
+ for id, w in wallet_state_manager.wallets.items():
95
+ if w.type() == cls.type():
96
+ assert isinstance(w, cls)
97
+ if w.get_asset_id() == limitations_program_hash_hex:
98
+ self.log.warning("Not creating wallet for already existing CAT wallet")
99
+ return w
100
+
101
+ self.wallet_state_manager = wallet_state_manager
102
+ if limitations_program_hash_hex in DEFAULT_CATS:
103
+ cat_info = DEFAULT_CATS[limitations_program_hash_hex]
104
+ name = cat_info["name"]
105
+ elif name is None:
106
+ name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
107
+
108
+ limitations_program_hash = bytes32.from_hexstr(limitations_program_hash_hex)
109
+ self.cat_info = cls.wallet_info_type(limitations_program_hash, None, hidden_puzzle_hash)
110
+ info_as_string = bytes(self.cat_info).hex()
111
+ self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, cls.wallet_type, info_as_string)
112
+
113
+ self.lineage_store = await CATLineageStore.create(self.wallet_state_manager.db_wrapper, self.get_asset_id())
114
+ # Inherited from duplicating parent
115
+ await self.wallet_state_manager.add_new_wallet(self)
116
+
117
+ delete: bool = False
118
+ for state in await self.wallet_state_manager.interested_store.get_unacknowledged_states_for_asset_id(
119
+ limitations_program_hash
120
+ ):
121
+ new_peer = self.wallet_state_manager.wallet_node.get_full_node_peer()
122
+ if new_peer is not None:
123
+ delete = True
124
+ peer_id: bytes32 = new_peer.peer_node_id
125
+ await self.wallet_state_manager.retry_store.add_state(state[0], peer_id, state[1])
126
+
127
+ if delete:
128
+ await self.wallet_state_manager.interested_store.delete_unacknowledged_states_for_asset_id(
129
+ limitations_program_hash
130
+ )
131
+
132
+ return self
133
+
134
+ @classmethod
135
+ async def create_from_puzzle_info(
136
+ cls,
137
+ wallet_state_manager: WalletStateManager,
138
+ wallet: Wallet,
139
+ puzzle_driver: PuzzleInfo,
140
+ name: Optional[str] = None,
141
+ # We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
142
+ potential_subclasses: dict[AssetType, Any] = {},
143
+ ) -> Any:
144
+ rev_layer: Optional[PuzzleInfo] = puzzle_driver.also()
145
+ if rev_layer is None:
146
+ raise ValueError("create_from_puzzle_info called on RCATWallet with a non R-CAT puzzle driver")
147
+ return await cls.get_or_create_wallet_for_cat(
148
+ wallet_state_manager,
149
+ wallet,
150
+ puzzle_driver["tail"].hex(),
151
+ bytes32(rev_layer["hidden_puzzle_hash"]),
152
+ name,
153
+ )
154
+
155
+ @property
156
+ def cost_of_single_tx(self) -> int:
157
+ return 78000000 # Estimate measured in testing
158
+
159
+ @classmethod
160
+ async def convert_to_revocable(
161
+ cls,
162
+ cat_wallet: CATWallet,
163
+ hidden_puzzle_hash: bytes32,
164
+ ) -> bool:
165
+ if not cat_wallet.lineage_store.is_empty():
166
+ cat_wallet.log.error("Received a revocable CAT to a CAT wallet that already has CATs")
167
+ return False
168
+ replace_self = cls()
169
+ replace_self.standard_wallet = cat_wallet.standard_wallet
170
+ replace_self.log = logging.getLogger(cat_wallet.get_name())
171
+ replace_self.log.info(f"Converting CAT wallet {cat_wallet.id()} to R-CAT wallet")
172
+ replace_self.wallet_state_manager = cat_wallet.wallet_state_manager
173
+ replace_self.lineage_store = cat_wallet.lineage_store
174
+ replace_self.cat_info = cls.wallet_info_type(
175
+ cat_wallet.cat_info.limitations_program_hash, None, hidden_puzzle_hash
176
+ )
177
+ await cat_wallet.wallet_state_manager.user_store.update_wallet(
178
+ WalletInfo(
179
+ cat_wallet.id(), cat_wallet.get_name(), uint8(cls.wallet_type.value), bytes(replace_self.cat_info).hex()
180
+ )
181
+ )
182
+ updated_wallet_info = await cat_wallet.wallet_state_manager.user_store.get_wallet_by_id(cat_wallet.id())
183
+ assert updated_wallet_info is not None
184
+ replace_self.wallet_info = updated_wallet_info
185
+
186
+ cat_wallet.wallet_state_manager.wallets[cat_wallet.id()] = replace_self
187
+ await cat_wallet.wallet_state_manager.puzzle_store.delete_wallet(cat_wallet.id())
188
+ result = await cat_wallet.wallet_state_manager.create_more_puzzle_hashes()
189
+ await result.commit(cat_wallet.wallet_state_manager)
190
+ return True
191
+
192
+ def puzzle_for_pk(self, pubkey: G1Element) -> Program:
193
+ inner_puzzle = create_revocation_layer(
194
+ self.cat_info.hidden_puzzle_hash, self.standard_wallet.puzzle_hash_for_pk(pubkey)
195
+ )
196
+ cat_puzzle: Program = construct_cat_puzzle(CAT_MOD, self.cat_info.limitations_program_hash, inner_puzzle)
197
+ return cat_puzzle
198
+
199
+ def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32:
200
+ inner_puzzle_hash = create_revocation_layer(
201
+ self.cat_info.hidden_puzzle_hash, self.standard_wallet.puzzle_hash_for_pk(pubkey)
202
+ ).get_tree_hash()
203
+ limitations_program_hash_hash = Program.to(self.cat_info.limitations_program_hash).get_tree_hash()
204
+ return curry_and_treehash(
205
+ QUOTED_CAT_MOD_HASH, CAT_MOD_HASH_HASH, limitations_program_hash_hash, inner_puzzle_hash
206
+ )
207
+
208
+ async def inner_puzzle_for_cat_puzhash(self, cat_hash: bytes32) -> Program:
209
+ return create_revocation_layer(
210
+ self.cat_info.hidden_puzzle_hash, (await super().inner_puzzle_for_cat_puzhash(cat_hash)).get_tree_hash()
211
+ )
212
+
213
+ async def make_inner_solution(
214
+ self,
215
+ coin: Coin,
216
+ primaries: list[CreateCoin],
217
+ conditions: tuple[Condition, ...] = tuple(),
218
+ ) -> Program:
219
+ record: Optional[
220
+ DerivationRecord
221
+ ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(coin.puzzle_hash)
222
+ if record is None:
223
+ raise RuntimeError(f"Missing Derivation Record for CAT puzzle_hash {coin.puzzle_hash}")
224
+ return solve_revocation_layer(
225
+ self.standard_wallet.puzzle_for_pk(record.pubkey),
226
+ (await super().make_inner_solution(coin, primaries=primaries, conditions=conditions)),
227
+ )
228
+
229
+ async def match_puzzle_info(self, puzzle_driver: PuzzleInfo) -> bool:
230
+ if (
231
+ AssetType(puzzle_driver.type()) == AssetType.CAT
232
+ and puzzle_driver["tail"] == self.cat_info.limitations_program_hash
233
+ ):
234
+ inner_puzzle_driver: Optional[PuzzleInfo] = puzzle_driver.also()
235
+ if inner_puzzle_driver is None:
236
+ raise ValueError("Malformed puzzle driver passed to RCATWallet.match_puzzle_info")
237
+ return (
238
+ AssetType(inner_puzzle_driver.type()) == AssetType.REVOCATION_LAYER
239
+ and bytes32(inner_puzzle_driver["hidden_puzzle_hash"]) == self.cat_info.hidden_puzzle_hash
240
+ )
241
+ return False
242
+
243
+ async def get_puzzle_info(self, asset_id: bytes32) -> PuzzleInfo:
244
+ return PuzzleInfo(
245
+ {
246
+ "type": AssetType.CAT.value,
247
+ "tail": "0x" + self.get_asset_id(),
248
+ "also": {
249
+ "type": AssetType.REVOCATION_LAYER.value,
250
+ "hidden_puzzle_hash": "0x" + self.cat_info.hidden_puzzle_hash.hex(),
251
+ },
252
+ }
253
+ )
254
+
255
+ async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool:
256
+ """
257
+ This matches coins that are RCATs with the hint as the inner puzzle
258
+ """
259
+
260
+ hint_inner_hash: bytes32 = create_revocation_layer(
261
+ self.cat_info.hidden_puzzle_hash,
262
+ hint,
263
+ ).get_tree_hash()
264
+ if (
265
+ construct_cat_puzzle(
266
+ Program.to(CAT_MOD_HASH),
267
+ self.cat_info.limitations_program_hash,
268
+ hint_inner_hash,
269
+ mod_code_hash=CAT_MOD_HASH_HASH,
270
+ ).get_tree_hash_precalc(hint, CAT_MOD_HASH, CAT_MOD_HASH_HASH, hint_inner_hash)
271
+ == coin.puzzle_hash
272
+ ):
273
+ return True
274
+ return False
chia/wallet/conditions.py CHANGED
@@ -8,10 +8,11 @@ from typing import Any, ClassVar, Optional, TypeVar, Union, final, get_type_hint
8
8
  from chia_rs import Coin, G1Element
9
9
  from chia_rs.sized_bytes import bytes32
10
10
  from chia_rs.sized_ints import uint8, uint32, uint64
11
- from clvm.casts import int_from_bytes, int_to_bytes
11
+ from typing_extensions import Self
12
12
 
13
13
  from chia.types.blockchain_format.program import Program
14
14
  from chia.types.condition_opcodes import ConditionOpcode
15
+ from chia.util.casts import int_from_bytes, int_to_bytes
15
16
  from chia.util.hash import std_hash
16
17
  from chia.util.streamable import Streamable, streamable
17
18
 
@@ -237,7 +238,7 @@ class CreateCoin(Condition):
237
238
  return condition
238
239
 
239
240
  @classmethod
240
- def from_program(cls: type[_T_CreateCoin], program: Program) -> _T_CreateCoin:
241
+ def from_program(cls, program: Program) -> Self:
241
242
  potential_memos: Program = program.at("rrr")
242
243
  return cls(
243
244
  bytes32(program.at("rf").as_atom()),
@@ -253,9 +254,6 @@ class CreateCoin(Condition):
253
254
  return [self.puzzle_hash, self.amount, self.memos]
254
255
 
255
256
 
256
- _T_CreateCoin = TypeVar("_T_CreateCoin", bound=CreateCoin)
257
-
258
-
259
257
  @final
260
258
  @streamable
261
259
  @dataclass(frozen=True)
@@ -541,9 +539,6 @@ class MessageParticipant(Streamable):
541
539
  )
542
540
 
543
541
 
544
- _T_MessageCondition = TypeVar("_T_MessageCondition", bound="SendMessage")
545
-
546
-
547
542
  @streamable
548
543
  @dataclass(frozen=True)
549
544
  class SendMessage(Condition):
@@ -564,7 +559,7 @@ class SendMessage(Condition):
564
559
 
565
560
  def __post_init__(self) -> None:
566
561
  if self.mode_integer is None and (self.sender is None or self.receiver is None):
567
- raise ValueError("Must specify either mode_integer or both sender and reciever")
562
+ raise ValueError("Must specify either mode_integer or both sender and receiver")
568
563
 
569
564
  if self.mode_integer is not None and self.sender is not None:
570
565
  assert self.mode_integer >> 3 == self.sender.mode, (
@@ -607,7 +602,7 @@ class SendMessage(Condition):
607
602
  return condition
608
603
 
609
604
  @classmethod
610
- def from_program(cls: type[_T_MessageCondition], program: Program) -> _T_MessageCondition:
605
+ def from_program(cls, program: Program) -> Self:
611
606
  full_mode = uint8(program.at("rf").as_int())
612
607
  var_args = list(program.at("rrr").as_iter())
613
608
  return cls(
@@ -8,7 +8,7 @@ from chia_puzzles_py.programs import P2_PARENT as P2_PARENT_BYTES
8
8
  from chia_rs.sized_bytes import bytes32
9
9
  from chia_rs.sized_ints import uint64
10
10
 
11
- from chia.types.blockchain_format.program import INFINITE_COST, Program
11
+ from chia.types.blockchain_format.program import INFINITE_COST, Program, run_with_cost, uncurry
12
12
  from chia.types.blockchain_format.serialized_program import SerializedProgram
13
13
  from chia.types.condition_opcodes import ConditionOpcode
14
14
  from chia.wallet.nft_wallet.nft_puzzle_utils import create_nft_layer_puzzle_with_curry_params
@@ -45,9 +45,9 @@ def match_dl_singleton(puzzle: Union[Program, SerializedProgram]) -> tuple[bool,
45
45
  """
46
46
  Given a puzzle test if it's a CAT and, if it is, return the curried arguments
47
47
  """
48
- mod, singleton_curried_args = puzzle.uncurry()
48
+ mod, singleton_curried_args = uncurry(puzzle)
49
49
  if mod == SINGLETON_TOP_LAYER_MOD:
50
- mod, dl_curried_args = singleton_curried_args.at("rf").uncurry()
50
+ mod, dl_curried_args = uncurry(singleton_curried_args.at("rf"))
51
51
  if mod == NFT_STATE_LAYER_MOD and dl_curried_args.at("rrf") == ACS_MU_PH:
52
52
  launcher_id = singleton_curried_args.at("frf")
53
53
  root = dl_curried_args.at("rff")
@@ -99,7 +99,7 @@ def get_mirror_info(
99
99
  parent_puzzle: Union[Program, SerializedProgram], parent_solution: Union[Program, SerializedProgram]
100
100
  ) -> tuple[bytes32, list[bytes]]:
101
101
  assert type(parent_puzzle) is type(parent_solution)
102
- _, conditions = parent_puzzle.run_with_cost(INFINITE_COST, parent_solution)
102
+ _, conditions = run_with_cost(parent_puzzle, INFINITE_COST, parent_solution)
103
103
  for condition in conditions.as_iter():
104
104
  if (
105
105
  condition.first().as_python() == ConditionOpcode.CREATE_COIN
@@ -7,6 +7,7 @@ from chia_rs import G1Element
7
7
  from chia_rs.sized_bytes import bytes32
8
8
  from chia_rs.sized_ints import uint32
9
9
 
10
+ from chia.util.streamable import Streamable, streamable
10
11
  from chia.wallet.util.wallet_types import WalletType
11
12
 
12
13
 
@@ -28,3 +29,35 @@ class DerivationRecord:
28
29
  def pubkey(self) -> G1Element:
29
30
  assert isinstance(self._pubkey, G1Element)
30
31
  return self._pubkey
32
+
33
+
34
+ @streamable
35
+ @dataclass(frozen=True)
36
+ class StreamableDerivationRecord(Streamable):
37
+ index: uint32
38
+ puzzle_hash: bytes32
39
+ pubkey: bytes
40
+ wallet_type: uint32
41
+ wallet_id: uint32
42
+ hardened: bool
43
+
44
+ @classmethod
45
+ def from_standard(cls, record: DerivationRecord) -> StreamableDerivationRecord:
46
+ return cls(
47
+ record.index,
48
+ record.puzzle_hash,
49
+ bytes(record._pubkey),
50
+ uint32(record.wallet_type.value),
51
+ record.wallet_id,
52
+ record.hardened,
53
+ )
54
+
55
+ def to_standard(self) -> DerivationRecord:
56
+ return DerivationRecord(
57
+ self.index,
58
+ self.puzzle_hash,
59
+ G1Element.from_bytes(self.pubkey),
60
+ WalletType(self.wallet_type),
61
+ self.wallet_id,
62
+ self.hardened,
63
+ )
@@ -6,7 +6,7 @@ from chia_rs import AugSchemeMPL, G1Element, PrivateKey
6
6
  from chia_rs.sized_bytes import bytes32
7
7
  from chia_rs.sized_ints import uint32
8
8
 
9
- from chia.consensus.coinbase import create_puzzlehash_for_pk
9
+ from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_hash_for_pk
10
10
 
11
11
  # EIP 2334 bls key derivation
12
12
  # https://eips.ethereum.org/EIPS/eip-2334
@@ -131,8 +131,8 @@ def match_address_to_sk(
131
131
 
132
132
  for i in range(max_ph_to_search):
133
133
  phs = [
134
- create_puzzlehash_for_pk(master_sk_to_wallet_sk(sk, uint32(i)).get_g1()),
135
- create_puzzlehash_for_pk(master_sk_to_wallet_sk_unhardened(sk, uint32(i)).get_g1()),
134
+ puzzle_hash_for_pk(master_sk_to_wallet_sk(sk, uint32(i)).get_g1()),
135
+ puzzle_hash_for_pk(master_sk_to_wallet_sk_unhardened(sk, uint32(i)).get_g1()),
136
136
  ]
137
137
 
138
138
  for address in search_list:
@@ -3,14 +3,23 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass
4
4
  from typing import Optional
5
5
 
6
+ from chia_rs import CoinState
6
7
  from chia_rs.sized_bytes import bytes32
7
8
  from chia_rs.sized_ints import uint16, uint64
8
9
 
9
- from chia.protocols.wallet_protocol import CoinState
10
10
  from chia.types.blockchain_format.coin import Coin
11
- from chia.types.blockchain_format.program import Program
11
+ from chia.types.blockchain_format.program import NIL, Program
12
12
  from chia.util.streamable import Streamable, streamable
13
13
  from chia.wallet.lineage_proof import LineageProof
14
+ from chia.wallet.util.curry_and_treehash import NIL_TREEHASH
15
+
16
+
17
+ def did_recovery_is_nil(recovery_program: Program) -> bool:
18
+ # cannot use set as not hashable
19
+ if recovery_program in (NIL, NIL_TREEHASH): # noqa: PLR6201
20
+ return True
21
+ else:
22
+ return False
14
23
 
15
24
 
16
25
  @streamable
@@ -32,7 +41,7 @@ class DIDInfo(Streamable):
32
41
  @dataclass(frozen=True)
33
42
  class DIDCoinData(Streamable):
34
43
  p2_puzzle: Program
35
- recovery_list_hash: bytes32
44
+ recovery_list_hash: Optional[bytes32]
36
45
  num_verification: uint16
37
46
  singleton_struct: Program
38
47
  metadata: Program