chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc2__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 +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 +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 +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.5rc2.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.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.5rc2.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/entry_points.txt +0 -0
@@ -56,10 +56,8 @@ from chia.data_layer.download_data import (
56
56
  write_files_for_root,
57
57
  )
58
58
  from chia.data_layer.singleton_record import SingletonRecord
59
+ from chia.protocols.outbound_message import NodeType
59
60
  from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
60
- from chia.rpc.wallet_request_types import LogIn
61
- from chia.rpc.wallet_rpc_client import WalletRpcClient
62
- from chia.server.outbound_message import NodeType
63
61
  from chia.server.server import ChiaServer
64
62
  from chia.server.ws_connection import WSChiaConnection
65
63
  from chia.util.async_pool import Job, QueuedAsyncPool
@@ -69,6 +67,32 @@ from chia.wallet.trade_record import TradeRecord
69
67
  from chia.wallet.trading.offer import Offer as TradingOffer
70
68
  from chia.wallet.transaction_record import TransactionRecord
71
69
  from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
70
+ from chia.wallet.wallet_request_types import (
71
+ CreateNewDL,
72
+ DLDeleteMirror,
73
+ DLGetMirrors,
74
+ DLHistory,
75
+ DLLatestSingleton,
76
+ DLNewMirror,
77
+ DLStopTracking,
78
+ DLTrackNew,
79
+ DLUpdateMultiple,
80
+ DLUpdateMultipleUpdates,
81
+ DLUpdateRoot,
82
+ LauncherRootPair,
83
+ LogIn,
84
+ )
85
+ from chia.wallet.wallet_rpc_client import WalletRpcClient
86
+
87
+
88
+ def server_files_path_from_config(config: dict[str, Any], root_path: Path) -> Path:
89
+ server_files_replaced: Path = path_from_root(
90
+ root_path,
91
+ config.get("server_files_location", "data_layer/db/server_files_location_CHALLENGE").replace(
92
+ "CHALLENGE", config["selected_network"]
93
+ ),
94
+ )
95
+ return server_files_replaced
72
96
 
73
97
 
74
98
  async def get_plugin_info(plugin_remote: PluginRemote) -> tuple[PluginRemote, dict[str, Any]]:
@@ -162,9 +186,7 @@ class DataLayer:
162
186
  # need this.
163
187
  name = None
164
188
 
165
- server_files_replaced: str = config.get(
166
- "server_files_location", "data_layer/db/server_files_location_CHALLENGE"
167
- ).replace("CHALLENGE", config["selected_network"])
189
+ server_files_replaced = server_files_path_from_config(config, root_path)
168
190
 
169
191
  db_path_replaced: str = config["database_path"].replace("CHALLENGE", config["selected_network"])
170
192
 
@@ -174,7 +196,7 @@ class DataLayer:
174
196
  wallet_rpc_init=wallet_rpc_init,
175
197
  log=logging.getLogger(name if name is None else __name__),
176
198
  db_path=path_from_root(root_path, db_path_replaced),
177
- server_files_location=path_from_root(root_path, server_files_replaced),
199
+ server_files_location=server_files_replaced,
178
200
  downloaders=downloaders,
179
201
  uploaders=uploaders,
180
202
  maximum_full_file_count=config.get("maximum_full_file_count", 1),
@@ -240,12 +262,12 @@ class DataLayer:
240
262
  return result.fingerprint
241
263
 
242
264
  async def create_store(self, fee: uint64, root: bytes32 = bytes32.zeros) -> tuple[list[TransactionRecord], bytes32]:
243
- txs, store_id = await self.wallet_rpc.create_new_dl(root, fee)
244
- res = await self.data_store.create_tree(store_id=store_id)
265
+ create_res = await self.wallet_rpc.create_new_dl(CreateNewDL(root=root, fee=fee, push=True), DEFAULT_TX_CONFIG)
266
+ res = await self.data_store.create_tree(store_id=create_res.launcher_id)
245
267
  if res is None:
246
268
  self.log.fatal("failed creating store")
247
269
  self.initialized = True
248
- return txs, store_id
270
+ return create_res.transactions, create_res.launcher_id
249
271
 
