chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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 (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
@@ -5,7 +5,7 @@ import logging
5
5
  import random
6
6
  import sqlite3
7
7
  from pathlib import Path
8
- from typing import List, Optional, cast
8
+ from typing import Optional, cast
9
9
 
10
10
  import pytest
11
11
 
@@ -15,7 +15,8 @@ from clvm.casts import int_to_bytes
15
15
 
16
16
  from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
17
17
  from chia._tests.util.db_connection import DBConnection, PathDBConnection
18
- from chia.consensus.blockchain import Blockchain
18
+ from chia.consensus.block_body_validation import ForkInfo
19
+ from chia.consensus.blockchain import AddBlockResult, Blockchain
19
20
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
20
21
  from chia.consensus.full_block_to_block_record import header_block_to_sub_block_record
21
22
  from chia.full_node.block_store import BlockStore
@@ -29,6 +30,7 @@ from chia.types.full_block import FullBlock
29
30
  from chia.util.db_wrapper import get_host_parameter_limit
30
31
  from chia.util.full_block_utils import GeneratorBlockInfo
31
32
  from chia.util.ints import uint8, uint32, uint64
33
+ from chia.util.task_referencer import create_referenced_task
32
34
 
33
35
  log = logging.getLogger(__name__)
34
36
 
@@ -58,9 +60,7 @@ async def test_block_store(tmp_dir: Path, db_version: int, bt: BlockTools, use_c
58
60
  time_per_block=10,
59
61
  )
60
62
  wt: WalletTool = bt.get_pool_wallet_tool()
61
- tx = wt.generate_signed_transaction(
62
- uint64(10), wt.get_new_puzzlehash(), list(blocks[-1].get_included_reward_coins())[0]
63
- )
63
+ tx = wt.generate_signed_transaction(uint64(10), wt.get_new_puzzlehash(), blocks[-1].get_included_reward_coins()[0])
64
64
  blocks = bt.get_consecutive_blocks(
65
65
  10,
66
66
  block_list_input=blocks,
@@ -135,6 +135,90 @@ async def test_block_store(tmp_dir: Path, db_version: int, bt: BlockTools, use_c
135
135
  assert br.header_hash == b.header_hash
136
136
 
137
137
 
138
+ @pytest.mark.limit_consensus_modes(reason="save time")
139
+ @pytest.mark.anyio
140
+ async def test_get_full_blocks_at(
141
+ tmp_dir: Path, db_version: int, bt: BlockTools, use_cache: bool, default_400_blocks: list[FullBlock]
142
+ ) -> None:
143
+ blocks = bt.get_consecutive_blocks(10)
144
+ alt_blocks = default_400_blocks[:10]
145
+
146
+ async with DBConnection(2) as db_wrapper:
147
+ # Use a different file for the blockchain
148
+ coin_store = await CoinStore.create(db_wrapper)
149
+ block_store = await BlockStore.create(db_wrapper, use_cache=use_cache)
150
+ bc = await Blockchain.create(coin_store, block_store, bt.constants, tmp_dir, 2)
151
+
152
+ count = 0
153
+ fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
154
+ for b1, b2 in zip(blocks, alt_blocks):
155
+ await _validate_and_add_block(bc, b1)
156
+ await _validate_and_add_block(bc, b2, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info)
157
+ ret = await block_store.get_full_blocks_at([uint32(count)])
158
+ assert set(ret) == set([b1, b2])
159
+ count += 1
160
+ ret = await block_store.get_full_blocks_at([uint32(c) for c in range(count)])
161
+ assert len(ret) == count * 2
162
+ assert set(ret) == set(blocks[:count] + alt_blocks[:count])
163
+
164
+
165
+ @pytest.mark.limit_consensus_modes(reason="save time")
166
+ @pytest.mark.anyio
167
+ async def test_get_block_records_in_range(
168
+ bt: BlockTools, tmp_dir: Path, use_cache: bool, default_400_blocks: list[FullBlock]
169
+ ) -> None:
170
+ blocks = bt.get_consecutive_blocks(10)
171
+ alt_blocks = default_400_blocks[:10]
172
+
173
+ async with DBConnection(2) as db_wrapper:
174
+ # Use a different file for the blockchain
175
+ coin_store = await CoinStore.create(db_wrapper)
176
+ block_store = await BlockStore.create(db_wrapper, use_cache=use_cache)
177
+ bc = await Blockchain.create(coin_store, block_store, bt.constants, tmp_dir, 2)
178
+
179
+ count = 0
180
+ fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
181
+ for b1, b2 in zip(blocks, alt_blocks):
182
+ await _validate_and_add_block(bc, b1)
183
+ await _validate_and_add_block(bc, b2, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info)
184
+ # the range is inclusive
185
+ ret = await block_store.get_block_records_in_range(count, count)
186
+ assert len(ret) == 1
187
+ assert b1.header_hash in ret
188
+ ret = await block_store.get_block_records_in_range(0, count)
189
+ count += 1
190
+ assert len(ret) == count
191
+ assert list(ret.keys()) == [b.header_hash for b in blocks[:count]]
192
+
193
+
194
+ @pytest.mark.limit_consensus_modes(reason="save time")
195
+ @pytest.mark.anyio
196
+ async def test_get_block_bytes_in_range_in_main_chain(
197
+ bt: BlockTools, tmp_dir: Path, use_cache: bool, default_400_blocks: list[FullBlock]
198
+ ) -> None:
199
+ blocks = bt.get_consecutive_blocks(10)
200
+ alt_blocks = default_400_blocks[:10]
201
+
202
+ async with DBConnection(2) as db_wrapper:
203
+ # Use a different file for the blockchain
204
+ coin_store = await CoinStore.create(db_wrapper)
205
+ block_store = await BlockStore.create(db_wrapper, use_cache=use_cache)
206
+ bc = await Blockchain.create(coin_store, block_store, bt.constants, tmp_dir, 2)
207
+
208
+ count = 0
209
+ fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
210
+ for b1, b2 in zip(blocks, alt_blocks):
211
+ await _validate_and_add_block(bc, b1)
212
+ await _validate_and_add_block(bc, b2, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info)
213
+ # the range is inclusive
214
+ ret = await block_store.get_block_bytes_in_range(count, count)
215
+ assert ret == [bytes(b1)]
216
+ ret = await block_store.get_block_bytes_in_range(0, count)
217
+ count += 1
218
+ assert len(ret) == count
219
+ assert set(ret) == set([bytes(b) for b in blocks[:count]])
220
+
221
+
138
222
  @pytest.mark.limit_consensus_modes(reason="save time")
139
223
  @pytest.mark.anyio
140
224
  async def test_deadlock(tmp_dir: Path, db_version: int, bt: BlockTools, use_cache: bool) -> None:
@@ -153,25 +237,26 @@ async def test_deadlock(tmp_dir: Path, db_version: int, bt: BlockTools, use_cach
153
237
  for block in blocks:
154
238
  await _validate_and_add_block(bc, block)
155
239
  block_records.append(bc.block_record(block.header_hash))
156
- tasks: List[asyncio.Task[object]] = []
240
+ tasks: list[asyncio.Task[object]] = []
157
241
 
158
242
  for i in range(10000):
159
243
  rand_i = random.randint(0, 9)
160
244
  if random.random() < 0.5:
161
245
  tasks.append(
162
- asyncio.create_task(
246
+ create_referenced_task(
163
247
  store.add_full_block(blocks[rand_i].header_hash, blocks[rand_i], block_records[rand_i])
164
248
  )
165
249
  )
166
250
  if random.random() < 0.5:
167
- tasks.append(asyncio.create_task(store.get_full_block(blocks[rand_i].header_hash)))
251
+ tasks.append(create_referenced_task(store.get_full_block(blocks[rand_i].header_hash)))
168
252
  await asyncio.gather(*tasks)
169
253
 
170
254
 
171
255
  @pytest.mark.limit_consensus_modes(reason="save time")
172
256
  @pytest.mark.anyio
173
- async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool) -> None:
257
+ async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool, default_400_blocks: list[FullBlock]) -> None:
174
258
  blocks = bt.get_consecutive_blocks(10)
259
+ alt_blocks = default_400_blocks[:10]
175
260
 
176
261
  async with DBConnection(2) as db_wrapper:
177
262
  # Use a different file for the blockchain
@@ -181,8 +266,10 @@ async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool) -> None:
181
266
 
182
267
  # insert all blocks
183
268
  count = 0
184
- for block in blocks:
185
- await _validate_and_add_block(bc, block)
269
+ fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
270
+ for b1, b2 in zip(blocks, alt_blocks):
271
+ await _validate_and_add_block(bc, b1)
272
+ await _validate_and_add_block(bc, b2, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info)
186
273
  count += 1
187
274
  ret = await block_store.get_random_not_compactified(count)
188
275
  assert len(ret) == count
@@ -197,6 +284,13 @@ async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool) -> None:
197
284
  rows = list(await cursor.fetchall())
198
285
  assert len(rows) == 1
199
286
  assert rows[0][0]
287
+ for block in alt_blocks:
288
+ async with conn.execute(
289
+ "SELECT in_main_chain FROM full_blocks WHERE header_hash=?", (block.header_hash,)
290
+ ) as cursor:
291
+ rows = list(await cursor.fetchall())
292
+ assert len(rows) == 1
293
+ assert not rows[0][0]
200
294
 
201
295
  await block_store.rollback(5)
202
296
 
@@ -212,6 +306,14 @@ async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool) -> None:
212
306
  assert len(rows) == 1
