chia-blockchain 2.5.4rc1__py3-none-any.whl → 2.5.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. chia/_tests/blockchain/blockchain_test_utils.py +2 -3
  2. chia/_tests/blockchain/test_augmented_chain.py +2 -3
  3. chia/_tests/blockchain/test_blockchain.py +261 -44
  4. chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
  5. chia/_tests/blockchain/test_build_chains.py +197 -1
  6. chia/_tests/blockchain/test_get_block_generator.py +1 -1
  7. chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
  8. chia/_tests/clvm/benchmark_costs.py +1 -1
  9. chia/_tests/clvm/coin_store.py +3 -4
  10. chia/_tests/clvm/test_message_conditions.py +2 -2
  11. chia/_tests/clvm/test_puzzle_compression.py +2 -3
  12. chia/_tests/clvm/test_puzzles.py +1 -2
  13. chia/_tests/clvm/test_singletons.py +2 -3
  14. chia/_tests/clvm/test_spend_sim.py +7 -7
  15. chia/_tests/cmds/cmd_test_utils.py +30 -25
  16. chia/_tests/cmds/test_dev_gh.py +1 -1
  17. chia/_tests/cmds/test_farm_cmd.py +1 -1
  18. chia/_tests/cmds/test_show.py +1 -2
  19. chia/_tests/cmds/wallet/test_did.py +101 -56
  20. chia/_tests/cmds/wallet/test_nft.py +109 -84
  21. chia/_tests/cmds/wallet/test_notifications.py +1 -1
  22. chia/_tests/cmds/wallet/test_offer.toffer +1 -1
  23. chia/_tests/cmds/wallet/test_vcs.py +8 -8
  24. chia/_tests/cmds/wallet/test_wallet.py +100 -46
  25. chia/_tests/conftest.py +31 -20
  26. chia/_tests/connection_utils.py +1 -1
  27. chia/_tests/core/consensus/stores/__init__.py +0 -0
  28. chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
  29. chia/_tests/core/consensus/test_block_creation.py +2 -31
  30. chia/_tests/core/consensus/test_pot_iterations.py +38 -3
  31. chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
  32. chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
  33. chia/_tests/core/daemon/test_daemon.py +80 -0
  34. chia/_tests/core/data_layer/test_data_layer.py +1 -1
  35. chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
  36. chia/_tests/core/data_layer/test_data_rpc.py +14 -10
  37. chia/_tests/core/data_layer/test_data_store.py +5 -5
  38. chia/_tests/core/farmer/test_farmer_api.py +2 -2
  39. chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
  40. chia/_tests/core/full_node/ram_db.py +3 -1
  41. chia/_tests/core/full_node/stores/test_block_store.py +28 -16
  42. chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
  43. chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
  44. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  45. chia/_tests/core/full_node/test_address_manager.py +200 -27
  46. chia/_tests/core/full_node/test_block_height_map.py +2 -2
  47. chia/_tests/core/full_node/test_conditions.py +7 -6
  48. chia/_tests/core/full_node/test_full_node.py +456 -40
  49. chia/_tests/core/full_node/test_generator_tools.py +32 -2
  50. chia/_tests/core/full_node/test_hint_management.py +1 -1
  51. chia/_tests/core/full_node/test_node_load.py +20 -21
  52. chia/_tests/core/full_node/test_performance.py +3 -4
  53. chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
  54. chia/_tests/core/full_node/test_subscriptions.py +1 -2
  55. chia/_tests/core/full_node/test_transactions.py +9 -5
  56. chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
  57. chia/_tests/core/large_block.py +1 -2
  58. chia/_tests/core/make_block_generator.py +3 -4
  59. chia/_tests/core/mempool/test_mempool.py +36 -86
  60. chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
  61. chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
  62. chia/_tests/core/mempool/test_mempool_manager.py +529 -69
  63. chia/_tests/core/mempool/test_mempool_performance.py +3 -2
  64. chia/_tests/core/mempool/test_singleton_fast_forward.py +61 -132
  65. chia/_tests/core/server/flood.py +1 -1
  66. chia/_tests/core/server/test_dos.py +1 -1
  67. chia/_tests/core/server/test_node_discovery.py +41 -27
  68. chia/_tests/core/server/test_rate_limits.py +1 -1
  69. chia/_tests/core/server/test_server.py +1 -1
  70. chia/_tests/core/services/test_services.py +5 -5
  71. chia/_tests/core/ssl/test_ssl.py +1 -1
  72. chia/_tests/core/test_cost_calculation.py +6 -6
  73. chia/_tests/core/test_crawler.py +2 -2
  74. chia/_tests/core/test_crawler_rpc.py +1 -1
  75. chia/_tests/core/test_db_conversion.py +3 -1
  76. chia/_tests/core/test_db_validation.py +5 -3
  77. chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
  78. chia/_tests/core/test_filter.py +4 -1
  79. chia/_tests/core/test_full_node_rpc.py +99 -82
  80. chia/_tests/core/test_program.py +2 -2
  81. chia/_tests/core/util/test_block_cache.py +1 -1
  82. chia/_tests/core/util/test_keychain.py +2 -2
  83. chia/_tests/core/util/test_lockfile.py +1 -1
  84. chia/_tests/core/util/test_log_exceptions.py +5 -5
  85. chia/_tests/core/util/test_streamable.py +81 -22
  86. chia/_tests/db/test_db_wrapper.py +1 -3
  87. chia/_tests/environments/wallet.py +5 -5
  88. chia/_tests/farmer_harvester/test_farmer.py +9 -7
  89. chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
  90. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  91. chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
  92. chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
  93. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
  94. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
  95. chia/_tests/generator/test_compression.py +1 -2
  96. chia/_tests/generator/test_rom.py +8 -4
  97. chia/_tests/plot_sync/test_plot_sync.py +3 -3
  98. chia/_tests/plot_sync/test_receiver.py +3 -3
  99. chia/_tests/plot_sync/test_sender.py +1 -1
  100. chia/_tests/plot_sync/test_sync_simulated.py +3 -3
  101. chia/_tests/plot_sync/util.py +2 -2
  102. chia/_tests/pools/test_pool_cmdline.py +48 -21
  103. chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
  104. chia/_tests/pools/test_pool_rpc.py +237 -105
  105. chia/_tests/pools/test_pool_wallet.py +11 -2
  106. chia/_tests/pools/test_wallet_pool_store.py +5 -4
  107. chia/_tests/rpc/test_rpc_client.py +1 -1
  108. chia/_tests/simulation/test_simulation.py +13 -8
  109. chia/_tests/simulation/test_simulator.py +2 -2
  110. chia/_tests/timelord/test_new_peak.py +191 -47
  111. chia/_tests/timelord/test_timelord.py +1 -1
  112. chia/_tests/tools/test_full_sync.py +0 -2
  113. chia/_tests/tools/test_run_block.py +3 -1
  114. chia/_tests/util/benchmark_cost.py +3 -3
  115. chia/_tests/util/benchmarks.py +2 -2
  116. chia/_tests/util/blockchain.py +11 -5
  117. chia/_tests/util/blockchain_mock.py +1 -4
  118. chia/_tests/util/coin_store.py +29 -0
  119. chia/_tests/util/constants.py +2 -18
  120. chia/_tests/util/full_sync.py +3 -3
  121. chia/_tests/util/generator_tools_testing.py +2 -3
  122. chia/_tests/util/key_tool.py +2 -3
  123. chia/_tests/util/misc.py +33 -31
  124. chia/_tests/util/network_protocol_data.py +19 -17
  125. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  126. chia/_tests/util/protocol_messages_json.py +3 -1
  127. chia/_tests/util/run_block.py +2 -2
  128. chia/_tests/util/setup_nodes.py +7 -7
  129. chia/_tests/util/spend_sim.py +47 -55
  130. chia/_tests/util/test_condition_tools.py +5 -4
  131. chia/_tests/util/test_config.py +2 -2
  132. chia/_tests/util/test_dump_keyring.py +1 -1
  133. chia/_tests/util/test_full_block_utils.py +12 -14
  134. chia/_tests/util/test_misc.py +2 -2
  135. chia/_tests/util/test_paginator.py +4 -4
  136. chia/_tests/util/test_priority_mutex.py +2 -2
  137. chia/_tests/util/test_replace_str_to_bytes.py +15 -5
  138. chia/_tests/util/test_ssl_check.py +1 -1
  139. chia/_tests/util/test_testnet_overrides.py +13 -3
  140. chia/_tests/util/time_out_assert.py +4 -2
  141. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
  142. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
  143. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
  144. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
  145. chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
  146. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
  147. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
  148. chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
  149. chia/_tests/wallet/conftest.py +11 -12
  150. chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
  151. chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
  152. chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
  153. chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
  154. chia/_tests/wallet/nft_wallet/config.py +1 -1
  155. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
  156. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
  157. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
  158. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
  159. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
  160. chia/_tests/wallet/rpc/test_wallet_rpc.py +495 -265
  161. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
  162. chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
  163. chia/_tests/wallet/test_clvm_casts.py +88 -0
  164. chia/_tests/wallet/test_coin_management.py +1 -1
  165. chia/_tests/wallet/test_coin_selection.py +1 -1
  166. chia/_tests/wallet/test_conditions.py +1 -1
  167. chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
  168. chia/_tests/wallet/test_notifications.py +5 -3
  169. chia/_tests/wallet/test_sign_coin_spends.py +6 -6
  170. chia/_tests/wallet/test_signer_protocol.py +13 -12
  171. chia/_tests/wallet/test_singleton.py +1 -1
  172. chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
  173. chia/_tests/wallet/test_util.py +2 -2
  174. chia/_tests/wallet/test_wallet.py +108 -29
  175. chia/_tests/wallet/test_wallet_action_scope.py +9 -2
  176. chia/_tests/wallet/test_wallet_blockchain.py +2 -3
  177. chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
  178. chia/_tests/wallet/test_wallet_node.py +2 -4
  179. chia/_tests/wallet/test_wallet_retry.py +4 -2
  180. chia/_tests/wallet/test_wallet_state_manager.py +191 -5
  181. chia/_tests/wallet/test_wallet_test_framework.py +1 -1
  182. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
  183. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
  184. chia/_tests/wallet/wallet_block_tools.py +6 -6
  185. chia/_tests/weight_proof/test_weight_proof.py +10 -48
  186. chia/apis.py +1 -1
  187. chia/cmds/beta.py +1 -1
  188. chia/cmds/chia.py +9 -9
  189. chia/cmds/cmd_classes.py +12 -11
  190. chia/cmds/cmd_helpers.py +1 -1
  191. chia/cmds/cmds_util.py +12 -9
  192. chia/cmds/coin_funcs.py +2 -2
  193. chia/cmds/configure.py +2 -2
  194. chia/cmds/data.py +0 -2
  195. chia/cmds/data_funcs.py +1 -1
  196. chia/cmds/db_validate_func.py +1 -2
  197. chia/cmds/dev/__init__.py +0 -0
  198. chia/cmds/dev/data.py +273 -0
  199. chia/cmds/{gh.py → dev/gh.py} +5 -5
  200. chia/cmds/dev/main.py +22 -0
  201. chia/cmds/dev/mempool.py +78 -0
  202. chia/cmds/dev/mempool_funcs.py +63 -0
  203. chia/cmds/farm_funcs.py +5 -4
  204. chia/cmds/init_funcs.py +11 -11
  205. chia/cmds/keys.py +2 -2
  206. chia/cmds/keys_funcs.py +4 -4
  207. chia/cmds/netspace_funcs.py +1 -1
  208. chia/cmds/peer_funcs.py +2 -2
  209. chia/cmds/plotnft_funcs.py +72 -26
  210. chia/cmds/rpc.py +1 -1
  211. chia/cmds/show_funcs.py +5 -5
  212. chia/cmds/signer.py +8 -7
  213. chia/cmds/sim_funcs.py +8 -9
  214. chia/cmds/wallet.py +2 -2
  215. chia/cmds/wallet_funcs.py +165 -131
  216. chia/{util → consensus}/augmented_chain.py +1 -2
  217. chia/consensus/block_body_validation.py +54 -40
  218. chia/consensus/block_creation.py +42 -76
  219. chia/consensus/block_header_validation.py +32 -26
  220. chia/consensus/block_record.py +0 -3
  221. chia/consensus/blockchain.py +23 -32
  222. chia/consensus/blockchain_interface.py +1 -5
  223. chia/consensus/check_time_locks.py +57 -0
  224. chia/consensus/coin_store_protocol.py +151 -0
  225. chia/consensus/coinbase.py +0 -6
  226. chia/consensus/condition_costs.py +4 -0
  227. chia/{util → consensus}/condition_tools.py +4 -5
  228. chia/consensus/cost_calculator.py +1 -1
  229. chia/consensus/default_constants.py +32 -9
  230. chia/consensus/deficit.py +1 -3
  231. chia/consensus/difficulty_adjustment.py +1 -2
  232. chia/consensus/find_fork_point.py +1 -3
  233. chia/consensus/full_block_to_block_record.py +1 -6
  234. chia/{util → consensus}/generator_tools.py +1 -3
  235. chia/consensus/get_block_challenge.py +30 -7
  236. chia/consensus/make_sub_epoch_summary.py +1 -5
  237. chia/consensus/multiprocess_validation.py +21 -20
  238. chia/consensus/pot_iterations.py +74 -13
  239. chia/{util → consensus}/prev_transaction_block.py +1 -1
  240. chia/consensus/vdf_info_computation.py +1 -3
  241. chia/daemon/keychain_proxy.py +5 -5
  242. chia/daemon/server.py +22 -5
  243. chia/data_layer/data_layer.py +92 -51
  244. chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
  245. chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
  246. chia/data_layer/data_layer_util.py +4 -6
  247. chia/data_layer/data_layer_wallet.py +42 -69
  248. chia/data_layer/dl_wallet_store.py +12 -6
  249. chia/data_layer/download_data.py +3 -3
  250. chia/data_layer/s3_plugin_service.py +0 -1
  251. chia/farmer/farmer.py +3 -4
  252. chia/farmer/farmer_api.py +11 -7
  253. chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
  254. chia/full_node/block_height_map.py +7 -6
  255. chia/full_node/block_store.py +5 -7
  256. chia/full_node/bundle_tools.py +1 -2
  257. chia/full_node/coin_store.py +153 -124
  258. chia/{types → full_node}/eligible_coin_spends.py +39 -70
  259. chia/full_node/fee_estimator.py +1 -1
  260. chia/full_node/fee_estimator_interface.py +0 -8
  261. chia/full_node/fee_tracker.py +25 -25
  262. chia/full_node/full_node.py +70 -53
  263. chia/full_node/full_node_api.py +57 -40
  264. chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
  265. chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
  266. chia/full_node/full_node_store.py +23 -8
  267. chia/full_node/mempool.py +206 -53
  268. chia/full_node/mempool_check_conditions.py +20 -63
  269. chia/full_node/mempool_manager.py +53 -47
  270. chia/full_node/subscriptions.py +1 -3
  271. chia/full_node/tx_processing_queue.py +50 -3
  272. chia/full_node/weight_proof.py +46 -37
  273. chia/harvester/harvester.py +1 -1
  274. chia/harvester/harvester_api.py +22 -7
  275. chia/introducer/introducer.py +1 -1
  276. chia/introducer/introducer_api.py +1 -1
  277. chia/plot_sync/exceptions.py +1 -1
  278. chia/plot_sync/receiver.py +1 -1
  279. chia/plot_sync/sender.py +2 -2
  280. chia/pools/pool_puzzles.py +13 -18
  281. chia/pools/pool_wallet.py +23 -46
  282. chia/protocols/farmer_protocol.py +11 -3
  283. chia/protocols/full_node_protocol.py +1 -4
  284. chia/protocols/harvester_protocol.py +3 -3
  285. chia/protocols/pool_protocol.py +1 -2
  286. chia/protocols/shared_protocol.py +3 -3
  287. chia/protocols/timelord_protocol.py +1 -3
  288. chia/protocols/wallet_protocol.py +3 -3
  289. chia/rpc/rpc_client.py +7 -8
  290. chia/rpc/rpc_server.py +3 -3
  291. chia/rpc/util.py +3 -1
  292. chia/seeder/crawler.py +1 -1
  293. chia/seeder/crawler_api.py +1 -1
  294. chia/seeder/dns_server.py +2 -0
  295. chia/seeder/start_crawler.py +3 -3
  296. chia/server/address_manager.py +286 -38
  297. chia/server/address_manager_store.py +0 -215
  298. chia/{types → server}/aliases.py +7 -7
  299. chia/server/api_protocol.py +1 -1
  300. chia/server/chia_policy.py +1 -1
  301. chia/server/node_discovery.py +76 -113
  302. chia/server/rate_limits.py +1 -1
  303. chia/server/resolve_peer_info.py +43 -0
  304. chia/server/server.py +5 -5
  305. chia/server/start_data_layer.py +4 -4
  306. chia/server/start_farmer.py +5 -4
  307. chia/server/start_full_node.py +5 -4
  308. chia/server/start_harvester.py +7 -5
  309. chia/server/start_introducer.py +2 -2
  310. chia/server/start_service.py +1 -1
  311. chia/server/start_timelord.py +7 -5
  312. chia/server/start_wallet.py +7 -5
  313. chia/server/ws_connection.py +1 -1
  314. chia/simulator/add_blocks_in_batches.py +2 -2
  315. chia/simulator/block_tools.py +245 -201
  316. chia/simulator/full_node_simulator.py +38 -10
  317. chia/simulator/setup_services.py +12 -12
  318. chia/simulator/simulator_full_node_rpc_api.py +2 -2
  319. chia/simulator/simulator_full_node_rpc_client.py +2 -2
  320. chia/simulator/simulator_test_tools.py +2 -2
  321. chia/simulator/start_simulator.py +1 -1
  322. chia/simulator/wallet_tools.py +10 -18
  323. chia/ssl/create_ssl.py +1 -1
  324. chia/timelord/iters_from_block.py +14 -14
  325. chia/timelord/timelord.py +15 -11
  326. chia/timelord/timelord_api.py +14 -2
  327. chia/timelord/timelord_state.py +20 -14
  328. chia/types/blockchain_format/program.py +53 -10
  329. chia/types/blockchain_format/proof_of_space.py +73 -19
  330. chia/types/coin_spend.py +3 -56
  331. chia/types/generator_types.py +28 -0
  332. chia/types/internal_mempool_item.py +1 -2
  333. chia/types/mempool_item.py +12 -7
  334. chia/types/unfinished_header_block.py +1 -2
  335. chia/types/validation_state.py +1 -2
  336. chia/types/weight_proof.py +1 -3
  337. chia/util/action_scope.py +3 -3
  338. chia/util/block_cache.py +1 -2
  339. chia/util/byte_types.py +1 -1
  340. chia/util/casts.py +21 -0
  341. chia/util/config.py +0 -37
  342. chia/util/db_wrapper.py +8 -1
  343. chia/util/errors.py +3 -2
  344. chia/util/initial-config.yaml +21 -5
  345. chia/util/keychain.py +6 -7
  346. chia/util/keyring_wrapper.py +5 -5
  347. chia/util/limited_semaphore.py +1 -1
  348. chia/util/priority_mutex.py +1 -1
  349. chia/util/streamable.py +63 -5
  350. chia/util/task_timing.py +1 -1
  351. chia/util/virtual_project_analysis.py +1 -1
  352. chia/wallet/cat_wallet/cat_info.py +7 -3
  353. chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
  354. chia/wallet/cat_wallet/cat_utils.py +1 -1
  355. chia/wallet/cat_wallet/cat_wallet.py +44 -36
  356. chia/wallet/cat_wallet/lineage_store.py +7 -0
  357. chia/wallet/cat_wallet/r_cat_wallet.py +274 -0
  358. chia/wallet/conditions.py +5 -10
  359. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
  360. chia/wallet/derivation_record.py +33 -0
  361. chia/wallet/derive_keys.py +3 -3
  362. chia/wallet/did_wallet/did_info.py +12 -3
  363. chia/wallet/did_wallet/did_wallet.py +132 -101
  364. chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
  365. chia/wallet/driver_protocol.py +3 -1
  366. chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
  367. chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
  368. chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
  369. chia/wallet/nft_wallet/nft_wallet.py +69 -112
  370. chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
  371. chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
  372. chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
  373. chia/wallet/nft_wallet/uncurry_nft.py +4 -6
  374. chia/wallet/notification_manager.py +2 -3
  375. chia/wallet/outer_puzzles.py +7 -2
  376. chia/wallet/puzzle_drivers.py +1 -1
  377. chia/wallet/puzzles/clawback/drivers.py +5 -4
  378. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
  379. chia/wallet/puzzles/singleton_top_layer.py +2 -1
  380. chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
  381. chia/wallet/puzzles/tails.py +1 -3
  382. chia/wallet/signer_protocol.py +5 -6
  383. chia/wallet/singleton.py +5 -4
  384. chia/wallet/singleton_record.py +1 -1
  385. chia/wallet/trade_manager.py +18 -20
  386. chia/wallet/trade_record.py +3 -6
  387. chia/wallet/trading/offer.py +12 -13
  388. chia/wallet/uncurried_puzzle.py +2 -2
  389. chia/wallet/util/compute_additions.py +58 -0
  390. chia/wallet/util/compute_hints.py +3 -3
  391. chia/wallet/util/compute_memos.py +4 -4
  392. chia/wallet/util/curry_and_treehash.py +2 -1
  393. chia/wallet/util/debug_spend_bundle.py +1 -1
  394. chia/wallet/util/merkle_tree.py +1 -1
  395. chia/wallet/util/peer_request_cache.py +1 -2
  396. chia/wallet/util/tx_config.py +3 -8
  397. chia/wallet/util/wallet_sync_utils.py +10 -5
  398. chia/wallet/util/wallet_types.py +1 -0
  399. chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
  400. chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
  401. chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
  402. chia/wallet/vc_wallet/vc_drivers.py +50 -8
  403. chia/wallet/vc_wallet/vc_store.py +3 -5
  404. chia/wallet/vc_wallet/vc_wallet.py +15 -22
  405. chia/wallet/wallet.py +36 -46
  406. chia/wallet/wallet_action_scope.py +73 -4
  407. chia/wallet/wallet_blockchain.py +1 -3
  408. chia/wallet/wallet_interested_store.py +1 -1
  409. chia/wallet/wallet_nft_store.py +3 -3
  410. chia/wallet/wallet_node.py +17 -16
  411. chia/wallet/wallet_node_api.py +4 -5
  412. chia/wallet/wallet_pool_store.py +1 -1
  413. chia/wallet/wallet_protocol.py +2 -0
  414. chia/wallet/wallet_puzzle_store.py +1 -1
  415. chia/{rpc → wallet}/wallet_request_types.py +670 -81
  416. chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
  417. chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
  418. chia/wallet/wallet_singleton_store.py +8 -7
  419. chia/wallet/wallet_spend_bundle.py +4 -3
  420. chia/wallet/wallet_state_manager.py +320 -191
  421. chia/wallet/wallet_weight_proof_handler.py +1 -2
  422. chia/wallet/wsm_apis.py +98 -0
  423. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/RECORD +443 -436
  425. mozilla-ca/cacert.pem +3 -165
  426. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
  427. chia/cmds/dev.py +0 -18
  428. chia/types/blockchain_format/slots.py +0 -9
  429. chia/types/blockchain_format/sub_epoch_summary.py +0 -5
  430. chia/types/end_of_slot_bundle.py +0 -5
  431. chia/types/full_block.py +0 -5
  432. chia/types/header_block.py +0 -5
  433. chia/types/spend_bundle_conditions.py +0 -7
  434. chia/types/transaction_queue_entry.py +0 -56
  435. chia/types/unfinished_block.py +0 -5
  436. /chia/cmds/{installers.py → dev/installers.py} +0 -0
  437. /chia/cmds/{sim.py → dev/sim.py} +0 -0
  438. /chia/{util → cmds}/dump_keyring.py +0 -0
  439. /chia/{full_node → consensus}/signage_point.py +0 -0
  440. /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
  441. /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
  442. /chia/{util → full_node}/full_block_utils.py +0 -0
  443. /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
  444. /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
  445. /chia/{full_node → protocols}/fee_estimate.py +0 -0
  446. /chia/{server → protocols}/outbound_message.py +0 -0
  447. /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
  448. /chia/{util → simulator}/vdf_prover.py +0 -0
  449. /chia/{util → ssl}/ssl_check.py +0 -0
  450. /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
  451. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