250
272
  async def batch_update(
251
273
  self,
@@ -293,13 +315,15 @@ class DataLayer:
293
315
  await self.data_store.clean_node_table()
294
316
 
295
317
  if submit_on_chain:
296
- update_dictionary: dict[bytes32, bytes32] = {}
318
+ updates: list[LauncherRootPair] = []
297
319
  for store_id in store_ids:
298
320
  await self._update_confirmation_status(store_id=store_id)
299
321
  root_hash = await self._get_publishable_root_hash(store_id=store_id)
300
- update_dictionary[store_id] = root_hash
301
- transaction_records = await self.wallet_rpc.dl_update_multiple(update_dictionary=update_dictionary, fee=fee)
302
- return transaction_records
322
+ updates.append(LauncherRootPair(store_id, root_hash))
323
+ response = await self.wallet_rpc.dl_update_multiple(
324
+ DLUpdateMultiple(updates=DLUpdateMultipleUpdates(updates), fee=fee), DEFAULT_TX_CONFIG
325
+ )
326
+ return response.transactions
303
327
  else:
304
328
  return []
305
329
 
@@ -321,15 +345,17 @@ class DataLayer:
321
345
 
322
346
  async def submit_all_pending_roots(self, fee: uint64) -> list[TransactionRecord]:
323
347
  pending_roots = await self.data_store.get_all_pending_batches_roots()
324
- update_dictionary: dict[bytes32, bytes32] = {}
348
+ updates: list[LauncherRootPair] = []
325
349
  if len(pending_roots) == 0:
326
350
  raise Exception("No pending roots found to submit")
327
351
  for pending_root in pending_roots:
328
352
  root_hash = pending_root.node_hash if pending_root.node_hash is not None else self.none_bytes
329
- update_dictionary[pending_root.store_id] = root_hash
353
+ updates.append(LauncherRootPair(pending_root.store_id, root_hash))
330
354
  await self.data_store.change_root_status(pending_root, Status.PENDING)
331
- transaction_records = await self.wallet_rpc.dl_update_multiple(update_dictionary=update_dictionary, fee=fee)
332
- return transaction_records
355
+ response = await self.wallet_rpc.dl_update_multiple(
356
+ DLUpdateMultiple(updates=DLUpdateMultipleUpdates(updates), fee=fee), DEFAULT_TX_CONFIG
357
+ )
358
+ return response.transactions
333
359
 
334
360
  async def batch_insert(
335
361
  self,
@@ -371,11 +397,17 @@ class DataLayer:
371
397
  ) -> TransactionRecord:
372
398
  await self._update_confirmation_status(store_id=store_id)
373
399
  root_hash = await self._get_publishable_root_hash(store_id=store_id)
374
- transaction_record = await self.wallet_rpc.dl_update_root(
375
- launcher_id=store_id,
376
- new_root=root_hash,
377
- fee=fee,
378
- )
400
+ transaction_record = (
401
+ await self.wallet_rpc.dl_update_root(
402
+ DLUpdateRoot(
403
+ launcher_id=store_id,
404
+ new_root=root_hash,
405
+ fee=fee,
406
+ push=True,
407
+ ),
408
+ DEFAULT_TX_CONFIG,
409
+ )
410
+ ).tx_record
379
411
  return transaction_record
380
412
 
381
413
  async def get_key_value_hash(
@@ -455,7 +487,7 @@ class DataLayer:
455
487
  return res
456
488
 
457
489
  async def get_root(self, store_id: bytes32) -> Optional[SingletonRecord]:
458
- latest = await self.wallet_rpc.dl_latest_singleton(store_id, True)
490
+ latest = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
459
491
  if latest is None:
460
492
  self.log.error(f"Failed to get root for {store_id.hex()}")
461
493
  return latest
@@ -470,7 +502,7 @@ class DataLayer:
470
502
  return res.node_hash
471
503
 
472
504
  async def get_root_history(self, store_id: bytes32) -> list[SingletonRecord]:
473
- records = await self.wallet_rpc.dl_history(store_id)
505
+ records = (await self.wallet_rpc.dl_history(DLHistory(store_id))).history
474
506
  if records is None:
475
507
  self.log.error(f"Failed to get root history for {store_id.hex()}")
476
508
  root_history = []
@@ -487,7 +519,7 @@ class DataLayer:
487
519
  root = await self.data_store.get_tree_root(store_id=store_id)
488
520
  except Exception:
489
521
  root = None
490
- singleton_record: Optional[SingletonRecord] = await self.wallet_rpc.dl_latest_singleton(store_id, True)
522
+ singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
491
523
  if singleton_record is None:
492
524
  return
493
525
  if root is None:
@@ -510,11 +542,15 @@ class DataLayer:
510
542
  "Maybe we're doing a batch update."
511
543
  )
512
544
  return
513
- wallet_history = await self.wallet_rpc.dl_history(
514
- launcher_id=store_id,
515
- min_generation=uint32(root.generation + 1),
516
- max_generation=singleton_record.generation,
517
- )
545
+ wallet_history = (
546
+ await self.wallet_rpc.dl_history(
547
+ DLHistory(
548
+ launcher_id=store_id,
549
+ min_generation=uint32(root.generation + 1),
550
+ max_generation=singleton_record.generation,
551
+ )
552
+ )
553
+ ).history
518
554
  new_hashes = [record.root for record in reversed(wallet_history)]
519
555
  root_hash = self.none_bytes if root.node_hash is None else root.node_hash
520
556
  generation_shift = 0
@@ -538,7 +574,7 @@ class DataLayer:
538
574
  await self.data_store.clear_pending_roots(store_id=store_id)
539
575
 
540
576
  async def fetch_and_validate(self, store_id: bytes32) -> None:
541
- singleton_record: Optional[SingletonRecord] = await self.wallet_rpc.dl_latest_singleton(store_id, True)
577
+ singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
542
578
  if singleton_record is None:
543
579
  self.log.info(f"Fetch data: No singleton record for {store_id}.")
544
580
  return
@@ -577,11 +613,15 @@ class DataLayer:
577
613
  f"Server used: {url}."
578
614
  )