213
307
  assert rows[0][0] == (count <= 5)
214
308
  count += 1
309
+ for block in alt_blocks:
310
+ async with conn.execute(
311
+ "SELECT in_main_chain FROM full_blocks WHERE header_hash=? ORDER BY height",
312
+ (block.header_hash,),
313
+ ) as cursor:
314
+ rows = list(await cursor.fetchall())
315
+ assert len(rows) == 1
316
+ assert not rows[0][0]
215
317
 
216
318
 
217
319
  @pytest.mark.limit_consensus_modes(reason="save time")
@@ -3,21 +3,22 @@ from __future__ import annotations
3
3
  import logging
4
4
  from dataclasses import dataclass
5
5
  from pathlib import Path
6
- from typing import List, Optional, Set, Tuple
6
+ from typing import Optional
7
7
 
8
8
  import pytest
9
9
  from clvm.casts import int_to_bytes
10
10
 
11
11
  from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
12
12
  from chia._tests.util.db_connection import DBConnection
13
+ from chia._tests.util.get_name_puzzle_conditions import get_name_puzzle_conditions
13
14
  from chia._tests.util.misc import Marks, datacases
15
+ from chia.consensus.block_body_validation import ForkInfo
14
16
  from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
15
17
  from chia.consensus.blockchain import AddBlockResult, Blockchain
