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
@@ -1,26 +1,22 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Optional
5
4
 
6
5
  from chia_puzzles_py.programs import CHIALISP_DESERIALISATION
7
6
  from chia_rs import (
7
+ CoinSpend,
8
8
  ConsensusConstants,
9
9
  get_flags_for_height_and_constants,
10
10
  run_chia_program,
11
11
  )
12
12
  from chia_rs import get_puzzle_and_solution_for_coin2 as get_puzzle_and_solution_for_coin_rust
13
- from chia_rs.sized_bytes import bytes32
14
- from chia_rs.sized_ints import uint32, uint64
13
+ from chia_rs.sized_ints import uint64
15
14
 
15
+ from chia.consensus.condition_tools import conditions_for_solution
16
16
  from chia.types.blockchain_format.coin import Coin
17
17
  from chia.types.blockchain_format.program import Program
18
- from chia.types.coin_record import CoinRecord
19
- from chia.types.coin_spend import CoinSpend, CoinSpendWithConditions, SpendInfo, make_spend
18
+ from chia.types.coin_spend import CoinSpendWithConditions, SpendInfo, make_spend
20
19
  from chia.types.generator_types import BlockGenerator
21
- from chia.types.spend_bundle_conditions import SpendBundleConditions
22
- from chia.util.condition_tools import conditions_for_solution
23
- from chia.util.errors import Err
24
20
 
25
21
  DESERIALIZE_MOD = Program.from_bytes(CHIALISP_DESERIALISATION)
26
22
 
