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
@@ -2,13 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
 
5
+ from chia_rs import CoinSpend
5
6
  from chia_rs.sized_bytes import bytes32
6
7
  from chia_rs.sized_ints import uint64
7
8
 
8
9
  from chia.types.blockchain_format.coin import Coin as _Coin
9
10
  from chia.types.blockchain_format.program import Program
10
- from chia.types.blockchain_format.serialized_program import SerializedProgram
11
- from chia.types.coin_spend import CoinSpend
12
11
  from chia.util.streamable import Streamable
13
12
  from chia.wallet.util.clvm_streamable import clvm_streamable
14
13
 
@@ -39,8 +38,8 @@ class Spend(Streamable):
39
38
  coin_spend.coin.puzzle_hash,
40
39
  uint64(coin_spend.coin.amount),
41
40
  ),
42
- coin_spend.puzzle_reveal.to_program(),
43
- coin_spend.solution.to_program(),
41
+ Program.from_serialized(coin_spend.puzzle_reveal),
42
+ Program.from_serialized(coin_spend.solution),
44
43
  )
45
44
 
46
45
  def as_coin_spend(self) -> CoinSpend:
@@ -50,8 +49,8 @@ class Spend(Streamable):
50
49
  self.coin.puzzle_hash,
51
50
  self.coin.amount,
52
51
  ),
53
- SerializedProgram.from_program(self.puzzle),
54
- SerializedProgram.from_program(self.solution),
52
+ self.puzzle.to_serialized(),
53
+ self.solution.to_serialized(),
55
54
  )
56
55
 
57
56
 
chia/wallet/singleton.py CHANGED
@@ -8,12 +8,13 @@ from chia_puzzles_py.programs import (
8
8
  SINGLETON_TOP_LAYER_V1_1,
9
9
  SINGLETON_TOP_LAYER_V1_1_HASH,
10
10
  )
11
+ from chia_rs import CoinSpend
11
12
  from chia_rs.sized_bytes import bytes32
12
13
 
13
14
  from chia.types.blockchain_format.coin import Coin
14
- from chia.types.blockchain_format.program import Program
15
+ from chia.types.blockchain_format.program import Program, uncurry
15
16
  from chia.types.blockchain_format.serialized_program import SerializedProgram
16
- from chia.types.coin_spend import CoinSpend, compute_additions
17
+ from chia.wallet.util.compute_additions import compute_additions
17
18
  from chia.wallet.util.curry_and_treehash import (
18
19
  calculate_hash_of_quoted_mod_hash,
19
20
  curry_and_treehash,
@@ -36,7 +37,7 @@ def get_inner_puzzle_from_singleton(puzzle: Union[Program, SerializedProgram]) -
36
37
  :param puzzle: Singleton puzzle
37
38
  :return: Inner puzzle
38
39
  """
39
- r = puzzle.uncurry()
40
+ r = uncurry(puzzle)
40
41
  if r is None:
41
42
  return None
42
43
  inner_f, args = r
@@ -52,7 +53,7 @@ def get_singleton_id_from_puzzle(puzzle: Union[Program, SerializedProgram]) -> O
52
53
  :param puzzle: Singleton puzzle
53
54
  :return: Inner puzzle
54
55
  """
55
- r = puzzle.uncurry()
56
+ r = uncurry(puzzle)
56
57
  if r is None:
57
58
  return None # pragma: no cover
58
59
  inner_f, args = r
@@ -3,11 +3,11 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass
4
4
  from typing import Any, Optional
5
5
 
6
+ from chia_rs import CoinSpend
6
7
  from chia_rs.sized_bytes import bytes32
7
8
  from chia_rs.sized_ints import uint32
8
9
 
9
10
  from chia.types.blockchain_format.coin import Coin
10
- from chia.types.coin_spend import CoinSpend
11
11
  from chia.wallet.lineage_proof import LineageProof
12
12
 
13
13
 
@@ -6,16 +6,15 @@ import time
6
6
  from collections import deque
7
7
  from typing import TYPE_CHECKING, Any, Optional, Union
8
8
 
9
+ from chia_rs import CoinState
9
10
  from chia_rs.sized_bytes import bytes32
10
11
  from chia_rs.sized_ints import uint32, uint64
11
12
  from typing_extensions import Literal
12
13
 
13
14
  from chia.data_layer.data_layer_wallet import DataLayerWallet
14
- from chia.protocols.wallet_protocol import CoinState
15
15
  from chia.server.ws_connection import WSChiaConnection
16
16
  from chia.types.blockchain_format.coin import Coin, coin_as_list
17
- from chia.types.blockchain_format.program import Program
18
- from chia.types.spend_bundle import estimate_fees
17
+ from chia.types.blockchain_format.program import Program, run
19
18
  from chia.util.db_wrapper import DBWrapper2
20
19
  from chia.util.hash import std_hash
21
20
  from chia.wallet.cat_wallet.cat_wallet import CATWallet
@@ -29,6 +28,7 @@ from chia.wallet.conditions import (
29
28
  parse_timelock_info,
30
29
  )
31
30
  from chia.wallet.db_wallet.db_wallet_puzzles import ACS_MU_PH
31
+ from chia.wallet.estimate_fees import estimate_fees
32
32
  from chia.wallet.nft_wallet.nft_wallet import NFTWallet
33
33
  from chia.wallet.outer_puzzles import AssetType
34
34
  from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
@@ -122,7 +122,7 @@ class TradeManager:
122
122
  ) -> set[bytes32]:
123
123
  """
124
124
  Returns list of coins we want to check if they are included in filter,
125
- These will include coins that belong to us and coins that that on other side of treade
125
+ These will include coins that belong to us and coins that on other side of trade
126
126
  """
127
127
  coin_ids = await self.trade_store.get_coin_ids_of_interest_with_trade_statuses(
128
128
  trade_statuses=[TradeStatus.PENDING_ACCEPT, TradeStatus.PENDING_CONFIRM, TradeStatus.PENDING_CANCEL]
@@ -301,9 +301,7 @@ class TradeManager:
301
301
  self.log.error(f"Cannot find wallet for offer {trade.trade_id}, skip cancellation.")
302
302
  continue
303
303
 
304
- new_ph = await wallet.wallet_state_manager.main_wallet.get_puzzle_hash(
305
- new=(not action_scope.config.tx_config.reuse_puzhash)
306
- )
304
+ new_ph = await action_scope.get_puzzle_hash(self.wallet_state_manager)
307
305
 
308
306
  if len(trade_records) > 1 or len(cancellation_coins) > 1:
309
307
  announcement_conditions: tuple[Condition, ...] = (
@@ -498,18 +496,11 @@ class TradeManager:
498
496
  if amount > 0:
499
497
  # this is what we are receiving in the trade
500
498
  memos: list[bytes] = []
499
+ p2_ph = await action_scope.get_puzzle_hash(self.wallet_state_manager)
501
500
  if isinstance(id, int):
502
501
  wallet_id = uint32(id)
503
502
  wallet = self.wallet_state_manager.wallets.get(wallet_id)
504
- assert isinstance(wallet, (CATWallet, Wallet))
505
- if isinstance(wallet, Wallet):
506
- p2_ph: bytes32 = await wallet.get_puzzle_hash(
507
- new=not action_scope.config.tx_config.reuse_puzhash
508
- )
509
- else:
510
- p2_ph = await wallet.standard_wallet.get_puzzle_hash(
511
- new=not action_scope.config.tx_config.reuse_puzhash
512
- )
503
+ assert isinstance(wallet, (Wallet, CATWallet))
513
504
  if wallet.type() != WalletType.STANDARD_WALLET:
514
505
  if callable(getattr(wallet, "get_asset_id", None)): # ATTENTION: new wallets
515
506
  assert isinstance(wallet, CATWallet)
@@ -520,9 +511,6 @@ class TradeManager:
520
511
  f"Cannot request assets from wallet id {wallet.id()} without more information"
521
512
  )
522
513
  else:
523
- p2_ph = await self.wallet_state_manager.main_wallet.get_puzzle_hash(
524
- new=not action_scope.config.tx_config.reuse_puzhash
525
- )
526
514
  asset_id = id
527
515
  wallet = await self.wallet_state_manager.get_wallet_for_asset_id(asset_id.hex())
528
516
  memos = [p2_ph]
@@ -716,7 +704,7 @@ class TradeManager:
716
704
  parse_conditions_non_consensus(
717
705
  condition
718
706
  for spend in final_spend_bundle.coin_spends
719
- for condition in spend.puzzle_reveal.to_program().run(spend.solution.to_program()).as_iter()
707
+ for condition in run(spend.puzzle_reveal, Program.from_serialized(spend.solution)).as_iter()
720
708
  )
721
709
  )
722
710
  # this executes the puzzles again
@@ -874,6 +862,16 @@ class TradeManager:
874
862
  complete_offer, valid_spend_solver = await self.check_for_final_modifications(
875
863
  Offer.aggregate([offer, take_offer]), solver, inner_action_scope
876
864
  )
865
+
866
+ async with action_scope.use() as interface:
867
+ if interface.side_effects.get_unused_derivation_record_result is not None:
868
+ # This error is of a protection against potential misues of this band-aid solution.
869
+ # We should put more thought into how sub-action scopes are generated and what effects
870
+ # we might want to push. A ticket to this respect can be found [CHIA-2984].
871
+ raise ValueError("Cannot use `respond_to_offer` with existing puzzle hash generation")
872
+ interface.side_effects.get_unused_derivation_record_result = (
873
+ inner_action_scope.side_effects.get_unused_derivation_record_result
874
+ )
877
875
  self.log.info("COMPLETE OFFER: %s", complete_offer.to_bech32())
878
876
  assert complete_offer.is_valid()
879
877
  final_spend_bundle: WalletSpendBundle = complete_offer.to_valid_spend(
@@ -1,10 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Any, Optional, TypeVar
4
+ from typing import Any, Optional
5
5
 
6
6
  from chia_rs.sized_bytes import bytes32
7
7
  from chia_rs.sized_ints import uint8, uint32, uint64
8
+ from typing_extensions import Self
8
9
 
9
10
  from chia.types.blockchain_format.coin import Coin
10
11
  from chia.util.streamable import Streamable, streamable
@@ -12,8 +13,6 @@ from chia.wallet.conditions import ConditionValidTimes
12
13
  from chia.wallet.trading.offer import Offer
13
14
  from chia.wallet.trading.trade_status import TradeStatus
14
15
 
15
- _T_TradeRecord = TypeVar("_T_TradeRecord", bound="TradeRecordOld")
16
-
17
16
 
18
17
  @streamable
19
18
  @dataclass(frozen=True)
@@ -51,9 +50,7 @@ class TradeRecordOld(Streamable):
51
50
  return formatted
52
51
 
53
52
  @classmethod
54
- def from_json_dict_convenience(
55
- cls: type[_T_TradeRecord], record: dict[str, Any], offer: str = ""
56
- ) -> _T_TradeRecord:
53
+ def from_json_dict_convenience(cls, record: dict[str, Any], offer: str = "") -> Self:
57
54
  new_record = record.copy()
58
55
  new_record["status"] = TradeStatus[record["status"]].value
59
56
  del new_record["summary"]
@@ -4,15 +4,15 @@ from dataclasses import dataclass, field
4
4
  from typing import Any, BinaryIO, Optional, Union
5
5
 
6
6
  from chia_puzzles_py.programs import SETTLEMENT_PAYMENT, SETTLEMENT_PAYMENT_HASH
7
- from chia_rs import G2Element
7
+ from chia_rs import CoinSpend, G2Element
8
8
  from chia_rs.sized_bytes import bytes32
9
9
  from chia_rs.sized_ints import uint64
10
10
  from clvm_tools.binutils import disassemble
11
11
 
12
12
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
13
13
  from chia.types.blockchain_format.coin import Coin, coin_as_list
14
- from chia.types.blockchain_format.program import INFINITE_COST, Program
15
- from chia.types.coin_spend import CoinSpend, make_spend
14
+ from chia.types.blockchain_format.program import INFINITE_COST, Program, run_with_cost, uncurry
15
+ from chia.types.coin_spend import make_spend
16
16
  from chia.util.bech32m import bech32_decode, bech32_encode, convertbits
17
17
  from chia.util.errors import Err, ValidationError
18
18
  from chia.util.streamable import parse_rust
@@ -43,6 +43,8 @@ from chia.wallet.util.puzzle_compression import (
43
43
  )
44
44
  from chia.wallet.wallet_spend_bundle import WalletSpendBundle
45
45
 
46
+ OfferSummary = dict[Union[int, bytes32], int]
47
+
46
48
  OFFER_MOD = Program.from_bytes(SETTLEMENT_PAYMENT)
47
49
  OFFER_MOD_HASH = bytes32(SETTLEMENT_PAYMENT_HASH)
48
50
 
@@ -170,7 +172,7 @@ class Offer:
170
172
  max_cost = int(DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM)
171
173
  for cs in self._bundle.coin_spends:
172
174
  try:
173
- cost, conds = cs.puzzle_reveal.run_with_cost(max_cost, cs.solution)
175
+ cost, conds = run_with_cost(cs.puzzle_reveal, max_cost, cs.solution)
174
176
  max_cost -= cost
175
177
  conditions[cs.coin] = parse_conditions_non_consensus(conds.as_iter())
176
178
  except Exception: # pragma: no cover
@@ -227,13 +229,13 @@ class Offer:
227
229
  coins_for_this_spend: list[Coin] = []
228
230
 
229
231
  parent_puzzle: UncurriedPuzzle = uncurry_puzzle(parent_spend.puzzle_reveal)
230
- parent_solution: Program = parent_spend.solution.to_program()
232
+ parent_solution = Program.from_serialized(parent_spend.solution)
231
233
  additions: list[Coin] = self._additions[parent_spend.coin]
232
234
 
233
235
  puzzle_driver = match_puzzle(parent_puzzle)
234
236
  if puzzle_driver is not None:
235
237
  asset_id = create_asset_id(puzzle_driver)
236
- inner_puzzle: Optional[Program] = get_inner_puzzle(puzzle_driver, parent_puzzle)
238
+ inner_puzzle: Optional[Program] = get_inner_puzzle(puzzle_driver, parent_puzzle, parent_solution)
237
239
  inner_solution: Optional[Program] = get_inner_solution(puzzle_driver, parent_solution)
238
240
  assert inner_puzzle is not None and inner_solution is not None
239
241
 
@@ -259,10 +261,7 @@ class Offer:
259
261
  matching_spend_additions = [
260
262
  a
261
263
  for a in matching_spend_additions
262
- if a.puzzle_hash
263
- == construct_puzzle(puzzle_driver, OFFER_MOD_HASH).get_tree_hash_precalc( # type: ignore
264
- OFFER_MOD_HASH
265
- )
264
+ if a.puzzle_hash == construct_puzzle(puzzle_driver, OFFER_MOD).get_tree_hash()
266
265
  ]
267
266
  if len(matching_spend_additions) == expected_num_matches:
268
267
  coins_for_this_spend.extend(matching_spend_additions)
@@ -412,7 +411,7 @@ class Offer:
412
411
  coin_names.append(name)
413
412
  dependencies[name] = []
414
413
  announcements[name] = []
415
- conditions: Program = spend.puzzle_reveal.run_with_cost(INFINITE_COST, spend.solution)[1]
414
+ conditions: Program = run_with_cost(spend.puzzle_reveal, INFINITE_COST, spend.solution)[1]
416
415
  for condition in conditions.as_iter():
417
416
  if condition.first() == 60: # create coin announcement
418
417
  announcements[name].append(
@@ -626,7 +625,7 @@ class Offer:
626
625
  asset_id = None
627
626
  if coin_spend.coin.parent_coin_info == bytes32.zeros:
628
627
  notarized_payments: list[NotarizedPayment] = []
629
- for payment_group in coin_spend.solution.to_program().as_iter():
628
+ for payment_group in Program.from_serialized(coin_spend.solution).as_iter():
630
629
  nonce = bytes32(payment_group.first().as_atom())
631
630
  payment_args_list = payment_group.rest().as_iter()
632
631
  notarized_payments.extend(
@@ -652,7 +651,7 @@ class Offer:
652
651
  def compress(self, version: Optional[int] = None) -> bytes:
653
652
  as_spend_bundle = self.to_spend_bundle()
654
653
  if version is None:
655
- mods: list[bytes] = [bytes(s.puzzle_reveal.to_program().uncurry()[0]) for s in as_spend_bundle.coin_spends]
654
+ mods: list[bytes] = [bytes(uncurry(s.puzzle_reveal)[0]) for s in as_spend_bundle.coin_spends]
656
655
  version = max(lowest_best_version(mods), 6) # Clients lower than version 6 should not be able to parse
657
656
  return compress_object_with_puzzles(bytes(as_spend_bundle), version)
658
657
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass
4
4
  from typing import Union
5
5
 
6
- from chia.types.blockchain_format.program import Program
6
+ from chia.types.blockchain_format.program import Program, uncurry
7
7
  from chia.types.blockchain_format.serialized_program import SerializedProgram
8
8
 
9
9
 
@@ -14,4 +14,4 @@ class UncurriedPuzzle:
14
14
 
15
15
 
16
16
  def uncurry_puzzle(puzzle: Union[Program, SerializedProgram]) -> UncurriedPuzzle:
17
- return UncurriedPuzzle(*puzzle.uncurry())
17
+ return UncurriedPuzzle(*uncurry(puzzle))
@@ -0,0 +1,58 @@
1
+ from __future__ import annotations
2
+
3
+ from chia_rs import CoinSpend
4
+ from chia_rs.sized_ints import uint64
5
+
6
+ from chia.consensus.condition_costs import ConditionCost
7
+ from chia.consensus.default_constants import DEFAULT_CONSTANTS
8
+ from chia.types.blockchain_format.coin import Coin
9
+ from chia.types.blockchain_format.program import Program, run_with_cost
10
+ from chia.types.condition_opcodes import ConditionOpcode
11
+ from chia.util.errors import Err, ValidationError
12
+
13
+
14
+ def compute_additions_with_cost(
15
+ cs: CoinSpend,
16
+ *,
17
+ max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM,
18
+ ) -> tuple[list[Coin], int]:
19
+ """
20
+ Run the puzzle in the specified CoinSpend and return the cost and list of
21
+ coins created by the puzzle, i.e. additions. If the cost (CLVM- and
22
+ condition cost) exceeds the specified max_cost, the function fails with a
23
+ ValidationError exception. Byte cost is not included since at this point the
24
+ puzzle and solution may have been decompressed, the true byte-cost can only be
25
+ measured at the block generator level.
26
+ """
27
+ parent_id = cs.coin.name()
28
+ ret: list[Coin] = []
29
+ cost, r = run_with_cost(cs.puzzle_reveal, max_cost, cs.solution)
30
+ for cond in Program.to(r).as_iter():
31
+ if cost > max_cost:
32
+ raise ValidationError(Err.BLOCK_COST_EXCEEDS_MAX, "compute_additions() for CoinSpend")
33
+ atoms = cond.as_iter()
34
+ op = next(atoms).atom
35
+ if op in {
36
+ ConditionOpcode.AGG_SIG_PARENT,
37
+ ConditionOpcode.AGG_SIG_PUZZLE,
38
+ ConditionOpcode.AGG_SIG_AMOUNT,
39
+ ConditionOpcode.AGG_SIG_PUZZLE_AMOUNT,
40
+ ConditionOpcode.AGG_SIG_PARENT_AMOUNT,
41
+ ConditionOpcode.AGG_SIG_PARENT_PUZZLE,
42
+ ConditionOpcode.AGG_SIG_UNSAFE,
43
+ ConditionOpcode.AGG_SIG_ME,
44
+ }:
45
+ cost += ConditionCost.AGG_SIG.value
46
+ continue
47
+ if op != ConditionOpcode.CREATE_COIN.value:
48
+ continue
49
+ cost += ConditionCost.CREATE_COIN.value
50
+ puzzle_hash = next(atoms).as_atom()
51
+ amount = uint64(next(atoms).as_int())
52
+ ret.append(Coin(parent_id, puzzle_hash, uint64(amount)))
53
+
54
+ return ret, cost
55
+
56
+
57
+ def compute_additions(cs: CoinSpend, *, max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM) -> list[Coin]:
58
+ return compute_additions_with_cost(cs, max_cost=max_cost)[0]
@@ -3,14 +3,14 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass
4
4
  from typing import Optional
5
5
 
6
+ from chia_rs import CoinSpend
6
7
  from chia_rs.sized_bytes import bytes32
7
8
  from chia_rs.sized_ints import uint64
8
9
 
9
10
  from chia.consensus.condition_costs import ConditionCost
10
11
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
11
12
  from chia.types.blockchain_format.coin import Coin
12
- from chia.types.blockchain_format.program import Program
13
- from chia.types.coin_spend import CoinSpend
13
+ from chia.types.blockchain_format.program import Program, run_with_cost
14
14
  from chia.types.condition_opcodes import ConditionOpcode
15
15
  from chia.util.errors import Err, ValidationError
16
16
 
@@ -26,7 +26,7 @@ def compute_spend_hints_and_additions(
26
26
  *,
27
27
  max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM,
28
28
  ) -> tuple[dict[bytes32, HintedCoin], int]:
29
- cost, result_program = cs.puzzle_reveal.run_with_cost(max_cost, cs.solution)
29
+ cost, result_program = run_with_cost(cs.puzzle_reveal, max_cost, cs.solution)
30
30
 
31
31
  hinted_coins: dict[bytes32, HintedCoin] = {}
32
32
  for condition in result_program.as_iter():
@@ -1,18 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from chia_rs import CoinSpend
3
4
  from chia_rs.sized_bytes import bytes32
4
5
  from chia_rs.sized_ints import uint64
5
- from clvm.casts import int_from_bytes
6
6
 
7
7
  from chia.types.blockchain_format.coin import Coin
8
- from chia.types.blockchain_format.program import INFINITE_COST
9
- from chia.types.coin_spend import CoinSpend
8
+ from chia.types.blockchain_format.program import INFINITE_COST, run_with_cost
10
9
  from chia.types.condition_opcodes import ConditionOpcode
10
+ from chia.util.casts import int_from_bytes
11
11
  from chia.wallet.wallet_spend_bundle import WalletSpendBundle
12
12
 
13
13
 
14
14
  def compute_memos_for_spend(coin_spend: CoinSpend) -> dict[bytes32, list[bytes]]:
15
- _, result = coin_spend.puzzle_reveal.run_with_cost(INFINITE_COST, coin_spend.solution)
15
+ _, result = run_with_cost(coin_spend.puzzle_reveal, INFINITE_COST, coin_spend.solution)
16
16
  memos: dict[bytes32, list[bytes]] = {}
17
17
  for condition in result.as_python():
18
18
  if condition[0] == ConditionOpcode.CREATE_COIN and len(condition) >= 4:
@@ -5,7 +5,8 @@ from hashlib import sha256
5
5
  from typing import Callable
6
6
 
7
7
  from chia_rs.sized_bytes import bytes32
8
- from clvm.casts import int_to_bytes
8
+
9
+ from chia.util.casts import int_to_bytes
9
10
 
10
11
  CurryHashFunction = Callable[..., bytes32]
11
12
 
@@ -4,11 +4,11 @@ from chia_rs import AugSchemeMPL
4
4
  from clvm.operators import KEYWORD_FROM_ATOM
5
5
  from clvm_tools.binutils import disassemble as bu_disassemble
6
6
 
7
+ from chia.consensus.condition_tools import conditions_dict_for_solution, pkm_pairs_for_conditions_dict
7
8
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
8
9
  from chia.types.blockchain_format.coin import Coin
9
10
  from chia.types.blockchain_format.program import INFINITE_COST, Program
10
11
  from chia.types.condition_opcodes import ConditionOpcode
11
- from chia.util.condition_tools import conditions_dict_for_solution, pkm_pairs_for_conditions_dict
12
12
  from chia.util.hash import std_hash
13
13
  from chia.wallet.uncurried_puzzle import UncurriedPuzzle
14
14
 
@@ -5,8 +5,8 @@ from enum import Enum
5
5
  from typing import Optional
6
6
 
7
7
  from chia_rs.sized_bytes import bytes32
8
- from clvm.casts import int_to_bytes
9
8
 
9
+ from chia.util.casts import int_to_bytes
10
10
  from chia.util.hash import std_hash
11
11
 
12
12
  ONE = int_to_bytes(1)
@@ -3,11 +3,10 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  from typing import Any, Optional
5
5
 
6
+ from chia_rs import CoinState, HeaderBlock
6
7
  from chia_rs.sized_bytes import bytes32
7
8
  from chia_rs.sized_ints import uint32, uint64
8
9
 
9
- from chia.protocols.wallet_protocol import CoinState
10
- from chia.types.header_block import HeaderBlock
11
10
  from chia.util.hash import std_hash
12
11
  from chia.util.lru_cache import LRUCache
13
12
 
@@ -1,12 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
- from typing import Any, Optional, TypeVar
4
+ from typing import Any, Optional
5
5
 
6
6
  from chia_rs import ConsensusConstants
7
7
  from chia_rs.sized_bytes import bytes32
8
8
  from chia_rs.sized_ints import uint64
9
- from typing_extensions import NotRequired, TypedDict, Unpack
9
+ from typing_extensions import NotRequired, Self, TypedDict, Unpack
10
10
 
11
11
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
12
12
  from chia.types.blockchain_format.coin import Coin
@@ -66,9 +66,6 @@ class AutofillArgs(TypedDict):
66
66
  logged_in_fingerprint: NotRequired[int]
67
67
 
68
68
 
69
- _T_CoinSelectionConfigLoader = TypeVar("_T_CoinSelectionConfigLoader", bound="CoinSelectionConfigLoader")
70
-
71
-
72
69
  @streamable
73
70
  @dataclasses.dataclass(frozen=True)
74
71
  class CoinSelectionConfigLoader(Streamable):
@@ -90,9 +87,7 @@ class CoinSelectionConfigLoader(Streamable):
90
87
  )
91
88
 
92
89
  @classmethod
93
- def from_json_dict(
94
- cls: type[_T_CoinSelectionConfigLoader], json_dict: dict[str, Any]
95
- ) -> _T_CoinSelectionConfigLoader:
90
+ def from_json_dict(cls, json_dict: dict[str, Any]) -> Self:
96
91
  if "excluded_coins" in json_dict:
97
92
  excluded_coins: list[Coin] = [Coin.from_json_dict(c) for c in json_dict["excluded_coins"]]
98
93
  excluded_coin_ids: list[str] = [c.name().hex() for c in excluded_coins]
@@ -5,14 +5,21 @@ import logging
5
5
  import random
6
6
  from typing import Any, Optional, Union
7
7
 
8
- from chia_rs import compute_merkle_set_root, confirm_included_already_hashed, confirm_not_included_already_hashed
8
+ from chia_rs import (
9
+ CoinSpend,
10
+ CoinState,
11
+ HeaderBlock,
12
+ RespondToPhUpdates,
13
+ compute_merkle_set_root,
14
+ confirm_included_already_hashed,
15
+ confirm_not_included_already_hashed,
16
+ )
9
17
  from chia_rs.sized_bytes import bytes32
10
18
  from chia_rs.sized_ints import uint32
11
19
 
12
20
  from chia.full_node.full_node_api import FullNodeAPI
13
21
  from chia.protocols.shared_protocol import Capability
14
22
  from chia.protocols.wallet_protocol import (
15
- CoinState,
16
23
  RegisterForCoinUpdates,
17
24
  RegisterForPhUpdates,
18
25
  RejectAdditionsRequest,
@@ -30,12 +37,10 @@ from chia.protocols.wallet_protocol import (
30
37
  RespondPuzzleSolution,
31
38
  RespondRemovals,
32
39
  RespondToCoinUpdates,
33
- RespondToPhUpdates,
34
40
  )
35
41
  from chia.server.ws_connection import WSChiaConnection
36
42
  from chia.types.blockchain_format.coin import Coin, hash_coin_ids
37
- from chia.types.coin_spend import CoinSpend, make_spend
38
- from chia.types.header_block import HeaderBlock
43
+ from chia.types.coin_spend import make_spend
39
44
  from chia.util.task_referencer import create_referenced_task
40
45
  from chia.wallet.util.peer_request_cache import PeerRequestCache
41
46
 
@@ -28,6 +28,7 @@ class WalletType(IntEnum):
28
28
  DATA_LAYER_OFFER = 12
29
29
  VC = 13
30
30
  CRCAT = 57
31
+ RCAT = 132
31
32
 
32
33
  def to_json_dict(self) -> str:
33
34
  # yes, this isn't a `dict`, but it is json and