579
615
 
580
- to_download = await self.wallet_rpc.dl_history(
581
- launcher_id=store_id,
582
- min_generation=uint32(root.generation + 1),
583
- max_generation=singleton_record.generation,
584
- )
616
+ to_download = (
617
+ await self.wallet_rpc.dl_history(
618
+ DLHistory(
619
+ launcher_id=store_id,
620
+ min_generation=uint32(root.generation + 1),
621
+ max_generation=singleton_record.generation,
622
+ )
623
+ )
624
+ ).history
585
625
  try:
586
626
  proxy_url = self.config.get("proxy_url", None)
587
627
  success = await insert_from_delta_file(
@@ -653,7 +693,7 @@ class DataLayer:
653
693
  return None
654
694
 
655
695
  async def clean_old_full_tree_files(self, store_id: bytes32) -> None:
656
- singleton_record: Optional[SingletonRecord] = await self.wallet_rpc.dl_latest_singleton(store_id, True)
696
+ singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
657
697
  if singleton_record is None:
658
698
  return
659
699
  await self._update_confirmation_status(store_id=store_id)
@@ -671,7 +711,7 @@ class DataLayer:
671
711
 
672
712
  async def upload_files(self, store_id: bytes32) -> None:
673
713
  uploaders = await self.get_uploaders(store_id)
674
- singleton_record: Optional[SingletonRecord] = await self.wallet_rpc.dl_latest_singleton(store_id, True)
714
+ singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
675
715
  if singleton_record is None:
676
716
  self.log.info(f"Upload files: no on-chain record for {store_id}.")
677
717
  return
@@ -738,7 +778,7 @@ class DataLayer:
738
778
  root = await self.data_store.get_tree_root(store_id=store_id)
739
779
  latest_generation = root.generation
740
780
  full_tree_first_publish_generation = max(0, latest_generation - self.maximum_full_file_count + 1)
741
- singleton_record: Optional[SingletonRecord] = await self.wallet_rpc.dl_latest_singleton(store_id, True)
781
+ singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
742
782
  if singleton_record is None:
743
783
  self.log.error(f"No singleton record found for: {store_id}")
744
784
  return
@@ -783,7 +823,7 @@ class DataLayer:
783
823
  async def subscribe(self, store_id: bytes32, urls: list[str]) -> Subscription:
784
824
  parsed_urls = [url.rstrip("/") for url in urls]
785
825
  subscription = Subscription(store_id, [ServerInfo(url, 0, 0) for url in parsed_urls])
786
- await self.wallet_rpc.dl_track_new(subscription.store_id)
826
+ await self.wallet_rpc.dl_track_new(DLTrackNew(subscription.store_id))
787
827
  async with self.subscription_lock:
788
828
  await self.data_store.subscribe(subscription)
789
829
  self.log.info(f"Done adding subscription: {subscription.store_id}")
@@ -835,7 +875,7 @@ class DataLayer:
835
875
  )
836
876
 
837
877
  # stop tracking first, then unsubscribe from the data store
838
- await self.wallet_rpc.dl_stop_tracking(store_id)
878
+ await self.wallet_rpc.dl_stop_tracking(DLStopTracking(store_id))
839
879
  await self.data_store.unsubscribe(store_id)
840
880
  if not retain_data:
841
881
  await self.data_store.delete_store_data(store_id)
@@ -854,26 +894,27 @@ class DataLayer:
854
894
  async def add_mirror(self, store_id: bytes32, urls: list[str], amount: uint64, fee: uint64) -> None:
855
895
  if not urls:
856
896
  raise RuntimeError("URL list can't be empty")
857
- bytes_urls = [bytes(url, "utf8") for url in urls]
858
- await self.wallet_rpc.dl_new_mirror(store_id, amount, bytes_urls, fee)
897
+ await self.wallet_rpc.dl_new_mirror(
898
+ DLNewMirror(launcher_id=store_id, amount=amount, urls=urls, fee=fee, push=True), DEFAULT_TX_CONFIG
899
+ )
859
900
 
860
901
  async def delete_mirror(self, coin_id: bytes32, fee: uint64) -> None:
861
- await self.wallet_rpc.dl_delete_mirror(coin_id, fee)
902
+ await self.wallet_rpc.dl_delete_mirror(DLDeleteMirror(coin_id=coin_id, fee=fee, push=True), DEFAULT_TX_CONFIG)
862
903
 
863
904
  async def get_mirrors(self, store_id: bytes32) -> list[Mirror]:
864
- mirrors: list[Mirror] = await self.wallet_rpc.dl_get_mirrors(store_id)
905
+ mirrors: list[Mirror] = (await self.wallet_rpc.dl_get_mirrors(DLGetMirrors(store_id))).mirrors
865
906
  return [mirror for mirror in mirrors if mirror.urls]
866
907
 
867
908
  async def update_subscriptions_from_wallet(self, store_id: bytes32) -> None:
868
- mirrors: list[Mirror] = await self.wallet_rpc.dl_get_mirrors(store_id)
909
+ mirrors: list[Mirror] = (await self.wallet_rpc.dl_get_mirrors(DLGetMirrors(store_id))).mirrors
869
910
  urls: list[str] = []
870
911
  for mirror in mirrors:
871
- urls += [url.decode("utf8") for url in mirror.urls]
912
+ urls += mirror.urls
872
913
  urls = [url.rstrip("/") for url in urls]
873
914
  await self.data_store.update_subscriptions_from_wallet(store_id, urls)
874
915
 
875
916
  async def get_owned_stores(self) -> list[SingletonRecord]:
876
- return await self.wallet_rpc.dl_owned_singletons()
917
+ return (await self.wallet_rpc.dl_owned_singletons()).singletons
877
918
 
878
919
  async def get_kv_diff(self, store_id: bytes32, hash_1: bytes32, hash_2: bytes32) -> set[DiffData]:
879
920
  return await self.data_store.get_kv_diff(store_id, hash_1, hash_2)
@@ -898,7 +939,7 @@ class DataLayer:
898
939
  try:
899
940
  subscriptions = await self.data_store.get_subscriptions()
900
941
  for subscription in subscriptions:
901
- await self.wallet_rpc.dl_track_new(subscription.store_id)
942
+ await self.wallet_rpc.dl_track_new(DLTrackNew(subscription.store_id))
902
943
  break
903
944
  except aiohttp.client_exceptions.ClientConnectorError:
904
945
  pass
@@ -1248,7 +1289,7 @@ class DataLayer:
1248
1289
  if not await self.data_store.store_id_exists(store_id=store_id):
1249
1290
  raise Exception(f"No store id stored in the local database for {store_id}")
1250
1291
  root = await self.data_store.get_tree_root(store_id=store_id)
1251
- singleton_record = await self.wallet_rpc.dl_latest_singleton(store_id, True)
1292
+ singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
1252
1293
  if singleton_record is None:
1253
1294
  raise Exception(f"No singleton found for {store_id}")
1254
1295
 
@@ -8,6 +8,7 @@ from chia_rs.sized_bytes import bytes32
8
8
  from chia_rs.sized_ints import uint8, uint64
9
9
 
10
10
  from chia.data_layer.data_layer_errors import OfferIntegrityError