@@ -2,16 +2,15 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Optional
4
4
 
5
- from chia_rs import SpendBundleConditions
5
+ from chia_rs import FullBlock, SpendBundleConditions
6
6
  from chia_rs.sized_ints import uint32, uint64
7
7
 
8
+ from chia.consensus.augmented_chain import AugmentedBlockchain
8
9
  from chia.consensus.block_body_validation import ForkInfo
9
10
  from chia.consensus.blockchain import AddBlockResult, Blockchain
10
11
  from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
11
12
  from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
12
- from chia.types.full_block import FullBlock
13
13
  from chia.types.validation_state import ValidationState
14
- from chia.util.augmented_chain import AugmentedBlockchain
15
14
  from chia.util.errors import Err
16
15
 
17
16
 
@@ -4,15 +4,14 @@ from dataclasses import dataclass, field
4
4
  from typing import TYPE_CHECKING, ClassVar, Optional, cast
5
5
 
6
6
  import pytest
7
+ from chia_rs import BlockRecord, FullBlock
7
8
  from chia_rs.sized_bytes import bytes32
8
9
  from chia_rs.sized_ints import uint32
9
10
 
10
11
  from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
11
12
  from chia._tests.util.blockchain import create_blockchain
12
- from chia.consensus.block_record import BlockRecord
13
+ from chia.consensus.augmented_chain import AugmentedBlockchain
13
14
  from chia.simulator.block_tools import BlockTools
14
- from chia.types.full_block import FullBlock
15
- from chia.util.augmented_chain import AugmentedBlockchain
16
15
  from chia.util.errors import Err
17
16
 
18
17
 
@@ -1,19 +1,34 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import copy
4
5
  import logging
5
6
  import random
6
7
  import time
7
8
  from collections.abc import AsyncIterator, Awaitable
8
9
  from contextlib import asynccontextmanager
9
- from dataclasses import replace
10
+ from dataclasses import dataclass, replace
10
11
  from typing import Optional
11
12
 
12
13
  import pytest
13
- from chia_rs import AugSchemeMPL, ConsensusConstants, G2Element, MerkleSet, TransactionsInfo
14
+ from chia_rs import (
15
+ AugSchemeMPL,
16
+ BlockRecord,
17
+ ConsensusConstants,
18
+ EndOfSubSlotBundle,
19
+ FullBlock,
20
+ G2Element,
21
+ InfusedChallengeChainSubSlot,
22
+ MerkleSet,
23
+ SpendBundle,
24
+ SpendBundleConditions,
25
+ SpendConditions,
26
+ TransactionsInfo,
27
+ UnfinishedBlock,
28
+ is_canonical_serialization,
29
+ )
14
30
  from chia_rs.sized_bytes import bytes32
15
31
  from chia_rs.sized_ints import uint8, uint32, uint64
16
- from clvm.casts import int_to_bytes
17
32
 
18
33
  from chia._tests.blockchain.blockchain_test_utils import (
19
34
  _validate_and_add_block,
@@ -25,40 +40,35 @@ from chia._tests.blockchain.blockchain_test_utils import (
25
40
  from chia._tests.conftest import ConsensusMode
26
41
  from chia._tests.util.blockchain import create_blockchain
27
42
  from chia._tests.util.get_name_puzzle_conditions import get_name_puzzle_conditions
28
- from chia.consensus.block_body_validation import ForkInfo
43
+ from chia.consensus.augmented_chain import AugmentedBlockchain
44
+ from chia.consensus.block_body_validation import ForkAdd, ForkInfo
29
45
  from chia.consensus.block_header_validation import validate_finished_header_block
30
- from chia.consensus.block_record import BlockRecord
31
46
  from chia.consensus.block_rewards import calculate_base_farmer_reward
32
47
  from chia.consensus.blockchain import AddBlockResult, Blockchain
33
48
  from chia.consensus.coinbase import create_farmer_coin
34
49
  from chia.consensus.find_fork_point import lookup_fork_chain
35
50
  from chia.consensus.full_block_to_block_record import block_to_block_record
51
+ from chia.consensus.generator_tools import get_block_header
36
52
  from chia.consensus.get_block_generator import get_block_generator
37
53
  from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
38
54
  from chia.consensus.pot_iterations import is_overflow_block
39
55
  from chia.simulator.block_tools import BlockTools, create_block_tools_async
40
56
  from chia.simulator.keyring import TempKeyring
57
+ from chia.simulator.vdf_prover import get_vdf_info_and_proof
41
58
  from chia.simulator.wallet_tools import WalletTool
42
59
  from chia.types.blockchain_format.classgroup import ClassgroupElement
43
60
  from chia.types.blockchain_format.coin import Coin
44
61
  from chia.types.blockchain_format.serialized_program import SerializedProgram
45
- from chia.types.blockchain_format.slots import InfusedChallengeChainSubSlot
46
62
  from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
47
63
  from chia.types.condition_opcodes import ConditionOpcode
48
64
  from chia.types.condition_with_args import ConditionWithArgs
49
- from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
50
- from chia.types.full_block import FullBlock
51
65
  from chia.types.generator_types import BlockGenerator
52
- from chia.types.spend_bundle import SpendBundle
53
- from chia.types.unfinished_block import UnfinishedBlock
54
66
  from chia.types.validation_state import ValidationState
55
- from chia.util.augmented_chain import AugmentedBlockchain
67
+ from chia.util.casts import int_to_bytes
56
68
  from chia.util.errors import Err
57
- from chia.util.generator_tools import get_block_header
58
69
  from chia.util.hash import std_hash
59
70
  from chia.util.keychain import Keychain
60
71
  from chia.util.recursive_replace import recursive_replace
61
- from chia.util.vdf_prover import get_vdf_info_and_proof
62
72
  from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import (
63
73
  DEFAULT_HIDDEN_PUZZLE_HASH,
64
74
  calculate_synthetic_secret_key,
@@ -166,7 +176,7 @@ class TestBlockHeaderValidation:
166
176
  uint64(10_000_000),
167
177
  )
168
178
  block_bad = recursive_replace(
169
- block, "finished_sub_slots", [new_finished_ss] + block.finished_sub_slots[1:]
179
+ block, "finished_sub_slots", [new_finished_ss, *block.finished_sub_slots[1:]]
170
180
  )
171
181
  header_block_bad = get_block_header(block_bad)
172
182
  # TODO: Inspect these block values as they are currently None
@@ -190,7 +200,7 @@ class TestBlockHeaderValidation:
190
200
  uint64(10_000_000),
191
201
  )
192
202
  block_bad_2 = recursive_replace(
193
- block, "finished_sub_slots", [new_finished_ss_2] + block.finished_sub_slots[1:]
203
+ block, "finished_sub_slots", [new_finished_ss_2, *block.finished_sub_slots[1:]]
194
204
  )
195
205
 
196
206
  header_block_bad_2 = get_block_header(block_bad_2)
@@ -504,7 +514,7 @@ class TestBlockHeaderValidation:
504
514
  bytes([2] * 32),
505
515
  )
506
516
  block_0_bad = recursive_replace(
507
- blocks[0], "finished_sub_slots", [new_finished_ss] + blocks[0].finished_sub_slots[1:]
517
+ blocks[0], "finished_sub_slots", [new_finished_ss, *blocks[0].finished_sub_slots[1:]]
508
518
  )
509
519
 
510
520
  header_block_bad = get_block_header(block_0_bad)
@@ -532,7 +542,7 @@ class TestBlockHeaderValidation:
532
542
  bytes([2] * 32),
533
543
  )
534
544
  block_1_bad = recursive_replace(
535
- blocks[1], "finished_sub_slots", [new_finished_ss] + blocks[1].finished_sub_slots[1:]
545
+ blocks[1], "finished_sub_slots", [new_finished_ss, *blocks[1].finished_sub_slots[1:]]
536
546
  )
537
547
 
538
548
  await _validate_and_add_block(empty_blockchain, blocks[0])
@@ -559,7 +569,7 @@ class TestBlockHeaderValidation:
559
569
  bytes([2] * 32),
560
570
  )
561
571
  block_1_bad = recursive_replace(
562
- blocks[1], "finished_sub_slots", blocks[1].finished_sub_slots[:-1] + [new_finished_ss]
572
+ blocks[1], "finished_sub_slots", [*blocks[1].finished_sub_slots[:-1], new_finished_ss]
563
573
  )
564
574
  await _validate_and_add_block(empty_blockchain, blocks[0])
565
575
 
@@ -591,7 +601,7 @@ class TestBlockHeaderValidation:
591
601
  ),
592
602
  )
593
603
  block_0_bad = recursive_replace(
594
- blocks[0], "finished_sub_slots", [new_finished_ss] + blocks[0].finished_sub_slots[1:]
604
+ blocks[0], "finished_sub_slots", [new_finished_ss, *blocks[0].finished_sub_slots[1:]]
595
605
  )
596
606
  await _validate_and_add_block(empty_blockchain, block_0_bad, expected_error=Err.SHOULD_NOT_HAVE_ICC)
597
607
 
@@ -625,7 +635,7 @@ class TestBlockHeaderValidation:
625
635
  ),
626
636
  )
627
637
  block_bad = recursive_replace(
628
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss]
638
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss]
629
639
  )
630
640
  await _validate_and_add_block(bc1, block_bad, expected_error=Err.INVALID_ICC_EOS_VDF)
631
641
 
@@ -643,7 +653,7 @@ class TestBlockHeaderValidation:
643
653
  )
644
654
  log.warning(f"Proof: {block.finished_sub_slots[-1].proofs}")
645
655
  block_bad_2 = recursive_replace(
646
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_2]
656
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_2]
647
657
  )
648
658
  await _validate_and_add_block(bc1, block_bad_2, expected_error=Err.INVALID_ICC_EOS_VDF)
649
659
 
@@ -660,7 +670,7 @@ class TestBlockHeaderValidation:
660
670
  ),
661
671
  )
662
672
  block_bad_3 = recursive_replace(
663
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_3]
673
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_3]
664
674
  )
665
675
  await _validate_and_add_block(bc1, block_bad_3, expected_error=Err.INVALID_ICC_EOS_VDF)
666
676
 
@@ -671,7 +681,7 @@ class TestBlockHeaderValidation:
671
681
  VDFProof(uint8(0), b"1239819023890", False),
672
682
  )
673
683
  block_bad_5 = recursive_replace(
674
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_5]
684
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_5]
675
685
  )
676
686
  await _validate_and_add_block(bc1, block_bad_5, expected_error=Err.INVALID_ICC_EOS_VDF)
677
687
 
@@ -715,7 +725,7 @@ class TestBlockHeaderValidation:
715
725
  ),
716
726
  )
717
727
  block_bad = recursive_replace(
718
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss]
728
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss]
719
729
  )
720
730
 
721
731
  header_block_bad = get_block_header(block_bad)
@@ -737,7 +747,7 @@ class TestBlockHeaderValidation:
737
747
  block.finished_sub_slots[-1].reward_chain.replace(infused_challenge_chain_sub_slot_hash=None),
738
748
  )
739
749
  block_bad = recursive_replace(
740
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_bad_rc]
750
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_bad_rc]
741
751
  )
742
752
  await _validate_and_add_block(blockchain, block_bad, expected_error=Err.INVALID_ICC_HASH_RC)
743
753
  elif len(block.finished_sub_slots) > 0 and block.finished_sub_slots[-1].infused_challenge_chain is None:
@@ -751,7 +761,7 @@ class TestBlockHeaderValidation:
751
761
  ),
752
762
  )
753
763
  block_bad = recursive_replace(
754
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_bad_cc]
764
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_bad_cc]
755
765
  )
756
766
  await _validate_and_add_block(blockchain, block_bad, expected_error=Err.INVALID_ICC_HASH_CC)
757
767
 
@@ -765,7 +775,7 @@ class TestBlockHeaderValidation:
765
775
  ),
766
776
  )
767
777
  block_bad = recursive_replace(
768
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_bad_rc]
778
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_bad_rc]
769
779
  )
770
780
  await _validate_and_add_block(blockchain, block_bad, expected_error=Err.INVALID_ICC_HASH_RC)
771
781
 
@@ -786,7 +796,7 @@ class TestBlockHeaderValidation:
786
796
  blocks[-1].finished_sub_slots[-1].challenge_chain.replace(subepoch_summary_hash=std_hash(b"0")),
787
797
  )
788
798
  block_bad = recursive_replace(
789
- blocks[-1], "finished_sub_slots", blocks[-1].finished_sub_slots[:-1] + [new_finished_ss]
799
+ blocks[-1], "finished_sub_slots", [*blocks[-1].finished_sub_slots[:-1], new_finished_ss]
790
800
  )
791
801
 
792
802
  header_block_bad = get_block_header(block_bad)
@@ -835,7 +845,7 @@ class TestBlockHeaderValidation:
835
845
  blocks[-1].finished_sub_slots[-1].reward_chain.replace(challenge_chain_sub_slot_hash=bytes32([3] * 32)),
836
846
  )
837
847
  block_1_bad = recursive_replace(
838
- blocks[-1], "finished_sub_slots", blocks[-1].finished_sub_slots[:-1] + [new_finished_ss]
848
+ blocks[-1], "finished_sub_slots", [*blocks[-1].finished_sub_slots[:-1], new_finished_ss]
839
849
  )
840
850
 
841
851
  await _validate_and_add_block(blockchain, block_1_bad, expected_error=Err.INVALID_CHALLENGE_SLOT_HASH_RC)
@@ -873,7 +883,7 @@ class TestBlockHeaderValidation:
873
883
  )
874
884
  log.warning(f"Num slots: {len(block.finished_sub_slots)}")
875
885
  block_bad = recursive_replace(
876
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss]
886
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss]
877
887
  )
878
888
  log.warning(f"Signage point index: {block_bad.reward_chain_block.signage_point_index}")
879
889
  await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_CC_EOS_VDF)
@@ -895,7 +905,7 @@ class TestBlockHeaderValidation:
895
905
  new_finished_ss_2.challenge_chain.get_hash(),
896
906
  )
897
907
  block_bad_2 = recursive_replace(
898
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_2]
908
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_2]
899
909
  )
900
910
  await _validate_and_add_block(empty_blockchain, block_bad_2, expected_error=Err.INVALID_CC_EOS_VDF)
901
911
 
@@ -916,7 +926,7 @@ class TestBlockHeaderValidation:
916
926
  new_finished_ss_3.challenge_chain.get_hash(),
917
927
  )
918
928
  block_bad_3 = recursive_replace(
919
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_3]
929
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_3]
920
930
  )
921
931
 
922
932
  await _validate_and_add_block_multi_error(
@@ -932,7 +942,7 @@ class TestBlockHeaderValidation:
932
942
  VDFProof(uint8(0), b"1239819023890", False),
933
943
  )
934
944
  block_bad_5 = recursive_replace(
935
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_5]
945
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_5]
936
946
  )
937
947
  await _validate_and_add_block(empty_blockchain, block_bad_5, expected_error=Err.INVALID_CC_EOS_VDF)
938
948
 
@@ -964,7 +974,7 @@ class TestBlockHeaderValidation:
964
974
  ),
965
975
  )
966
976
  block_bad = recursive_replace(
967
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss]
977
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss]
968
978
  )
969
979
  await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_RC_EOS_VDF)
970
980
 
@@ -979,7 +989,7 @@ class TestBlockHeaderValidation:
979
989
  ),
980
990
  )
981
991
  block_bad_2 = recursive_replace(
982
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_2]
992
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_2]
983
993
  )
984
994
  await _validate_and_add_block(empty_blockchain, block_bad_2, expected_error=Err.INVALID_RC_EOS_VDF)
985
995
 
@@ -994,7 +1004,7 @@ class TestBlockHeaderValidation:
994
1004
  ),
995
1005
  )
996
1006
  block_bad_3 = recursive_replace(
997
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_3]
1007
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_3]
998
1008
  )
999
1009
  await _validate_and_add_block(empty_blockchain, block_bad_3, expected_error=Err.INVALID_RC_EOS_VDF)
1000
1010
 
@@ -1005,7 +1015,7 @@ class TestBlockHeaderValidation:
1005
1015
  VDFProof(uint8(0), b"1239819023890", False),
1006
1016
  )
1007
1017
  block_bad_5 = recursive_replace(
1008
- block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss_5]
1018
+ block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_5]
1009
1019
  )
1010
1020
  await _validate_and_add_block(empty_blockchain, block_bad_5, expected_error=Err.INVALID_RC_EOS_VDF)
1011
1021
 
@@ -1024,7 +1034,7 @@ class TestBlockHeaderValidation:
1024
1034
  bt.constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK - 1,
1025
1035
  ),
1026
1036
  )
1027
- block_bad = recursive_replace(block, "finished_sub_slots", block.finished_sub_slots[:-1] + [new_finished_ss])
1037
+ block_bad = recursive_replace(block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss])
1028
1038
  await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_DEFICIT)
1029
1039
 
1030
1040
  @pytest.mark.anyio
@@ -1053,7 +1063,7 @@ class TestBlockHeaderValidation:
1053
1063
  case_2 = True
1054
1064
 
1055
1065
  block_bad = recursive_replace(
1056
- blocks[-1], "finished_sub_slots", blocks[-1].finished_sub_slots[:-1] + [new_finished_ss]
1066
+ blocks[-1], "finished_sub_slots", [*blocks[-1].finished_sub_slots[:-1], new_finished_ss]
1057
1067
  )
1058
1068
  await _validate_and_add_block_multi_error(
1059
1069
  empty_blockchain, block_bad, [Err.INVALID_DEFICIT, Err.INVALID_ICC_HASH_CC]
@@ -1082,7 +1092,7 @@ class TestBlockHeaderValidation:
1082
1092
  challenge_chain_sub_slot_hash=new_finished_ss.challenge_chain.get_hash()
1083
1093
  ),
1084
1094
  )
1085
- block_bad = recursive_replace(block, "finished_sub_slots", [new_finished_ss] + block.finished_sub_slots[1:])
1095
+ block_bad = recursive_replace(block, "finished_sub_slots", [new_finished_ss, *block.finished_sub_slots[1:]])
1086
1096
  with pytest.raises(AssertionError):
1087
1097
  # Fails pre validation
1088
1098
  await _validate_and_add_block(
@@ -1118,7 +1128,7 @@ class TestBlockHeaderValidation:
1118
1128
  ),
1119
1129
  )
1120
1130
  block_bad = recursive_replace(
1121
- blocks[-1], "finished_sub_slots", [new_finished_ss] + blocks[-1].finished_sub_slots[1:]
1131
+ blocks[-1], "finished_sub_slots", [new_finished_ss, *blocks[-1].finished_sub_slots[1:]]
1122
1132
  )
1123
1133
  await _validate_and_add_block_multi_error(
1124
1134
  empty_blockchain,
@@ -1150,7 +1160,7 @@ class TestBlockHeaderValidation:
1150
1160
  )
1151
1161
  await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
1152
1162
 
1153
- block_bad = recursive_replace(blocks[-1], "reward_chain_block.proof_of_space.size", 62)
1163
+ block_bad = recursive_replace(blocks[-1], "reward_chain_block.proof_of_space.version_and_size", 62)
1154
1164
  await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
1155
1165
 
1156
1166
  block_bad = recursive_replace(
@@ -1161,14 +1171,14 @@ class TestBlockHeaderValidation:
1161
1171
  await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
1162
1172
  block_bad = recursive_replace(
1163
1173
  blocks[-1],
1164
- "reward_chain_block.proof_of_space.size",
1174
+ "reward_chain_block.proof_of_space.version_and_size",
1165
1175
  32,
1166
1176
  )
1167
1177
  await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
1168
1178
  block_bad = recursive_replace(
1169
1179
  blocks[-1],
1170
1180
  "reward_chain_block.proof_of_space.proof",
1171
- bytes([1] * int(blocks[-1].reward_chain_block.proof_of_space.size * 64 / 8)),
1181
+ bytes([1] * int((blocks[-1].reward_chain_block.proof_of_space.version_and_size & 0x7F) * 64 / 8)),
1172
1182
  )
1173
1183
  await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
1174
1184
 
@@ -3642,6 +3652,41 @@ class TestReorgs:
3642
3652
  assert len(blocks) == 200
3643
3653
  assert blocks[-1].height == 199
3644
3654
 
3655
+ @pytest.mark.anyio
3656
+ async def test_overlong_generator_encoding(
3657
+ self, empty_blockchain: Blockchain, bt: BlockTools, consensus_mode: ConsensusMode
3658
+ ) -> None:
3659
+ # add enough blocks to pass the hard fork
3660
+ blocks = bt.get_consecutive_blocks(10)
3661
+ for b in blocks[:-1]:
3662
+ await _validate_and_add_block(empty_blockchain, b)
3663
+
3664
+ while not blocks[-1].is_transaction_block():
3665
+ await _validate_and_add_block(empty_blockchain, blocks[-1])
3666
+ blocks = bt.get_consecutive_blocks(1, block_list_input=blocks)
3667
+ original_block: FullBlock = blocks[-1]
3668
+
3669
+ # overlong encoding
3670
+ generator = SerializedProgram.fromhex("c00101")
3671
+ assert not is_canonical_serialization(bytes(generator))
3672
+
3673
+ block = recursive_replace(original_block, "transactions_generator", generator)
3674
+ block = recursive_replace(block, "transactions_info.generator_root", std_hash(bytes(generator)))
3675
+ block = recursive_replace(
3676
+ block, "foliage_transaction_block.transactions_info_hash", std_hash(bytes(block.transactions_info))
3677
+ )
3678
+ block = recursive_replace(
3679
+ block, "foliage.foliage_transaction_block_hash", std_hash(bytes(block.foliage_transaction_block))
3680
+ )
3681
+
3682
+ # overlong encoding became invalid in the 3.0 hard fork
3683
+ if consensus_mode == ConsensusMode.HARD_FORK_3_0:
3684
+ expected_error = Err.INVALID_TRANSACTIONS_GENERATOR_ENCODING
3685
+ else:
3686
+ expected_error = None
3687
+
3688
+ await _validate_and_add_block(empty_blockchain, block, expected_error=expected_error, skip_prevalidation=True)
3689
+
3645
3690
 
3646
3691
  @pytest.mark.anyio
3647
3692
  async def test_reorg_new_ref(empty_blockchain: Blockchain, bt: BlockTools) -> None:
@@ -4193,3 +4238,175 @@ async def test_get_header_blocks_in_range_tx_filter_non_tx_block(empty_blockchai
4193
4238
  blocks_with_filter = await b.get_header_blocks_in_range(0, 42, tx_filter=True)
4194
4239
  empty_tx_filter = b"\x00"
4195
4240
  assert blocks_with_filter[non_tx_block.header_hash].transactions_filter == empty_tx_filter
4241
+
4242
+
4243
+ @dataclass(frozen=True)
4244
+ class ForkInfoTestSetup:
4245
+ fork_info: ForkInfo
4246
+ initial_additions_since_fork: dict[bytes32, ForkAdd]
4247
+ test_block: FullBlock
4248
+ coin: Coin
4249
+ child_coin: Coin
4250
+
4251
+ @classmethod
4252
+ def create(cls, same_ph_as_parent: bool, same_amount_as_parent: bool) -> ForkInfoTestSetup:
4253
+ from chia._tests.util.network_protocol_data import full_block as test_block
4254
+
4255
+ unrelated_coin = Coin(bytes32([0] * 32), bytes32([1] * 32), uint64(42))
4256
+ # We add this initial state with an unrelated addition, to create a
4257
+ # difference between the `rollback` state and the completely empty
4258
+ # `reset` state.
4259
+ initial_additions_since_fork = {
4260
+ unrelated_coin.name(): ForkAdd(
4261
+ coin=unrelated_coin,
4262
+ confirmed_height=uint32(1),
4263
+ timestamp=uint64(0),
4264
+ hint=None,
4265
+ is_coinbase=False,
4266
+ same_as_parent=False,
4267
+ )
4268
+ }
4269
+ fork_info = ForkInfo(
4270
+ test_block.height - 1,
4271
+ test_block.height - 1,
4272
+ test_block.prev_header_hash,
4273
+ additions_since_fork=copy.copy(initial_additions_since_fork),
4274
+ )
4275
+ puzzle_hash = bytes32([2] * 32)
4276
+ amount = uint64(1337)
4277
+ coin = Coin(bytes32([3] * 32), puzzle_hash, amount)
4278
+ child_coin_ph = puzzle_hash if same_ph_as_parent else bytes32([4] * 32)
4279
+ child_coin_amount = amount if same_amount_as_parent else uint64(0)
4280
+ child_coin = Coin(coin.name(), child_coin_ph, child_coin_amount)
4281
+ return cls(
4282
+ fork_info=fork_info,
4283
+ initial_additions_since_fork=initial_additions_since_fork,
4284
+ test_block=test_block,
4285
+ coin=coin,
4286
+ child_coin=child_coin,
4287
+ )
4288
+
4289
+ def check_additions(self, expected_same_parent_additions: set[bytes32]) -> None:
4290
+ assert all(
4291
+ a in self.fork_info.additions_since_fork and self.fork_info.additions_since_fork[a].same_as_parent
4292
+ for a in expected_same_parent_additions
4293
+ )
4294
+ remaining_additions = set(self.fork_info.additions_since_fork) - expected_same_parent_additions
4295
+ assert not any(self.fork_info.additions_since_fork[a].same_as_parent for a in remaining_additions)
4296
+
4297
+
4298
+ @pytest.mark.parametrize("same_ph_as_parent", [True, False])
4299
+ @pytest.mark.parametrize("same_amount_as_parent", [True, False])
4300
+ @pytest.mark.parametrize("rollback", [True, False])
4301
+ @pytest.mark.parametrize("reset", [True, False])
4302
+ @pytest.mark.anyio
4303
+ async def test_include_spends_same_as_parent(
4304
+ same_ph_as_parent: bool, same_amount_as_parent: bool, rollback: bool, reset: bool
4305
+ ) -> None:
4306
+ """
4307
+ Tests that `ForkInfo` properly tracks same-as-parent created coins.
4308
+ A created coin is tracked as such if its puzzle hash and amount match the
4309
+ parent. We're covering here `include_spends`, `rollback` and `reset` in the
4310
+ context of same-as-parent coins.
4311
+ """
4312
+ test_setup = ForkInfoTestSetup.create(same_ph_as_parent, same_amount_as_parent)
4313
+ # Now let's prepare the test spend bundle conditions
4314
+ create_coin = [(test_setup.child_coin.puzzle_hash, test_setup.child_coin.amount, None)]
4315
+ conds = SpendBundleConditions(
4316
+ [
4317
+ SpendConditions(
4318
+ test_setup.coin.name(),
4319
+ test_setup.coin.parent_coin_info,
4320
+ test_setup.coin.puzzle_hash,
4321
+ test_setup.coin.amount,
4322
+ None,
4323
+ None,
4324
+ None,
4325
+ None,
4326
+ None,
4327
+ None,
4328
+ create_coin,
4329
+ [],
4330
+ [],
4331
+ [],
4332
+ [],
4333
+ [],
4334
+ [],
4335
+ [],
4336
+ 0,
4337
+ 0,
4338
+ 0,
4339
+ )
4340
+ ],
4341
+ 0,
4342
+ 0,
4343
+ 0,
4344
+ None,
4345
+ None,
4346
+ [],
4347
+ 0,
4348
+ 0,
4349
+ 0,
4350
+ True,
4351
+ 0,
4352
+ 0,
4353
+ )
4354
+ # Now let's run the test
4355
+ test_setup.fork_info.include_spends(conds, test_setup.test_block, test_setup.test_block.header_hash)
4356
+ # Let's make sure the results are as expected
4357
+ expected_same_parent_additions = (
4358
+ {test_setup.child_coin.name()} if same_ph_as_parent and same_amount_as_parent else set()
4359
+ )
4360
+ test_setup.check_additions(expected_same_parent_additions)
4361
+ if rollback:
4362
+ # Now we rollback before the spend that belongs to the test conditions
4363
+ test_setup.fork_info.rollback(test_setup.test_block.prev_header_hash, test_setup.test_block.height - 1)
4364
+ # That should leave only the initial additions we started with, which
4365
+ # are unrelated to the test conditions. We added this initial state to
4366
+ # create a difference between `rollback` state and the completely empty
4367
+ # `reset` state.
4368
+ assert test_setup.fork_info.additions_since_fork == test_setup.initial_additions_since_fork
4369
+ if reset:
4370
+ # Now we reset to a test height and header hash
4371
+ test_setup.fork_info.reset(1, bytes32([0] * 32))
4372
+ # That should leave this empty
4373
+ assert test_setup.fork_info.additions_since_fork == {}
4374
+
4375
+
4376
+ @pytest.mark.parametrize("same_ph_as_parent", [True, False])
4377
+ @pytest.mark.parametrize("same_amount_as_parent", [True, False])
4378
+ @pytest.mark.parametrize("rollback", [True, False])
4379
+ @pytest.mark.parametrize("reset", [True, False])
4380
+ @pytest.mark.anyio
4381
+ async def test_include_block_same_as_parent_coins(
4382
+ same_ph_as_parent: bool, same_amount_as_parent: bool, rollback: bool, reset: bool
4383
+ ) -> None:
4384
+ """
4385
+ Tests that `ForkInfo` properly tracks same-as-parent created coins.
4386
+ A created coin is tracked as such if its puzzle hash and amount match the
4387
+ parent. We're covering here `include_block`, `rollback` and `reset` in the
4388
+ context of such coins.
4389
+ """
4390
+ test_setup = ForkInfoTestSetup.create(same_ph_as_parent, same_amount_as_parent)
4391
+ # Now let's run the test
4392
+ test_setup.fork_info.include_block(
4393
+ [(test_setup.child_coin, None)],
4394
+ [(test_setup.coin.name(), test_setup.coin)],
4395
+ test_setup.test_block,
4396
+ test_setup.test_block.header_hash,
4397
+ )
4398
+ # Let's make sure the results are as expected
4399
+ expected_same_as_parent_additions = (
4400
+ {test_setup.child_coin.name()} if same_ph_as_parent and same_amount_as_parent else set()
4401
+ )
4402
+ test_setup.check_additions(expected_same_as_parent_additions)
4403
+ if rollback:
4404
+ # Now we rollback before the spend that belongs to the test conditions
4405
+ test_setup.fork_info.rollback(test_setup.test_block.prev_header_hash, test_setup.test_block.height - 1)
4406
+ # That should leave only the initial additions we started with
4407
+ assert test_setup.fork_info.additions_since_fork == test_setup.initial_additions_since_fork
4408
+ if reset:
4409
+ # Now we reset to a test height and header hash
4410
+ test_setup.fork_info.reset(1, bytes32([0] * 32))
4411
+ # That should leave this empty
4412
+ assert test_setup.fork_info.additions_since_fork == {}
@@ -3,9 +3,9 @@ from __future__ import annotations
3
3
  import logging
4
4
 
5
5
  import pytest
6
+ from chia_rs import SpendBundle
6
7
  from chia_rs.sized_bytes import bytes32
7
8
  from chia_rs.sized_ints import uint32, uint64
8
- from clvm.casts import int_to_bytes
9
9
 
10
10
  from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
11
11
  from chia._tests.util.generator_tools_testing import run_and_get_removals_and_additions
@@ -18,9 +18,10 @@ from chia.simulator.block_tools import BlockTools, test_constants
18
18
  from chia.simulator.wallet_tools import WalletTool
19
19
  from chia.types.condition_opcodes import ConditionOpcode
20
20
  from chia.types.condition_with_args import ConditionWithArgs
21
- from chia.types.spend_bundle import SpendBundle, estimate_fees
21
+ from chia.util.casts import int_to_bytes
22
22
  from chia.util.errors import Err
23
23
  from chia.wallet.conditions import AssertCoinAnnouncement, AssertPuzzleAnnouncement
24
+ from chia.wallet.estimate_fees import estimate_fees
24
25
 
25
26
  BURN_PUZZLE_HASH = bytes32(b"0" * 32)
26
27
 
@@ -65,7 +66,7 @@ class TestBlockchainTransactions:
65
66
  assert sb == spend_bundle
66
67
 
67
68
  last_block = blocks[-1]
68
- result = await full_node_1.mempool_manager.create_bundle_from_mempool(last_block.header_hash)
69
+ result = full_node_1.mempool_manager.create_bundle_from_mempool(last_block.header_hash)
69
70
  assert result is not None
70
71
  next_spendbundle, _ = result
71
72