@@ -61,10 +57,13 @@ def get_spends_for_block(generator: BlockGenerator, height: int, constants: Cons
61
57
  spends: list[CoinSpend] = []
62
58
 
63
59
  for spend in Program.to(ret).first().as_iter():
64
- parent, puzzle, amount, solution = spend.as_iter()
65
- puzzle_hash = puzzle.get_tree_hash()
66
- coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
67
- spends.append(make_spend(coin, puzzle, solution))
60
+ try:
61
+ parent, puzzle, amount, solution = spend.as_iter()
62
+ puzzle_hash = puzzle.get_tree_hash()
63
+ coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
64
+ spends.append(make_spend(coin, puzzle, solution))
65
+ except ValueError:
66
+ log.warning("get_spends_for_block() encountered a puzzle we couldn't serialize: {e}")
68
67
 
69
68
  return spends
70
69
 
@@ -90,56 +89,14 @@ def get_spends_for_block_with_conditions(
90
89
  spends: list[CoinSpendWithConditions] = []
91
90
 
92
91
  for spend in Program.to(ret).first().as_iter():
93
- parent, puzzle, amount, solution = spend.as_iter()
94
- puzzle_hash = puzzle.get_tree_hash()
95
- coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
96
- coin_spend = make_spend(coin, puzzle, solution)
97
- conditions = conditions_for_solution(puzzle, solution, constants.MAX_BLOCK_COST_CLVM)
98
- spends.append(CoinSpendWithConditions(coin_spend, conditions))
92
+ try:
93
+ parent, puzzle, amount, solution = spend.as_iter()
94
+ puzzle_hash = puzzle.get_tree_hash()
95
+ coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
96
+ coin_spend = make_spend(coin, puzzle, solution)
97
+ conditions = conditions_for_solution(puzzle, solution, constants.MAX_BLOCK_COST_CLVM)
98
+ spends.append(CoinSpendWithConditions(coin_spend, conditions))
99
+ except ValueError:
100
+ log.warning("get_spends_for_block_with_conditions() encountered a puzzle we couldn't serialize: {e}")
99
101
 
100
102
  return spends
101
-
102
-
103
- def mempool_check_time_locks(
104
- removal_coin_records: dict[bytes32, CoinRecord],
105
- bundle_conds: SpendBundleConditions,
106
- prev_transaction_block_height: uint32,
107
- timestamp: uint64,
108
- ) -> Optional[Err]:
109
- """
110
- Check all time and height conditions against current state.
111
- """
112
-
113
- if prev_transaction_block_height < bundle_conds.height_absolute:
114
- return Err.ASSERT_HEIGHT_ABSOLUTE_FAILED
115
- if timestamp < bundle_conds.seconds_absolute:
116
- return Err.ASSERT_SECONDS_ABSOLUTE_FAILED
117
- if bundle_conds.before_height_absolute is not None:
118
- if prev_transaction_block_height >= bundle_conds.before_height_absolute:
119
- return Err.ASSERT_BEFORE_HEIGHT_ABSOLUTE_FAILED
120
- if bundle_conds.before_seconds_absolute is not None:
121
- if timestamp >= bundle_conds.before_seconds_absolute:
122
- return Err.ASSERT_BEFORE_SECONDS_ABSOLUTE_FAILED
123
-
124
- for spend in bundle_conds.spends:
125
- unspent = removal_coin_records[bytes32(spend.coin_id)]
126
- if spend.birth_height is not None:
127
- if spend.birth_height != unspent.confirmed_block_index:
128
- return Err.ASSERT_MY_BIRTH_HEIGHT_FAILED
129
- if spend.birth_seconds is not None:
130
- if spend.birth_seconds != unspent.timestamp:
131
- return Err.ASSERT_MY_BIRTH_SECONDS_FAILED
132
- if spend.height_relative is not None:
133
- if prev_transaction_block_height < unspent.confirmed_block_index + spend.height_relative:
134
- return Err.ASSERT_HEIGHT_RELATIVE_FAILED
135
- if spend.seconds_relative is not None:
136
- if timestamp < unspent.timestamp + spend.seconds_relative:
137
- return Err.ASSERT_SECONDS_RELATIVE_FAILED
138
- if spend.before_height_relative is not None:
139
- if prev_transaction_block_height >= unspent.confirmed_block_index + spend.before_height_relative:
140
- return Err.ASSERT_BEFORE_HEIGHT_RELATIVE_FAILED
141
- if spend.before_seconds_relative is not None:
142
- if timestamp >= unspent.timestamp + spend.before_seconds_relative:
143
- return Err.ASSERT_BEFORE_SECONDS_RELATIVE_FAILED
144
-
145
- return None
@@ -13,7 +13,8 @@ from chia_rs import (
13
13
  ELIGIBLE_FOR_FF,
14
14
  BLSCache,
15
15
  ConsensusConstants,
16
- G2Element,
16
+ SpendBundle,
17
+ SpendBundleConditions,
17
18
  supports_fast_forward,
18
19
  validate_clvm_and_signature,
19
20
  )
@@ -22,23 +23,21 @@ from chia_rs.sized_ints import uint32, uint64
22
23
  from chiabip158 import PyBIP158
23
24
 
24
25
  from chia.consensus.block_record import BlockRecordProtocol
26
+ from chia.consensus.check_time_locks import check_time_locks
25
27
  from chia.consensus.cost_calculator import NPCResult
26
28
  from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator
29
+ from chia.full_node.eligible_coin_spends import EligibilityAndAdditions
27
30
  from chia.full_node.fee_estimation import FeeBlockInfo, MempoolInfo, MempoolItemInfo
28
31
  from chia.full_node.fee_estimator_interface import FeeEstimatorInterface
29
32
  from chia.full_node.mempool import MEMPOOL_ITEM_FEE_LIMIT, Mempool, MempoolRemoveInfo, MempoolRemoveReason
30
- from chia.full_node.mempool_check_conditions import mempool_check_time_locks
31
33
  from chia.full_node.pending_tx_cache import ConflictTxCache, PendingTxCache
32
34
  from chia.types.blockchain_format.coin import Coin
33
35
  from chia.types.clvm_cost import CLVMCost
34
36
  from chia.types.coin_record import CoinRecord
35
- from chia.types.eligible_coin_spends import EligibilityAndAdditions, UnspentLineageInfo
36
37
  from chia.types.fee_rate import FeeRate
37
- from chia.types.generator_types import BlockGenerator
38
+ from chia.types.generator_types import NewBlockGenerator
38
39
  from chia.types.mempool_inclusion_status import MempoolInclusionStatus
39
- from chia.types.mempool_item import BundleCoinSpend, MempoolItem
40
- from chia.types.spend_bundle import SpendBundle
41
- from chia.types.spend_bundle_conditions import SpendBundleConditions
40
+ from chia.types.mempool_item import BundleCoinSpend, MempoolItem, UnspentLineageInfo
42
41
  from chia.util.db_wrapper import SQLITE_INT_MAX
43
42
  from chia.util.errors import Err, ValidationError
44
43
  from chia.util.inline_executor import InlineExecutor
@@ -259,7 +258,22 @@ def check_removals(
259
258
  for item in conflicting_items:
260
259
  if item in conflicts:
261
260
  continue
262
- conflict_bcs = item.bundle_coin_spends[coin_id]
261
+ conflict_bcs = item.bundle_coin_spends.get(coin_id)
262
+ if conflict_bcs is None:
263
+ # Check if this is an item that spends an older ff singleton
264
+ # version with a latest version that matches our coin ID.
265
+ conflict_bcs = next(
266
+ (
267
+ bcs
268
+ for bcs in item.bundle_coin_spends.values()
269
+ if bcs.latest_singleton_lineage is not None and bcs.latest_singleton_lineage.coin_id == coin_id
270
+ ),
271
+ None,
272
+ )
273
+ # We're not expected to get here but let's handle it gracefully
274
+ if conflict_bcs is None:
275
+ log.warning(f"Coin ID {coin_id} expected but not found in mempool item {item.name}")
276
+ return Err.INVALID_SPEND_BUNDLE, []
263
277
  # if the spend we're adding to the mempool is not DEDUP nor FF, it's
264
278
  # just a regular conflict
265
279
  if not coin_bcs.eligible_for_fast_forward and not coin_bcs.eligible_for_dedup:
@@ -362,43 +376,30 @@ class MempoolManager:
362
376
  self.pool.shutdown(wait=True)
363
377
 
364
378
  # TODO: remove this, use create_generator() instead
365
- async def create_bundle_from_mempool(
366
- self,
367
- last_tb_header_hash: bytes32,
368
- item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
369
- ) -> Optional[tuple[SpendBundle, list[Coin]]]:
379
+ def create_bundle_from_mempool(self, last_tb_header_hash: bytes32) -> Optional[tuple[SpendBundle, list[Coin]]]:
370
380
  """
371
381
  Returns aggregated spendbundle that can be used for creating new block,
372
382
  additions and removals in that spend_bundle
373
383
  """
374
-
375
- lineage_cache = LineageInfoCache(self.get_unspent_lineage_info_for_puzzle_hash)
376
-
377
384
  if self.peak is None or self.peak.header_hash != last_tb_header_hash:
378
385
  return None
379
- return await self.mempool.create_bundle_from_mempool_items(
380
- lineage_cache.get_unspent_lineage_info, self.constants, self.peak.height, item_inclusion_filter
381
- )
386
+ return self.mempool.create_bundle_from_mempool_items(self.constants, self.peak.height)
382
387
 
383
- async def create_block_generator(
384
- self,
385
- last_tb_header_hash: bytes32,
386
- item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
387
- ) -> Optional[tuple[BlockGenerator, G2Element, list[Coin], list[Coin]]]:
388
+ def create_block_generator(self, last_tb_header_hash: bytes32, timeout: float) -> Optional[NewBlockGenerator]:
388
389
  """
389
390
  Returns a block generator program, the aggregate signature and all additions and removals, for a new block
390
391
  """
391
392
  if self.peak is None or self.peak.header_hash != last_tb_header_hash:
392
393
  return None
394
+ return self.mempool.create_block_generator(self.constants, self.peak.height, timeout)
393
395
 
394
- lineage_cache = LineageInfoCache(self.get_unspent_lineage_info_for_puzzle_hash)
395
-
396
- return await self.mempool.create_block_generator(
397
- lineage_cache.get_unspent_lineage_info,
398
- self.constants,
399
- self.peak.height,
400
- item_inclusion_filter,
401
- )
396
+ def create_block_generator2(self, last_tb_header_hash: bytes32, timeout: float) -> Optional[NewBlockGenerator]:
397
+ """
398
+ Returns a block generator program, the aggregate signature and all additions, for a new block
399
+ """
400
+ if self.peak is None or self.peak.header_hash != last_tb_header_hash:
401
+ return None
402
+ return self.mempool.create_block_generator2(self.constants, self.peak.height, timeout)
402
403
 
403
404
  def get_filter(self) -> bytes:
404
405
  all_transactions: set[bytes32] = set()
@@ -572,12 +573,13 @@ class MempoolManager:
572
573
  get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
573
574
  ) -> tuple[Optional[Err], Optional[MempoolItem], list[bytes32]]:
574
575
  """
575
- Validates new_spend with the given NPCResult, and spend_name, and the current mempool. The mempool should
576
+ Validates new_spend with the given SpendBundleConditions, and
577
+ spend_name, and the current mempool. The mempool should
576
578
  be locked during this call (blockchain lock).
577
579
 
578
580
  Args:
579
581
  new_spend: spend bundle to validate
580
- conds: result of running the clvm transaction in a fake block
582
+ conds: result of running the clvm transaction
581
583
  spend_name: hash of the spend bundle data, passed in as an optimization
582
584
  first_added_height: The block height that `new_spend` first entered this node's mempool.
583
585
  Used to estimate how long a spend has taken to be included on the chain.
@@ -588,7 +590,7 @@ class MempoolManager:
588
590
  Optional[MempoolItem]: the item to add (to mempool or pending pool)
589
591
  list[bytes32]: conflicting mempool items to remove, if no Err
590
592
  """
591
- start_time = time.time()
593
+ start_time = time.monotonic()
592
594
  if self.peak is None:
593
595
  return Err.MEMPOOL_NOT_INITIALIZED, None, []
594
596
 
@@ -630,7 +632,7 @@ class MempoolManager:
630
632
  return Err.INVALID_COIN_SOLUTION, None, []
631
633
 
632
634
  mark_as_fast_forward = eligibility_info.ff_puzzle_hash is not None and supports_fast_forward(coin_spend)
633
- latest_singleton_coin = None
635
+ lineage_info = None
634
636
  if mark_as_fast_forward:
635
637
  # Make sure the fast forward spend still has a version that is
636
638
  # still unspent, because if the singleton has been melted, the
@@ -638,14 +640,13 @@ class MempoolManager:
638
640
  assert eligibility_info.ff_puzzle_hash is not None
639
641
  lineage_info = await get_unspent_lineage_info_for_puzzle_hash(eligibility_info.ff_puzzle_hash)
640
642
  if lineage_info is None:
641
- return Err.DOUBLE_SPEND, None, []
642
- latest_singleton_coin = lineage_info.coin_id
643
+ mark_as_fast_forward = False
643
644
  bundle_coin_spends[coin_id] = BundleCoinSpend(
644
645
  coin_spend=coin_spend,
645
646
  eligible_for_dedup=supports_dedup,
646
647
  eligible_for_fast_forward=mark_as_fast_forward,
647
648
  additions=eligibility_info.spend_additions,
648
- latest_singleton_coin=latest_singleton_coin,
649
+ latest_singleton_lineage=lineage_info,
649
650
  )
650
651
 
651
652
  if removal_names != removal_names_from_coin_spends:
@@ -739,7 +740,7 @@ class MempoolManager:
739
740
  # point-of-view of the next block to be farmed. Therefore we pass in the
740
741
  # current peak's height and timestamp
741
742
  assert self.peak.timestamp is not None
742
- tl_error: Optional[Err] = mempool_check_time_locks(
743
+ tl_error: Optional[Err] = check_time_locks(
743
744
  removal_record_dict,
744
745
  conds,
745
746
  self.peak.height,
@@ -778,7 +779,7 @@ class MempoolManager:
778
779
  if not can_replace(conflicts, removal_names, potential):
779
780
  return Err.MEMPOOL_CONFLICT, potential, []
780
781
 
781
- duration = time.time() - start_time
782
+ duration = time.monotonic() - start_time
782
783
 
783
784
  log.log(
784
785
  logging.DEBUG if duration < 2 else logging.WARNING,
@@ -786,6 +787,10 @@ class MempoolManager:
786
787
  f"Cost: {cost} ({round(100.0 * cost / self.constants.MAX_BLOCK_COST_CLVM, 3)}% of max block cost)",
787
788
  )
788
789
 
790
+ if duration > 2:
791
+ log.warning("validating spend took too long, rejecting")
792
+ return Err.INVALID_SPEND_BUNDLE, None, []
793
+
789
794
  return None, potential, [item.name for item in conflicts]
790
795
 
791
796
  def get_spendbundle(self, bundle_hash: bytes32) -> Optional[SpendBundle]:
@@ -853,7 +858,7 @@ class MempoolManager:
853
858
  # rebasing a fast forward spend is more expensive than to just
854
859
  # evict the item. So, any FF spend we may need to rebase, defer
855
860
  # them until after we've gone through all spends
856
- deferred_ff_items: set[tuple[bytes32, bytes32]] = set()
861
+ deferred_ff_items: set[tuple[bytes32, MempoolItem]] = set()
857
862
 
858
863
  for spend in spent_coins:
859
864
  items = self.mempool.get_items_by_coin_id(spend)
@@ -868,7 +873,7 @@ class MempoolManager:
868
873
  continue
869
874
 
870
875
  bcs = item.bundle_coin_spends.get(spend)
871
- if bcs is not None and bcs.latest_singleton_coin is None:
876
+ if bcs is not None and bcs.latest_singleton_lineage is None:
872
877
  # this is a regular coin spend that's now made it into
873
878
  # a block and we just evict its mempool item
874
879
  included_items.append(MempoolItemInfo(item.cost, item.fee, item.height_added_to_mempool))
@@ -876,7 +881,7 @@ class MempoolManager:
876
881
  spendbundle_ids_to_remove.add(item_name)
877
882
  continue
878
883
 
879
- deferred_ff_items.add((spend, item_name))
884
+ deferred_ff_items.add((spend, item))
880
885
 
881
886
  # fast forward spends are indexed under the latest singleton coin ID
882
887
  # if it's spent, we need to update the index in the mempool. This
@@ -884,14 +889,15 @@ class MempoolManager:
884
889
  # new_coin_id, current_coin_id, mempool item name
885
890
  spends_to_update: list[tuple[bytes32, bytes32, bytes32]] = []
886
891
 
887
- for spend, item_name in deferred_ff_items:
892
+ for spend, item in deferred_ff_items:
893
+ item_name = item.spend_bundle_name
888
894
  if item_name in spendbundle_ids_to_remove:
889
895
  continue
890
896
  # there may be multiple matching spends in the mempool
891
897
  # item, for the same singleton
892
898
  found_matches = 0
893
899
  for bcs in item.bundle_coin_spends.values():
894
- if bcs.latest_singleton_coin != spend:
900
+ if bcs.latest_singleton_lineage is None or bcs.latest_singleton_lineage.coin_id != spend:
895
901
  continue
896
902
  found_matches += 1
897
903
 
@@ -907,7 +913,7 @@ class MempoolManager:
907
913
  break
908
914
 
909
915
  spends_to_update.append((lineage_info.coin_id, spend, item_name))
910
- bcs.latest_singleton_coin = lineage_info.coin_id
916
+ bcs.latest_singleton_lineage = lineage_info
911
917
 
912
918
  if found_matches == 0: # pragma: no cover
913
919
  # We are not expected to get here. this is all
@@ -3,12 +3,10 @@ from __future__ import annotations
3
3
  import logging
4
4
  from dataclasses import dataclass, field
5
5
 
6
- from chia_rs import Coin
6
+ from chia_rs import Coin, SpendBundleConditions
7
7
  from chia_rs.sized_bytes import bytes32
8
8
  from chia_rs.sized_ints import uint64
9
9
 
10
- from chia.types.spend_bundle_conditions import SpendBundleConditions
11
-
12
10
  log = logging.getLogger(__name__)
13
11
 
14
12
 
@@ -1,20 +1,67 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import dataclasses
4
5
  import logging
5
- from dataclasses import dataclass
6
+ from dataclasses import dataclass, field
6
7
  from queue import SimpleQueue
7
- from typing import Optional
8
+ from typing import ClassVar, Generic, Optional, TypeVar, Union
8
9
 
10
+ from chia_rs import SpendBundle
9
11
  from chia_rs.sized_bytes import bytes32
10
12
 
11
- from chia.types.transaction_queue_entry import TransactionQueueEntry
13
+ from chia.server.ws_connection import WSChiaConnection
14
+ from chia.types.mempool_inclusion_status import MempoolInclusionStatus
15
+ from chia.util.errors import Err
16
+
17
+ T = TypeVar("T")
12
18
 
13
19
 
14
20
  class TransactionQueueFull(Exception):
15
21
  pass
16
22
 
17
23
 
24
+ class ValuedEventSentinel:
25
+ pass
26
+
27
+
28
+ @dataclasses.dataclass
29
+ class ValuedEvent(Generic[T]):
30
+ _value_sentinel: ClassVar[ValuedEventSentinel] = ValuedEventSentinel()
31
+
32
+ _event: asyncio.Event = dataclasses.field(default_factory=asyncio.Event)
33
+ _value: Union[ValuedEventSentinel, T] = _value_sentinel
34
+
35
+ def set(self, value: T) -> None:
36
+ if not isinstance(self._value, ValuedEventSentinel):
37
+ raise Exception("Value already set")
38
+ self._value = value
39
+ self._event.set()
40
+
41
+ async def wait(self) -> T:
42
+ await self._event.wait()
43
+ if isinstance(self._value, ValuedEventSentinel):
44
+ raise Exception("Value not set despite event being set")
45
+ return self._value
46
+
47
+
48
+ @dataclass(frozen=True)
49
+ class TransactionQueueEntry:
50
+ """
51
+ A transaction received from peer. This is put into a queue, and not yet in the mempool.
52
+ """
53
+
54
+ transaction: SpendBundle = field(compare=False)
55
+ transaction_bytes: Optional[bytes] = field(compare=False)
56
+ spend_name: bytes32
57
+ peer: Optional[WSChiaConnection] = field(compare=False)
58
+ test: bool = field(compare=False)
59
+ done: ValuedEvent[tuple[MempoolInclusionStatus, Optional[Err]]] = field(
60
+ default_factory=ValuedEvent,
61
+ compare=False,
62
+ )
63
+
64
+
18
65
  @dataclass
19
66
  class TransactionQueue:
20
67
  """
@@ -10,29 +10,36 @@ from concurrent.futures.process import ProcessPoolExecutor
10
10
  from multiprocessing.context import BaseContext
11
11
  from typing import IO, Optional
12
12
 
13
- from chia_rs import ConsensusConstants, SubEpochChallengeSegment, SubEpochData, SubEpochSegments, SubSlotData
13
+ from chia_rs import (
14
+ BlockRecord,
15
+ ChallengeChainSubSlot,
16
+ ConsensusConstants,
17
+ EndOfSubSlotBundle,
18
+ HeaderBlock,
19
+ RewardChainSubSlot,
20
+ SubEpochChallengeSegment,
21
+ SubEpochData,
22
+ SubEpochSegments,
23
+ SubEpochSummary,
24
+ SubSlotData,
25
+ )
14
26
  from chia_rs.sized_bytes import bytes32
15
27
  from chia_rs.sized_ints import uint8, uint32, uint64, uint128
16
28
 
17
29
  from chia.consensus.block_header_validation import validate_finished_header_block
18
- from chia.consensus.block_record import BlockRecord
19
30
  from chia.consensus.blockchain_interface import BlockchainInterface
20
31
  from chia.consensus.deficit import calculate_deficit
21
32
  from chia.consensus.full_block_to_block_record import header_block_to_sub_block_record
33
+ from chia.consensus.get_block_challenge import prev_tx_block
22
34
  from chia.consensus.pot_iterations import (
23
35
  calculate_ip_iters,
24
- calculate_iterations_quality,
25
36
  calculate_sp_iters,
26
37
  is_overflow_block,
38
+ validate_pospace_and_get_required_iters,
27
39
  )
28
40
  from chia.consensus.vdf_info_computation import get_signage_point_vdf_info
29
41
  from chia.types.blockchain_format.classgroup import ClassgroupElement
30
- from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
31
- from chia.types.blockchain_format.slots import ChallengeChainSubSlot, RewardChainSubSlot
32
- from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
33
42
  from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
34
- from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
35
- from chia.types.header_block import HeaderBlock
36
43
  from chia.types.validation_state import ValidationState
37
44
  from chia.types.weight_proof import (
38
45
  RecentChainData,
@@ -994,7 +1001,7 @@ def _validate_segment(
994
1001
  if sampled and sub_slot_data.is_challenge():
995
1002
  after_challenge = True
996
1003
  required_iters = __validate_pospace(
997
- constants, segment, idx, curr_difficulty, ses, first_segment_in_se, height
1004
+ constants, segment, idx, curr_difficulty, curr_ssi, ses, first_segment_in_se, height
998
1005
  )
999
1006
  if required_iters is None:
1000
1007
  return False, uint64(0), uint64(0), uint64(0), []
@@ -1142,7 +1149,7 @@ def sub_slot_data_vdf_input(
1142
1149
  if is_overflow and new_sub_slot:
1143
1150
  if sub_slot_idx >= 2:
1144
1151
  if sub_slots[sub_slot_idx - 2].cc_slot_end_info is None:
1145
- for ssd_idx in reversed(range(0, sub_slot_idx - 1)):
1152
+ for ssd_idx in reversed(range(sub_slot_idx - 1)):
1146
1153
  ssd = sub_slots[ssd_idx]
1147
1154
  if ssd.cc_slot_end_info is not None:
1148
1155
  ssd = sub_slots[ssd_idx + 1]
@@ -1157,7 +1164,7 @@ def sub_slot_data_vdf_input(
1157
1164
  return cc_input
1158
1165
 
1159
1166
  elif not is_overflow and not new_sub_slot:
1160
- for ssd_idx in reversed(range(0, sub_slot_idx)):
1167
+ for ssd_idx in reversed(range(sub_slot_idx)):
1161
1168
  ssd = sub_slots[ssd_idx]
1162
1169
  if ssd.cc_slot_end_info is not None:
1163
1170
  ssd = sub_slots[ssd_idx + 1]
@@ -1174,7 +1181,7 @@ def sub_slot_data_vdf_input(
1174
1181
 
1175
1182
  elif not new_sub_slot and is_overflow:
1176
1183
  slots_seen = 0
1177
- for ssd_idx in reversed(range(0, sub_slot_idx)):
1184
+ for ssd_idx in reversed(range(sub_slot_idx)):
1178
1185
  ssd = sub_slots[ssd_idx]
1179
1186
  if ssd.cc_slot_end_info is not None:
1180
1187
  slots_seen += 1
@@ -1239,7 +1246,7 @@ def validate_recent_blocks(
1239
1246
  if sub_slot.challenge_chain.new_difficulty is not None:
1240
1247
  diff = sub_slot.challenge_chain.new_difficulty
1241
1248
 
1242
- if (challenge is not None) and (prev_challenge is not None):
1249
+ if (challenge is not None) and (prev_challenge is not None) and transaction_blocks > 1:
1243
1250
  overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
1244
1251
  if not adjusted:
1245
1252
  assert prev_block_record is not None
@@ -1260,7 +1267,9 @@ def validate_recent_blocks(
1260
1267
  assert caluclated_required_iters is not None
1261
1268
  required_iters = caluclated_required_iters
1262
1269
  else:
1263
- ret = _validate_pospace_recent_chain(constants, block, challenge, diff, overflow, prev_challenge)
1270
+ ret = _validate_pospace_recent_chain(
1271
+ constants, sub_blocks, block, challenge, diff, ssi, overflow, prev_challenge
1272
+ )
1264
1273
  if ret is None:
1265
1274
  return False, []
1266
1275
  required_iters = ret
@@ -1298,9 +1307,11 @@ def validate_recent_blocks(
1298
1307
 
1299
1308
  def _validate_pospace_recent_chain(
1300
1309
  constants: ConsensusConstants,
1310
+ blocks: BlockCache,
1301
1311
  block: HeaderBlock,
1302
1312
  challenge: bytes32,
1303
1313
  diff: uint64,
1314
+ ssi: uint64,
1304
1315
  overflow: bool,
1305
1316
  prev_challenge: bytes32,
1306
1317
  ) -> Optional[uint64]:
@@ -1310,23 +1321,21 @@ def _validate_pospace_recent_chain(
1310
1321
  else:
1311
1322
  cc_sp_hash = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
1312
1323
  assert cc_sp_hash is not None
1313
- q_str = verify_and_get_quality_string(
1314
- block.reward_chain_block.proof_of_space,
1324
+
1325
+ required_iters = validate_pospace_and_get_required_iters(
1315
1326
  constants,
1327
+ block.reward_chain_block.proof_of_space,
1316
1328
  challenge if not overflow else prev_challenge,
1317
1329
  cc_sp_hash,
1318
- height=block.height,
1330
+ block.height,
1331
+ diff,
1332
+ ssi,
1333
+ prev_tx_block(blocks, blocks.block_record(block.prev_header_hash)),
1319
1334
  )
1320
- if q_str is None:
1335
+ if required_iters is None:
1321
1336
  log.error(f"could not verify proof of space block {block.height} {overflow}")
1322
1337
  return None
1323
- required_iters = calculate_iterations_quality(
1324
- constants.DIFFICULTY_CONSTANT_FACTOR,
1325
- q_str,
1326
- block.reward_chain_block.proof_of_space.size,
1327
- diff,
1328
- cc_sp_hash,
1329
- )
1338
+
1330
1339
  return required_iters
1331
1340
 
1332
1341
 
@@ -1335,6 +1344,7 @@ def __validate_pospace(
1335
1344
  segment: SubEpochChallengeSegment,
1336
1345
  idx: int,
1337
1346
  curr_diff: uint64,
1347
+ curr_sub_slot_iters: uint64,
1338
1348
  ses: Optional[SubEpochSummary],
1339
1349
  first_in_sub_epoch: bool,
1340
1350
  height: uint32,
@@ -1360,23 +1370,22 @@ def __validate_pospace(
1360
1370
 
1361
1371
  # validate proof of space
1362
1372
  assert sub_slot_data.proof_of_space is not None
1363
- q_str = verify_and_get_quality_string(
1364
- sub_slot_data.proof_of_space,
1373
+
1374
+ required_iters = validate_pospace_and_get_required_iters(
1365
1375
  constants,
1376
+ sub_slot_data.proof_of_space,
1366
1377
  challenge,
1367
1378
  cc_sp_hash,
1368
- height=height,
1379
+ height,
1380
+ curr_diff,
1381
+ curr_sub_slot_iters,
1382
+ uint32(0), # prev_tx_block(blocks, prev_b), todo need to get height of prev tx block somehow here
1369
1383
  )
1370
- if q_str is None:
1384
+ if required_iters is None:
1371
1385
  log.error("could not verify proof of space")
1372
1386
  return None
1373
- return calculate_iterations_quality(
1374
- constants.DIFFICULTY_CONSTANT_FACTOR,
1375
- q_str,
1376
- sub_slot_data.proof_of_space.size,
1377
- curr_diff,
1378
- cc_sp_hash,
1379
- )
1387
+
1388
+ return required_iters
1380
1389
 
1381
1390
 
1382
1391
  def __get_rc_sub_slot(
@@ -1465,7 +1474,7 @@ def __get_rc_sub_slot(
1465
1474
 
1466
1475
  def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: Optional[SubEpochSummary]) -> ChallengeChainSubSlot:
1467
1476
  sub_slot: Optional[SubSlotData] = None
1468
- for i in reversed(range(0, idx)):
1477
+ for i in reversed(range(idx)):
1469
1478
  sub_slot = sub_slots[i]
1470
1479
  if sub_slot.cc_slot_end_info is not None:
1471
1480
  break
@@ -36,8 +36,8 @@ from chia.plotting.util import (
36
36
  remove_plot_directory,
37
37
  update_harvester_config,
38
38
  )
39
+ from chia.protocols.outbound_message import NodeType
39
40
  from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
40
- from chia.server.outbound_message import NodeType
41
41
  from chia.server.server import ChiaServer
42
42
  from chia.server.ws_connection import WSChiaConnection
43
43
  from chia.util.cpu import available_logical_cores