11
+ from chia.data_layer.data_layer_rpc_util import marshal
11
12
  from chia.data_layer.data_layer_util import (
12
13
  CancelOfferRequest,
13
14
  CancelOfferResponse,
@@ -31,7 +32,6 @@ from chia.data_layer.data_layer_util import (
31
32
  unspecified,
32
33
  )
33
34
  from chia.data_layer.data_layer_wallet import DataLayerWallet, Mirror, verify_offer
34
- from chia.rpc.data_layer_rpc_util import marshal
35
35
  from chia.rpc.rpc_server import Endpoint, EndpointResult
36
36
  from chia.rpc.util import marshal as streamable_marshal
37
37
  from chia.util.byte_types import hexstr_to_bytes
@@ -1,11 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, TypeVar
4
-
5
- from typing_extensions import Protocol
6
-
7
- _T = TypeVar("_T")
3
+ from typing import Any
8
4
 
5
+ from typing_extensions import Protocol, Self
9
6
 
10
7
  # If accepted for general use then this should be moved to a common location
11
8
  # and probably implemented by the framework instead of manual decoration.
@@ -13,7 +10,7 @@ _T = TypeVar("_T")
13
10
 
14
11
  class MarshallableProtocol(Protocol):
15
12
  @classmethod
16
- def unmarshal(cls: type[_T], marshalled: dict[str, Any]) -> _T: ...
13
+ def unmarshal(cls, marshalled: dict[str, Any]) -> Self: ...
17
14
 
18
15
  def marshal(self) -> dict[str, Any]: ...
19
16
 
@@ -392,7 +392,7 @@ class Root:
392
392
  }
393
393
 
394
394
 