16
18
  from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
17
19
  from chia.full_node.block_store import BlockStore
18
20
  from chia.full_node.coin_store import CoinStore
19
21
  from chia.full_node.hint_store import HintStore
20
- from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions
21
22
  from chia.protocols.wallet_protocol import CoinState
22
23
  from chia.simulator.block_tools import BlockTools, test_constants
23
24
  from chia.simulator.wallet_tools import WalletTool
@@ -38,7 +39,7 @@ WALLET_A = WalletTool(constants)
38
39
  log = logging.getLogger(__name__)
39
40
 
40
41
 
41
- def get_future_reward_coins(block: FullBlock) -> Tuple[Coin, Coin]:
42
+ def get_future_reward_coins(block: FullBlock) -> tuple[Coin, Coin]:
42
43
  pool_amount = calculate_pool_reward(block.height)
43
44
  farmer_amount = calculate_base_farmer_reward(block.height)
44
45
  if block.is_transaction_block():
@@ -70,7 +71,7 @@ async def test_basic_coin_store(db_version: int, softfork_height: uint32, bt: Bl
70
71
  pool_reward_puzzle_hash=reward_ph,
71
72
  )
72
73
 
73
- coins_to_spend: List[Coin] = []
74
+ coins_to_spend: list[Coin] = []
74
75
  for block in blocks:
75
76
  if block.is_transaction_block():
76
77
  for coin in block.get_included_reward_coins():
@@ -91,14 +92,15 @@ async def test_basic_coin_store(db_version: int, softfork_height: uint32, bt: Bl
91
92
  )
92
93
 
93
94
  # Adding blocks to the coin store
94
- should_be_included_prev: Set[Coin] = set()
95
- should_be_included: Set[Coin] = set()
95
+ should_be_included_prev: set[Coin] = set()
96
+ should_be_included: set[Coin] = set()
96
97
  for block in blocks:
97
98
  farmer_coin, pool_coin = get_future_reward_coins(block)
98
99
  should_be_included.add(farmer_coin)
99
100
  should_be_included.add(pool_coin)
100
101
  if block.is_transaction_block():
101
102
  if block.transactions_generator is not None:
103
+ assert block.transactions_info is not None
102
104
  block_gen: BlockGenerator = BlockGenerator(block.transactions_generator, [])
103
105
  npc_result = get_name_puzzle_conditions(
104
106
  block_gen,
@@ -178,8 +180,8 @@ async def test_set_spent(db_version: int, bt: BlockTools) -> None:
178
180
  # Save/get block
179
181
  for block in blocks:
180
182
  if block.is_transaction_block():
181
- removals: List[bytes32] = []
182
- additions: List[Coin] = []
183
+ removals: list[bytes32] = []
184
+ additions: list[Coin] = []
183
185
  async with db_wrapper.writer():
184
186
  if block.is_transaction_block():
185
187
  assert block.foliage_transaction_block is not None
@@ -229,8 +231,8 @@ async def test_num_unspent(bt: BlockTools, db_version: int) -> None:
229
231
 
230
232
  if block.is_transaction_block():
231
233
  assert block.foliage_transaction_block is not None
232
- removals: List[bytes32] = []
233
- additions: List[Coin] = []
234
+ removals: list[bytes32] = []
235
+ additions: list[Coin] = []
234
236
  await coin_store.new_block(
235
237
  block.height,
236
238
  block.foliage_transaction_block.timestamp,
@@ -255,13 +257,13 @@ async def test_rollback(db_version: int, bt: BlockTools) -> None:
255
257
  coin_store = await CoinStore.create(db_wrapper)
256
258
 
257
259
  selected_coin: Optional[CoinRecord] = None
258
- all_coins: List[Coin] = []
260
+ all_coins: list[Coin] = []
259
261
 
260
262
  for block in blocks:
261
263
  all_coins += list(block.get_included_reward_coins())
262
264
  if block.is_transaction_block():
263
- removals: List[bytes32] = []
264
- additions: List[Coin] = []
265
+ removals: list[bytes32] = []
266
+ additions: list[Coin] = []
265
267
  assert block.foliage_transaction_block is not None
266
268
  await coin_store.new_block(
267
269
  block.height,
@@ -343,7 +345,7 @@ async def test_basic_reorg(tmp_dir: Path, db_version: int, bt: BlockTools) -> No
343
345
  store = await BlockStore.create(db_wrapper)
344
346
  b: Blockchain = await Blockchain.create(coin_store, store, bt.constants, tmp_dir, 2)
345
347
  try:
346
- records: List[Optional[CoinRecord]] = []
348
+ records: list[Optional[CoinRecord]] = []
347
349
 
348
350
  for block in blocks:
349
351
  await _validate_and_add_block(b, block)
@@ -363,13 +365,20 @@ async def test_basic_reorg(tmp_dir: Path, db_version: int, bt: BlockTools) -> No
363
365
 
364
366
  blocks_reorg_chain = bt.get_consecutive_blocks(reorg_length, blocks[: initial_block_count - 10], seed=b"2")
365
367
 
368
+ fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
366
369
  for reorg_block in blocks_reorg_chain:
367
370
  if reorg_block.height < initial_block_count - 10:
368
- await _validate_and_add_block(b, reorg_block, expected_result=AddBlockResult.ALREADY_HAVE_BLOCK)
371
+ await _validate_and_add_block(
372
+ b, reorg_block, expected_result=AddBlockResult.ALREADY_HAVE_BLOCK, fork_info=fork_info
373
+ )
369
374
  elif reorg_block.height < initial_block_count:
370
- await _validate_and_add_block(b, reorg_block, expected_result=AddBlockResult.ADDED_AS_ORPHAN)
375
+ await _validate_and_add_block(
376
+ b, reorg_block, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info
377
+ )
371
378
  elif reorg_block.height >= initial_block_count:
372
- await _validate_and_add_block(b, reorg_block, expected_result=AddBlockResult.NEW_PEAK)
379
+ await _validate_and_add_block(
380
+ b, reorg_block, expected_result=AddBlockResult.NEW_PEAK, fork_info=fork_info
381
+ )
373
382
  if reorg_block.is_transaction_block():
374
383
  coins = reorg_block.get_included_reward_coins()
375
384
  records = [await coin_store.get_coin_record(coin.name()) for coin in coins]
@@ -501,16 +510,16 @@ async def test_get_coin_states(db_version: int) -> None:
501
510
 
502
511
  @dataclass(frozen=True)
503
512
  class RandomCoinRecords:
504
- items: List[CoinRecord]
505
- puzzle_hashes: List[bytes32]
506
- hints: List[Tuple[bytes32, bytes]]
513
+ items: list[CoinRecord]
514
+ puzzle_hashes: list[bytes32]
515
+ hints: list[tuple[bytes32, bytes]]
507
516
 
508
517
 
509
518
  @pytest.fixture(scope="session")
510
519
  def random_coin_records() -> RandomCoinRecords:
511
- coin_records: List[CoinRecord] = []
512
- puzzle_hashes: List[bytes32] = []
513
- hints: List[Tuple[bytes32, bytes]] = []
520
+ coin_records: list[CoinRecord] = []
521
+ puzzle_hashes: list[bytes32] = []
522
+ hints: list[tuple[bytes32, bytes]] = []
514
523
 
515
524
  for i in range(50000):
516
525
  is_spent = i % 2 == 0
@@ -586,7 +595,7 @@ async def test_coin_state_batches(
586
595
  expected_crs.append(cr)
587
596
 
588
597
  height: Optional[uint32] = uint32(0)
589
- all_coin_states: List[CoinState] = []
598
+ all_coin_states: list[CoinState] = []
590
599
  remaining_phs = random_coin_records.puzzle_hashes.copy()
591
600
 
592
601
  def height_of(coin_state: CoinState) -> int:
@@ -637,7 +646,7 @@ async def test_batch_many_coin_states(db_version: int, cut_off_middle: bool) ->
637
646
  ph = bytes32(b"0" * 32)
638
647
 
639
648
  # Generate coin records.
640
- coin_records: List[CoinRecord] = []
649
+ coin_records: list[CoinRecord] = []
641
650
  count = 50000
642
651
 
643
652
  for i in range(count):
@@ -760,7 +769,7 @@ class UnspentLineageInfoTestItem:
760
769
  @dataclass
761
770
  class UnspentLineageInfoCase:
762
771
  id: str
763
- items: List[UnspentLineageInfoTestItem]
772
+ items: list[UnspentLineageInfoTestItem]
764
773
  expected_success: bool
765
774
  parent_with_diff_amount: bool = False
766
775
  marks: Marks = ()
@@ -831,7 +840,7 @@ class UnspentLineageInfoCase:
831
840
  ),
832
841
  )
833
842
  async def test_get_unspent_lineage_info_for_puzzle_hash(case: UnspentLineageInfoCase) -> None:
834
- CoinRecordRawData = Tuple[
843
+ CoinRecordRawData = tuple[
835
844
  bytes, # coin_name (blob)
836
845
  int, # confirmed_index (bigint)
837
846
  int, # spent_index (bigint)
@@ -842,7 +851,7 @@ async def test_get_unspent_lineage_info_for_puzzle_hash(case: UnspentLineageInfo
842
851
  int, # timestamp (bigint)
843
852
  ]
844
853
 
845
- def make_test_data(test_items: List[UnspentLineageInfoTestItem]) -> List[CoinRecordRawData]:
854
+ def make_test_data(test_items: list[UnspentLineageInfoTestItem]) -> list[CoinRecordRawData]:
846
855
  test_data = []
847
856
  for item in test_items:
848
857
  test_data.append(
@@ -2,13 +2,15 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import random
5
- from typing import AsyncIterator, Dict, List, Optional, Tuple
5
+ from collections.abc import AsyncIterator
6
+ from typing import Optional
6
7
 
7
8
  import pytest
8
9
 
9
10
  from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error
10
11
  from chia._tests.util.blockchain import create_blockchain
11
12
  from chia._tests.util.blockchain_mock import BlockchainMock
13
+ from chia.consensus.block_body_validation import ForkInfo
12
14
  from chia.consensus.blockchain import AddBlockResult, Blockchain
13
15
  from chia.consensus.constants import ConsensusConstants
14
16
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
@@ -48,7 +50,7 @@ async def empty_blockchain(db_version: int, blockchain_constants: ConsensusConst
48
50
  DISCRIMINANT_SIZE_BITS=uint16(32),
49
51
  SUB_SLOT_ITERS_STARTING=uint64(2**12),
50
52
  )
51
- async with create_blockchain(patched_constants, db_version) as (bc1, db_wrapper):
53
+ async with create_blockchain(patched_constants, db_version) as (bc1, _):
52
54
  yield bc1
53
55
 
54
56
 
@@ -56,7 +58,7 @@ async def empty_blockchain(db_version: int, blockchain_constants: ConsensusConst
56
58
  async def empty_blockchain_with_original_constants(
57
59
  db_version: int, blockchain_constants: ConsensusConstants
58
60
  ) -> AsyncIterator[Blockchain]:
59
- async with create_blockchain(blockchain_constants, db_version) as (bc1, db_wrapper):
61
+ async with create_blockchain(blockchain_constants, db_version) as (bc1, _):
60
62
  yield bc1
61
63
 
62
64
 
@@ -82,7 +84,7 @@ async def test_unfinished_block_rank(
82
84
  # create variants of the unfinished block, where all we do is to change
83
85
  # the foliage_transaction_block_hash. As if they all had different foliage,
84
86
  # but the same reward block hash (i.e. the same proof-of-space)
85
- unfinished: List[UnfinishedBlock] = [
87
+ unfinished: list[UnfinishedBlock] = [
86
88
  recursive_replace(unf, "foliage.foliage_transaction_block_hash", bytes32([idx + 4] * 32))
87
89
  for idx in range(num_duplicates)
88
90
  ]
@@ -93,9 +95,7 @@ async def test_unfinished_block_rank(
93
95
  # shuffle them to ensure the order we add them to the store isn't relevant
94
96
  seeded_random.shuffle(unfinished)
95
97
  for new_unf in unfinished:
96
- store.add_unfinished_block(
97
- uint32(2), new_unf, PreValidationResult(None, uint64(123532), None, False, uint32(0))
98
- )
98
+ store.add_unfinished_block(uint32(2), new_unf, PreValidationResult(None, uint64(123532), None, uint32(0)))
99
99
 
100
100
  # now ask for "the" unfinished block given the proof-of-space.
101
101
  # the FullNodeStore should return the one with the lowest foliage tx block
@@ -130,12 +130,12 @@ async def test_unfinished_block_rank(
130
130
  )
131
131
  async def test_find_best_block(
132
132
  seeded_random: random.Random,
133
- blocks: List[Tuple[Optional[int], bool]],
133
+ blocks: list[tuple[Optional[int], bool]],
134
134
  expected: Optional[int],
135
- default_400_blocks: List[FullBlock],
135
+ default_400_blocks: list[FullBlock],
136
136
  bt: BlockTools,
137
137
  ) -> None:
138
- result: Dict[Optional[bytes32], UnfinishedBlockEntry] = {}
138
+ result: dict[Optional[bytes32], UnfinishedBlockEntry] = {}
139
139
  i = 0
140
140
  for b, with_unf in blocks:
141
141
  unf: Optional[UnfinishedBlock]
@@ -149,7 +149,7 @@ async def test_find_best_block(
149
149
  else:
150
150
  result[bytes32(b.to_bytes(1, "big") * 32)] = UnfinishedBlockEntry(unf, None, uint32(123))
151
151
 
152
- foliage_hash, block = find_best_block(result)
152
+ foliage_hash, _block = find_best_block(result)
153
153
  if expected is None:
154
154
  assert foliage_hash is None
155
155
  else:
@@ -219,7 +219,7 @@ async def test_basic_store(
219
219
  assert store.get_unfinished_block(unf_block.partial_hash) is None
220
220
  assert store.get_unfinished_block2(unf_block.partial_hash, None) == (None, 0, False)
221
221
  store.add_unfinished_block(
222
- uint32(height), unf_block, PreValidationResult(None, uint64(123532), None, False, uint32(0))
222
+ uint32(height), unf_block, PreValidationResult(None, uint64(123532), None, uint32(0))
223
223
  )
224
224
  assert store.get_unfinished_block(unf_block.partial_hash) == unf_block
225
225
  assert store.get_unfinished_block2(
@@ -275,9 +275,7 @@ async def test_basic_store(
275
275
  assert unf3.foliage.foliage_transaction_block_hash is None
276
276
  assert unf4.foliage.foliage_transaction_block_hash is None
277
277
  for val, unf_block in enumerate([unf1, unf2, unf3, unf4]):
278
- store.add_unfinished_block(
279
- uint32(height), unf_block, PreValidationResult(None, uint64(val), None, False, uint32(0))
280
- )
278
+ store.add_unfinished_block(uint32(height), unf_block, PreValidationResult(None, uint64(val), None, uint32(0)))
281
279
 
282
280
  # when not specifying a foliage hash, you get the "best" one
283
281
  # best is defined as the lowest foliage hash
@@ -454,8 +452,9 @@ async def test_basic_store(
454
452
  normalized_to_identity_cc_sp=normalized_to_identity,
455
453
  )
456
454
 
455
+ fork_info = ForkInfo(blocks[0].height - 1, blocks[0].height - 1, blocks[0].prev_header_hash)
457
456
  for block in blocks:
458
- await _validate_and_add_block_no_error(blockchain, block)
457
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
459
458
  sb = blockchain.block_record(block.header_hash)
460
459
  next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
461
460
  blockchain.constants, False, sb, blockchain
@@ -476,11 +475,13 @@ async def test_basic_store(
476
475
  normalized_to_identity_cc_ip=normalized_to_identity,
477
476
  normalized_to_identity_cc_sp=normalized_to_identity,
478
477
  )
478
+
479
+ fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
479
480
  for block in blocks_reorg:
480
481
  peak = blockchain.get_peak()
481
482
  assert peak is not None
482
483
 
483
- await _validate_and_add_block_no_error(blockchain, block)
484
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
484
485
 
485
486
  peak_here = blockchain.get_peak()
486
487
  assert peak_here is not None
@@ -558,7 +559,7 @@ async def test_basic_store(
558
559
  normalized_to_identity_cc_ip=normalized_to_identity,
559
560
  normalized_to_identity_cc_sp=normalized_to_identity,
560
561
  )
561
- await _validate_and_add_block(blockchain, blocks[-1])
562
+ await _validate_and_add_block(blockchain, blocks[-1], fork_info=fork_info)
562
563
  peak_here = blockchain.get_peak()
563
564
  assert peak_here is not None
564
565
  if peak_here.header_hash == blocks[-1].header_hash:
@@ -834,6 +835,7 @@ async def test_basic_store(
834
835
 
835
836
  # Test future EOS cache
836
837
  store.initialize_genesis_sub_slot()
838
+ fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
837
839
  blocks = custom_block_tools.get_consecutive_blocks(
838
840
  1,
839
841
  normalized_to_identity_cc_eos=normalized_to_identity,
@@ -841,7 +843,7 @@ async def test_basic_store(
841
843
  normalized_to_identity_cc_ip=normalized_to_identity,
842
844
  normalized_to_identity_cc_sp=normalized_to_identity,
843
845
  )
844
- await _validate_and_add_block_no_error(blockchain, blocks[-1])
846
+ await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
845
847
  while True:
846
848
  blocks = custom_block_tools.get_consecutive_blocks(
847
849
  1,
@@ -851,7 +853,7 @@ async def test_basic_store(
851
853
  normalized_to_identity_cc_ip=normalized_to_identity,
852
854
  normalized_to_identity_cc_sp=normalized_to_identity,
853
855
  )
854
- await _validate_and_add_block_no_error(blockchain, blocks[-1])
856
+ await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
855
857
  sb = blockchain.block_record(blocks[-1].header_hash)
856
858
  if sb.first_in_sub_slot:
857
859
  break
@@ -910,8 +912,9 @@ async def test_basic_store(
910
912
  normalized_to_identity_icc_eos=normalized_to_identity,
911
913
  )
912
914
 
915
+ fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
913
916
  for block in blocks[:5]:
914
- await _validate_and_add_block_no_error(blockchain, block)
917
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
915
918
  sb = blockchain.block_record(block.header_hash)
916
919
  result = await blockchain.get_sp_and_ip_sub_slots(block.header_hash)
917
920
  assert result is not None
@@ -940,7 +943,7 @@ async def test_basic_store(
940
943
  )
941
944
  store.add_to_future_ip(new_ip)
942
945
 
943
- await _validate_and_add_block_no_error(blockchain, prev_block)
946
+ await _validate_and_add_block_no_error(blockchain, prev_block, fork_info=fork_info)
944
947
  result = await blockchain.get_sp_and_ip_sub_slots(prev_block.header_hash)
945
948
  assert result is not None
946
949
  sp_sub_slot, ip_sub_slot = result
@@ -958,7 +961,7 @@ async def test_basic_store(
958
961
  else:
959
962
  case_1 = True
960
963
  assert res.new_infusion_points == []
961
- found_ips: List[timelord_protocol.NewInfusionPointVDF] = []
964
+ found_ips: list[timelord_protocol.NewInfusionPointVDF] = []
962
965
  peak = blockchain.get_peak()
963
966
 
964
967
  for ss in block.finished_sub_slots:
@@ -981,14 +984,15 @@ async def test_basic_store(
981
984
  # i2 ......... i1
982
985
  # Then do a reorg up to B2, removing all signage points after B2, but not before
983
986
  log.warning(f"Adding blocks up to {blocks[-1]}")
987
+ fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
984
988
  for block in blocks:
985
- await _validate_and_add_block_no_error(blockchain, block)
989
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
986
990
 
987
991
  log.warning("Starting loop")
988
992
  while True:
989
993
  log.warning("Looping")
990
994
  blocks = custom_block_tools.get_consecutive_blocks(1, block_list_input=blocks, skip_slots=1)
991
- await _validate_and_add_block_no_error(blockchain, blocks[-1])
995
+ await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
992
996
  peak = blockchain.get_peak()
993
997
  assert peak is not None
994
998
  result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
@@ -1015,7 +1019,7 @@ async def test_basic_store(
1015
1019
  and i1 > (i2 + 3)
1016
1020
  ):
1017
1021
  # We hit all the conditions that we want
1018
- all_sps: List[Optional[SignagePoint]] = [None] * custom_block_tools.constants.NUM_SPS_SUB_SLOT
1022
+ all_sps: list[Optional[SignagePoint]] = [None] * custom_block_tools.constants.NUM_SPS_SUB_SLOT
1019
1023
 
1020
1024
  def assert_sp_none(sp_index: int, is_none: bool) -> None:
1021
1025
  sp_to_check: Optional[SignagePoint] = all_sps[sp_index]
@@ -1041,7 +1045,7 @@ async def test_basic_store(
1041
1045
  assert store.new_signage_point(uint8(i), blockchain, peak, peak.sub_slot_iters, sp)
1042
1046
 
1043
1047
  # Adding a new peak clears all SPs after that peak
1044
- await _validate_and_add_block_no_error(blockchain, blocks[-2])
1048
+ await _validate_and_add_block_no_error(blockchain, blocks[-2], fork_info=fork_info)
1045
1049
  peak = blockchain.get_peak()
1046
1050
  assert peak is not None
1047
1051
  result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
@@ -1089,7 +1093,7 @@ async def test_basic_store(
1089
1093
  assert_sp_none(i1 + 1, False)
1090
1094
  assert_sp_none(i1 + 4, False)
1091
1095
 
1092
- await _validate_and_add_block_no_error(blockchain, blocks[-1])
1096
+ await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
1093
1097
  peak = blockchain.get_peak()
1094
1098
  assert peak is not None
1095
1099
  result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
@@ -1119,14 +1123,14 @@ async def test_basic_store(
1119
1123
  break
1120
1124
  else:
1121
1125
  for block in blocks[-2:]:
1122
- await _validate_and_add_block_no_error(blockchain, block)
1126
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
1123
1127
 
1124
1128
 
1125
1129
  @pytest.mark.limit_consensus_modes(reason="save time")
1126
1130
  @pytest.mark.anyio
1127
1131
  async def test_long_chain_slots(
1128
1132
  empty_blockchain_with_original_constants: Blockchain,
1129
- default_1000_blocks: List[FullBlock],
1133
+ default_1000_blocks: list[FullBlock],
1130
1134
  ) -> None:
1131
1135
  blockchain = empty_blockchain_with_original_constants
1132
1136
  store = FullNodeStore(blockchain.constants)
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Tuple
5
4
 
6
5
  import pytest
7
6
  from clvm.casts import int_to_bytes
@@ -141,11 +140,11 @@ async def test_coin_ids_multi(db_version: int) -> None:
141
140
 
142
141
  @pytest.mark.anyio
143
142
  async def test_hints_in_blockchain(
144
- wallet_nodes: Tuple[
143
+ wallet_nodes: tuple[
145
144
  FullNodeSimulator, FullNodeSimulator, ChiaServer, ChiaServer, WalletTool, WalletTool, BlockTools
146
145
  ],
147
146
  ) -> None:
148
- full_node_1, full_node_2, server_1, server_2, wallet_a, wallet_receiver, bt = wallet_nodes
147
+ full_node_1, _full_node_2, _server_1, _server_2, _wallet_a, _wallet_receiver, bt = wallet_nodes
149
148
 
150
149
  blocks = bt.get_consecutive_blocks(
151
150
  5,
@@ -161,7 +160,7 @@ async def test_hints_in_blockchain(
161
160
  puzzle_hash = bytes32(32 * b"\0")
162
161
  amount = int_to_bytes(1)
163
162
  hint = bytes32(32 * b"\5")
164
- coin_spent = list(blocks[-1].get_included_reward_coins())[0]
163
+ coin_spent = blocks[-1].get_included_reward_coins()[0]
165
164
  condition_dict = {
166
165
  ConditionOpcode.CREATE_COIN: [ConditionWithArgs(ConditionOpcode.CREATE_COIN, [puzzle_hash, amount, hint])]
167
166
  }