395
- node_type_to_class: dict[NodeType, Union[type[InternalNode], type[TerminalNode]]] = {
395
+ node_type_to_class: dict[NodeType, type[Union[InternalNode, TerminalNode]]] = {
396
396
  NodeType.INTERNAL: InternalNode,
397
397
  NodeType.TERMINAL: TerminalNode,
398
398
  }
@@ -962,14 +962,12 @@ def dl_verify_proof_internal(dl_proof: DLProof, puzzle_hash: bytes32) -> list[Ke
962
962
 
963
963
 
964
964
  async def dl_verify_proof(
965
- request: dict[str, Any],
965
+ dlproof: DLProof,
966
966
  wallet_node: WalletNode,
967
967
  peer: WSChiaConnection,
968
- ) -> dict[str, Any]:
968
+ ) -> VerifyProofResponse:
969
969
  """Verify a proof of inclusion for a DL singleton"""
970
970
 
971
- dlproof = DLProof.from_json_dict(request)
972
-
973
971
  coin_id = dlproof.coin_id
974
972
  coin_states = await wallet_node.get_coin_state([coin_id], peer=peer)
975
973
  if len(coin_states) == 0:
@@ -982,4 +980,4 @@ async def dl_verify_proof(
982
980
  success=True,
983
981
  current_root=coin_states[0].spent_height is None,
984
982
  )
985
- return response.to_json_dict()
983
+ return response
@@ -5,23 +5,21 @@ import logging
5
5
  import time
6
6
  from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
7
7
 
8
- from chia_rs import G1Element, G2Element
8
+ from chia_rs import BlockRecord, CoinSpend, CoinState, G1Element, G2Element
9
9
  from chia_rs.sized_bytes import bytes32
10
10
  from chia_rs.sized_ints import uint8, uint32, uint64, uint128
11
11
  from clvm.EvalError import EvalError
12
12
  from typing_extensions import Unpack, final
13
13
 
14
- from chia.consensus.block_record import BlockRecord
15
14
  from chia.data_layer.data_layer_errors import LauncherCoinNotFoundError, OfferIntegrityError
16
15
  from chia.data_layer.data_layer_util import OfferStore, ProofOfInclusion, ProofOfInclusionLayer, StoreProofs, leaf_hash
17
16
  from chia.data_layer.singleton_record import SingletonRecord
18
- from chia.protocols.wallet_protocol import CoinState
19
17
  from chia.server.ws_connection import WSChiaConnection
20
18
  from chia.types.blockchain_format.coin import Coin
21
- from chia.types.blockchain_format.program import Program
22
- from chia.types.blockchain_format.serialized_program import SerializedProgram
23
- from chia.types.coin_spend import CoinSpend, compute_additions
19
+ from chia.types.blockchain_format.program import Program, run_with_cost
20
+ from chia.types.coin_spend import make_spend
24
21
  from chia.types.condition_opcodes import ConditionOpcode
22
+ from chia.util.streamable import Streamable, streamable
25
23
  from chia.wallet.conditions import (
26
24
  AssertAnnouncement,
27
25
  AssertCoinAnnouncement,
@@ -52,6 +50,7 @@ from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
52
50
  from chia.wallet.singleton import SINGLETON_LAUNCHER_PUZZLE, SINGLETON_LAUNCHER_PUZZLE_HASH
53
51
  from chia.wallet.trading.offer import NotarizedPayment, Offer
54
52
  from chia.wallet.transaction_record import TransactionRecord
53
+ from chia.wallet.util.compute_additions import compute_additions
55
54
  from chia.wallet.util.compute_memos import compute_memos
56
55
  from chia.wallet.util.merkle_utils import _simplify_merkle_proof
57
56
  from chia.wallet.util.transaction_type import TransactionType
@@ -68,35 +67,23 @@ if TYPE_CHECKING:
68
67
  from chia.wallet.wallet_state_manager import WalletStateManager
69
68
 
70
69
 
70
+ @streamable
71
71
  @dataclasses.dataclass(frozen=True)
72
- class Mirror:
72
+ class Mirror(Streamable):
73
73
  coin_id: bytes32
74
74
  launcher_id: bytes32
75
75
  amount: uint64
76
- urls: list[bytes]
76
+ urls: list[str]
77
77
  ours: bool
78
78
  confirmed_at_height: Optional[uint32]
79
79
 
80
- def to_json_dict(self) -> dict[str, Any]:
81
- return {
82
- "coin_id": self.coin_id.hex(),
83
- "launcher_id": self.launcher_id.hex(),
84
- "amount": self.amount,
85
- "urls": [url.decode("utf8") for url in self.urls],
86
- "ours": self.ours,
87
- "confirmed_at_height": self.confirmed_at_height,
88
- }
80
+ @staticmethod
81
+ def encode_urls(urls: list[str]) -> list[bytes]:
82
+ return [url.encode("utf8") for url in urls]
89
83
 
90
- @classmethod
91
- def from_json_dict(cls, json_dict: dict[str, Any]) -> Mirror:
92
- return cls(
93
- bytes32.from_hexstr(json_dict["coin_id"]),
94
- bytes32.from_hexstr(json_dict["launcher_id"]),
95
- json_dict["amount"],
96
- [bytes(url, "utf8") for url in json_dict["urls"]],
97
- json_dict["ours"],
98
- json_dict["confirmed_at_height"],
99
- )
84
+ @staticmethod
85
+ def decode_urls(urls: list[bytes]) -> list[str]:
86
+ return [url.decode("utf8") for url in urls]
100
87
 
101
88
 
102
89
  @final
@@ -167,13 +154,13 @@ class DataLayerWallet:
167
154
  @staticmethod
168
155
  async def match_dl_launcher(launcher_spend: CoinSpend) -> tuple[bool, Optional[bytes32]]:
169
156
  # Sanity check it's a launcher
170
- if launcher_spend.puzzle_reveal.to_program() != SINGLETON_LAUNCHER_PUZZLE:
157
+ if launcher_spend.puzzle_reveal != SINGLETON_LAUNCHER_PUZZLE.to_serialized():
171
158
  return False, None
172
159
 
173
160
  # Let's make sure the solution looks how we expect it to
174
161
  try:
175
162
  full_puzhash, amount, root, inner_puzhash = launch_solution_to_singleton_info(
176
- launcher_spend.solution.to_program()
163
+ Program.from_serialized(launcher_spend.solution)
177
164
  )
178
165
  except ValueError:
179
166
  return False, None
@@ -223,7 +210,9 @@ class DataLayerWallet:
223
210
 
224
211
  assert spend.coin.name() == launcher_id, "coin_id should always match the launcher_id here"
225
212
 
226
- full_puzhash, amount, root, inner_puzhash = launch_solution_to_singleton_info(spend.solution.to_program())
213
+ full_puzhash, amount, root, inner_puzhash = launch_solution_to_singleton_info(
214
+ Program.from_serialized(spend.solution)
215
+ )
227
216
  new_singleton = Coin(launcher_id, full_puzhash, amount)
228
217
 
229
218
  singleton_record: Optional[SingletonRecord] = await self.wallet_state_manager.dl_store.get_latest_singleton(
@@ -300,9 +289,7 @@ class DataLayerWallet:
300
289
  launcher_parent: Coin = next(iter(coins))
301
290
  launcher_coin: Coin = Coin(launcher_parent.name(), SINGLETON_LAUNCHER_PUZZLE_HASH, uint64(1))
302
291
 
303
- inner_puzzle: Program = await self.standard_wallet.get_puzzle(
304
- new=not action_scope.config.tx_config.reuse_puzhash
305
- )
292
+ inner_puzzle: Program = await action_scope.get_puzzle(self.wallet_state_manager)
306
293
  full_puzzle: Program = create_host_fullpuz(inner_puzzle, initial_root, launcher_coin.name())
307
294
 
308
295
  genesis_launcher_solution: Program = Program.to(
@@ -321,10 +308,10 @@ class DataLayerWallet:
321
308
  extra_conditions=(*extra_conditions, announcement),
322
309
  )
323
310
 
324
- launcher_cs: CoinSpend = CoinSpend(
311
+ launcher_cs: CoinSpend = make_spend(
325
312
  launcher_coin,
326
- SerializedProgram.from_program(SINGLETON_LAUNCHER_PUZZLE),
327
- SerializedProgram.from_program(genesis_launcher_solution),
313
+ SINGLETON_LAUNCHER_PUZZLE,
314
+ genesis_launcher_solution,
328
315
  )
329
316
  launcher_sb = WalletSpendBundle([launcher_cs], G2Element())
330
317
  launcher_id = launcher_coin.name()
@@ -394,9 +381,7 @@ class DataLayerWallet:
394
381
 
395
382
  # Make the child's puzzles
396
383
  if new_puz_hash is None:
397
- new_puz_hash = await self.standard_wallet.get_puzzle_hash(
398
- new=not action_scope.config.tx_config.reuse_puzhash
399
- )
384
+ new_puz_hash = await action_scope.get_puzzle_hash(self.wallet_state_manager)
400
385
  assert new_puz_hash is not None
401
386
  next_full_puz_hash: bytes32 = create_host_fullpuz(new_puz_hash, root_hash, launcher_id).get_tree_hash_precalc(
402
387
  new_puz_hash
@@ -457,10 +442,10 @@ class DataLayerWallet:
457
442
  second_coin = Coin(
458
443
  current_coin.name(), second_full_puz.get_tree_hash(), singleton_record.lineage_proof.amount
459
444
  )
460
- second_coin_spend = CoinSpend(
445
+ second_coin_spend = make_spend(
461
446
  second_coin,
462
- SerializedProgram.from_program(second_full_puz),
463
- SerializedProgram.to(
447
+ second_full_puz,
448
+ Program.to(
464
449
  [
465
450
  LineageProof(
466
451
  current_coin.parent_coin_info,
@@ -538,10 +523,10 @@ class DataLayerWallet:
538
523
  )
539
524
 
540
525
  # Create the spend
541
- coin_spend = CoinSpend(
526
+ coin_spend = make_spend(
542
527
  current_coin,
543
- SerializedProgram.from_program(current_full_puz),
544
- SerializedProgram.from_program(full_sol),
528
+ current_full_puz,
529
+ full_sol,
545
530
  )
546
531
 
547
532
  spend_bundle = WalletSpendBundle([coin_spend], G2Element())
@@ -722,18 +707,16 @@ class DataLayerWallet:
722
707
  raise ValueError(f"DL Wallet does not have permission to delete mirror with ID {mirror_id}")
723
708
 
724
709
  parent_inner_puzzle: Program = self.standard_wallet.puzzle_for_pk(inner_puzzle_derivation.pubkey)
725
- new_puzhash: bytes32 = await self.standard_wallet.get_puzzle_hash(
726
- new=not action_scope.config.tx_config.reuse_puzhash
727
- )
710
+ new_puzhash: bytes32 = await action_scope.get_puzzle_hash(self.wallet_state_manager)
728
711
  excess_fee: int = fee - mirror_coin.amount
729
712
  inner_sol: Program = self.standard_wallet.make_solution(
730
713
  primaries=[CreateCoin(new_puzhash, uint64(mirror_coin.amount - fee))] if excess_fee < 0 else [],
731
714
  conditions=(*extra_conditions, CreateCoinAnnouncement(b"$")) if excess_fee > 0 else extra_conditions,
732
715
  )
733
- mirror_spend = CoinSpend(
716
+ mirror_spend = make_spend(
734
717
  mirror_coin,
735
- SerializedProgram.from_program(create_mirror_puzzle()),
736
- SerializedProgram.to(
718
+ create_mirror_puzzle(),
719
+ Program.to(
737
720
  [
738
721
  parent_coin.parent_coin_info,
739
722
  parent_inner_puzzle,
@@ -798,7 +781,7 @@ class DataLayerWallet:
798
781
  coin.name(),
799
782
  launcher_id,
800
783
  uint64(coin.amount),
801
- urls,
784
+ Mirror.decode_urls(urls),
802
785
  ours,
803
786
  height,
804
787
  )
@@ -826,7 +809,7 @@ class DataLayerWallet:
826
809
  root: bytes32
827
810
  inner_puzzle_hash: bytes32
828
811
 
829
- conditions = puzzle.run_with_cost(self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM, solution)[
812
+ conditions = run_with_cost(puzzle, self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM, solution)[
830
813
  1
831
814
  ].as_python()
832
815
  found_singleton: bool = False
@@ -936,14 +919,6 @@ class DataLayerWallet:
936
919
  def puzzle_for_pk(self, pubkey: G1Element) -> Program:
937
920
  return self.standard_wallet.puzzle_for_pk(pubkey)
938
921
 
939
- async def get_new_puzzle(self) -> Program:
940
- return self.puzzle_for_pk(
941
- (await self.wallet_state_manager.get_unused_derivation_record(self.wallet_info.id)).pubkey
942
- )
943
-
944
- async def get_new_puzzlehash(self) -> bytes32:
945
- return (await self.get_new_puzzle()).get_tree_hash()
946
-
947
922
  async def new_peak(self, peak: BlockRecord) -> None:
948
923
  pass
949
924
 
@@ -1024,9 +999,7 @@ class DataLayerWallet:
1024
999
  except KeyError:
1025
1000
  this_solver = solver["0x" + launcher.hex()]
1026
1001
  new_root: bytes32 = this_solver["new_root"]
1027
- new_ph: bytes32 = await wallet_state_manager.main_wallet.get_puzzle_hash(
1028
- new=not action_scope.config.tx_config.reuse_puzhash
1029
- )
1002
+ new_ph: bytes32 = await action_scope.get_puzzle_hash(wallet_state_manager)
1030
1003
  async with wallet_state_manager.new_action_scope(
1031
1004
  action_scope.config.tx_config, push=False
1032
1005
  ) as inner_action_scope:
@@ -1050,7 +1023,7 @@ class DataLayerWallet:
1050
1023
  for cs in tx.spend_bundle.coin_spends
1051
1024
  if tx.spend_bundle is not None and match_dl_singleton(cs.puzzle_reveal)[0]
1052
1025
  )
1053
- dl_solution: Program = dl_spend.solution.to_program()
1026
+ dl_solution = Program.from_serialized(dl_spend.solution)
1054
1027
  old_graftroot: Program = dl_solution.at("rrffrf")
1055
1028
  new_graftroot: Program = create_graftroot_offer_puz(
1056
1029
  [bytes32(dep["launcher_id"]) for dep in this_solver["dependencies"]],
@@ -1059,7 +1032,7 @@ class DataLayerWallet:
1059
1032
  )
1060
1033
 
1061
1034
  new_solution: Program = dl_solution.replace(rrffrf=new_graftroot, rrffrrf=Program.to([None] * 5))
1062
- new_spend: CoinSpend = dl_spend.replace(solution=SerializedProgram.from_program(new_solution))
1035
+ new_spend: CoinSpend = dl_spend.replace(solution=new_solution.to_serialized())
1063
1036
  async with inner_action_scope.use() as interface:
1064
1037
  for i, tx in enumerate(interface.side_effects.transactions):
1065
1038
  if tx.spend_bundle is not None and dl_spend in tx.spend_bundle.coin_spends:
@@ -1115,7 +1088,7 @@ class DataLayerWallet:
1115
1088
  # Create all of the new solutions
1116
1089
  new_spends: list[CoinSpend] = []
1117
1090
  for spend in offer.coin_spends():
1118
- solution = spend.solution.to_program()
1091
+ solution = Program.from_serialized(spend.solution)
1119
1092
  if match_dl_singleton(spend.puzzle_reveal)[0]:
1120
1093
  try:
1121
1094
  graftroot: Program = solution.at("rrffrf")
@@ -1163,7 +1136,7 @@ class DataLayerWallet:
1163
1136
  ]
1164
1137
  )
1165
1138
  )
1166
- new_spend: CoinSpend = spend.replace(solution=SerializedProgram.from_program(new_solution))
1139
+ new_spend: CoinSpend = spend.replace(solution=new_solution.to_serialized())
1167
1140
  spend = new_spend
1168
1141
  new_spends.append(spend)
1169
1142
 
@@ -1173,7 +1146,7 @@ class DataLayerWallet:
1173
1146
  async def get_offer_summary(offer: Offer) -> dict[str, Any]:
1174
1147
  summary: dict[str, Any] = {"offered": []}
1175
1148
  for spend in offer.coin_spends():
1176
- solution = spend.solution.to_program()
1149
+ solution = Program.from_serialized(spend.solution)
1177
1150
  matched, curried_args = match_dl_singleton(spend.puzzle_reveal)
1178
1151
  if matched:
1179
1152
  try: