chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__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 (528) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_build_chains.py +2 -4
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  7. chia/_tests/clvm/coin_store.py +4 -7
  8. chia/_tests/clvm/test_clvm_step.py +4 -4
  9. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  10. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  11. chia/_tests/clvm/test_singletons.py +2 -4
  12. chia/_tests/clvm/test_spend_sim.py +2 -2
  13. chia/_tests/cmds/cmd_test_utils.py +27 -45
  14. chia/_tests/cmds/test_cmd_framework.py +6 -6
  15. chia/_tests/cmds/test_daemon.py +3 -3
  16. chia/_tests/cmds/test_show.py +4 -4
  17. chia/_tests/cmds/test_tx_config_args.py +1 -2
  18. chia/_tests/cmds/testing_classes.py +4 -5
  19. chia/_tests/cmds/wallet/test_did.py +24 -27
  20. chia/_tests/cmds/wallet/test_nft.py +12 -10
  21. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  22. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  23. chia/_tests/conftest.py +59 -30
  24. chia/_tests/connection_utils.py +2 -2
  25. chia/_tests/core/cmds/test_beta.py +4 -4
  26. chia/_tests/core/cmds/test_keys.py +2 -3
  27. chia/_tests/core/cmds/test_wallet.py +15 -15
  28. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  29. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  30. chia/_tests/core/daemon/test_daemon.py +11 -11
  31. chia/_tests/core/data_layer/conftest.py +2 -2
  32. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  33. chia/_tests/core/data_layer/test_data_store.py +10 -10
  34. chia/_tests/core/data_layer/util.py +11 -11
  35. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  36. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  37. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  38. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  39. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  40. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  41. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  42. chia/_tests/core/full_node/test_conditions.py +21 -23
  43. chia/_tests/core/full_node/test_full_node.py +225 -62
  44. chia/_tests/core/full_node/test_hint_management.py +2 -4
  45. chia/_tests/core/full_node/test_performance.py +0 -1
  46. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  47. chia/_tests/core/full_node/test_transactions.py +1 -2
  48. chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
  49. chia/_tests/core/mempool/test_mempool.py +29 -37
  50. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  51. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  52. chia/_tests/core/mempool/test_mempool_manager.py +963 -839
  53. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  54. chia/_tests/core/server/serve.py +7 -7
  55. chia/_tests/core/server/test_dos.py +1 -2
  56. chia/_tests/core/server/test_event_loop.py +12 -4
  57. chia/_tests/core/server/test_loop.py +7 -8
  58. chia/_tests/core/server/test_rate_limits.py +9 -8
  59. chia/_tests/core/server/test_server.py +61 -1
  60. chia/_tests/core/services/test_services.py +2 -2
  61. chia/_tests/core/ssl/test_ssl.py +2 -2
  62. chia/_tests/core/test_cost_calculation.py +2 -6
  63. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  64. chia/_tests/core/test_filter.py +0 -1
  65. chia/_tests/core/test_full_node_rpc.py +2 -2
  66. chia/_tests/core/test_merkle_set.py +1 -2
  67. chia/_tests/core/test_seeder.py +4 -4
  68. chia/_tests/core/util/test_config.py +4 -4
  69. chia/_tests/core/util/test_jsonify.py +2 -2
  70. chia/_tests/core/util/test_keychain.py +3 -3
  71. chia/_tests/core/util/test_lockfile.py +2 -1
  72. chia/_tests/core/util/test_log_exceptions.py +1 -2
  73. chia/_tests/core/util/test_streamable.py +17 -17
  74. chia/_tests/db/test_db_wrapper.py +3 -2
  75. chia/_tests/environments/wallet.py +14 -14
  76. chia/_tests/ether.py +4 -3
  77. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  78. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  79. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  80. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  81. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  82. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  83. chia/_tests/harvester/test_harvester_api.py +11 -4
  84. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  85. chia/_tests/plot_sync/test_receiver.py +11 -10
  86. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  87. chia/_tests/plot_sync/util.py +1 -2
  88. chia/_tests/plotting/test_plot_manager.py +7 -6
  89. chia/_tests/plotting/test_prover.py +30 -38
  90. chia/_tests/pools/test_pool_cmdline.py +4 -6
  91. chia/_tests/pools/test_pool_rpc.py +203 -61
  92. chia/_tests/pools/test_pool_wallet.py +3 -3
  93. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  94. chia/_tests/process_junit.py +2 -2
  95. chia/_tests/rpc/test_rpc_client.py +4 -4
  96. chia/_tests/rpc/test_rpc_server.py +3 -3
  97. chia/_tests/simulation/test_simulation.py +12 -25
  98. chia/_tests/solver/test_solver_service.py +13 -4
  99. chia/_tests/testconfig.py +2 -2
  100. chia/_tests/timelord/test_new_peak.py +22 -11
  101. chia/_tests/tools/test_run_block.py +0 -2
  102. chia/_tests/tools/test_virtual_project.py +2 -1
  103. chia/_tests/util/benchmarks.py +1 -0
  104. chia/_tests/util/blockchain.py +38 -36
  105. chia/_tests/util/blockchain_mock.py +11 -11
  106. chia/_tests/util/build_network_protocol_files.py +2 -1
  107. chia/_tests/util/coin_store.py +2 -1
  108. chia/_tests/util/config.py +1 -1
  109. chia/_tests/util/db_connection.py +2 -3
  110. chia/_tests/util/full_sync.py +9 -11
  111. chia/_tests/util/gen_ssl_certs.py +4 -5
  112. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  113. chia/_tests/util/misc.py +24 -24
  114. chia/_tests/util/network_protocol_data.py +20 -3
  115. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  116. chia/_tests/util/protocol_messages_json.py +292 -3
  117. chia/_tests/util/setup_nodes.py +62 -47
  118. chia/_tests/util/spend_sim.py +57 -57
  119. chia/_tests/util/test_async_pool.py +2 -3
  120. chia/_tests/util/test_chia_version.py +1 -3
  121. chia/_tests/util/test_config.py +3 -3
  122. chia/_tests/util/test_full_block_utils.py +6 -3
  123. chia/_tests/util/test_limited_semaphore.py +1 -2
  124. chia/_tests/util/test_misc.py +2 -2
  125. chia/_tests/util/test_network.py +1 -2
  126. chia/_tests/util/test_priority_mutex.py +3 -3
  127. chia/_tests/util/test_recursive_replace.py +5 -6
  128. chia/_tests/util/test_replace_str_to_bytes.py +8 -10
  129. chia/_tests/util/test_testnet_overrides.py +3 -3
  130. chia/_tests/util/time_out_assert.py +2 -2
  131. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  132. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  133. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  134. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  135. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  136. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  137. chia/_tests/wallet/conftest.py +6 -6
  138. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  139. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  140. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  141. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  142. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  145. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  146. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  147. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  148. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  149. chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
  150. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  151. chia/_tests/wallet/test_coin_management.py +2 -2
  152. chia/_tests/wallet/test_conditions.py +45 -51
  153. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  154. chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
  155. chia/_tests/wallet/test_notifications.py +14 -14
  156. chia/_tests/wallet/test_signer_protocol.py +5 -5
  157. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  158. chia/_tests/wallet/test_transaction_store.py +20 -20
  159. chia/_tests/wallet/test_util.py +2 -2
  160. chia/_tests/wallet/test_wallet.py +380 -228
  161. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  162. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  163. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  164. chia/_tests/wallet/test_wallet_node.py +14 -14
  165. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  166. chia/_tests/wallet/test_wallet_utils.py +2 -3
  167. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  168. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  169. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  170. chia/_tests/wallet/wallet_block_tools.py +12 -11
  171. chia/_tests/weight_proof/config.py +1 -0
  172. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  173. chia/apis/__init__.py +21 -0
  174. chia/apis/farmer_stub.py +102 -0
  175. chia/apis/full_node_stub.py +372 -0
  176. chia/apis/harvester_stub.py +57 -0
  177. chia/apis/introducer_stub.py +35 -0
  178. chia/apis/solver_stub.py +30 -0
  179. chia/apis/stub_protocol_registry.py +21 -0
  180. chia/apis/timelord_stub.py +39 -0
  181. chia/apis/wallet_stub.py +161 -0
  182. chia/cmds/beta.py +3 -4
  183. chia/cmds/beta_funcs.py +4 -3
  184. chia/cmds/check_wallet_db.py +4 -4
  185. chia/cmds/chia.py +1 -2
  186. chia/cmds/cmd_classes.py +11 -13
  187. chia/cmds/cmd_helpers.py +11 -11
  188. chia/cmds/cmds_util.py +15 -15
  189. chia/cmds/coin_funcs.py +6 -7
  190. chia/cmds/coins.py +2 -3
  191. chia/cmds/configure.py +1 -2
  192. chia/cmds/data.py +42 -42
  193. chia/cmds/data_funcs.py +81 -81
  194. chia/cmds/db.py +4 -5
  195. chia/cmds/db_backup_func.py +2 -2
  196. chia/cmds/db_upgrade_func.py +3 -3
  197. chia/cmds/db_validate_func.py +2 -2
  198. chia/cmds/dev/data.py +4 -4
  199. chia/cmds/dev/gh.py +5 -5
  200. chia/cmds/dev/installers.py +2 -3
  201. chia/cmds/dev/mempool.py +3 -4
  202. chia/cmds/dev/mempool_funcs.py +4 -4
  203. chia/cmds/dev/sim.py +8 -8
  204. chia/cmds/dump_keyring.py +3 -3
  205. chia/cmds/farm.py +6 -8
  206. chia/cmds/farm_funcs.py +25 -24
  207. chia/cmds/init_funcs.py +4 -4
  208. chia/cmds/keys.py +16 -18
  209. chia/cmds/keys_funcs.py +36 -36
  210. chia/cmds/netspace.py +1 -3
  211. chia/cmds/netspace_funcs.py +1 -2
  212. chia/cmds/options.py +3 -2
  213. chia/cmds/param_types.py +17 -16
  214. chia/cmds/passphrase.py +6 -7
  215. chia/cmds/passphrase_funcs.py +11 -13
  216. chia/cmds/peer.py +1 -3
  217. chia/cmds/peer_funcs.py +3 -3
  218. chia/cmds/plotnft.py +6 -7
  219. chia/cmds/plotnft_funcs.py +37 -26
  220. chia/cmds/rpc.py +3 -3
  221. chia/cmds/show.py +3 -5
  222. chia/cmds/show_funcs.py +9 -9
  223. chia/cmds/sim_funcs.py +25 -26
  224. chia/cmds/solver.py +1 -3
  225. chia/cmds/solver_funcs.py +1 -2
  226. chia/cmds/start_funcs.py +2 -2
  227. chia/cmds/wallet.py +76 -81
  228. chia/cmds/wallet_funcs.py +206 -177
  229. chia/consensus/augmented_chain.py +6 -6
  230. chia/consensus/block_body_validation.py +19 -15
  231. chia/consensus/block_creation.py +25 -21
  232. chia/consensus/block_header_validation.py +27 -13
  233. chia/consensus/block_height_map.py +3 -6
  234. chia/consensus/block_height_map_protocol.py +2 -2
  235. chia/consensus/block_record.py +2 -4
  236. chia/consensus/blockchain.py +58 -40
  237. chia/consensus/blockchain_interface.py +7 -7
  238. chia/consensus/coin_store_protocol.py +5 -6
  239. chia/consensus/condition_tools.py +4 -4
  240. chia/consensus/cost_calculator.py +2 -3
  241. chia/consensus/default_constants.py +16 -13
  242. chia/consensus/deficit.py +1 -3
  243. chia/consensus/difficulty_adjustment.py +3 -5
  244. chia/consensus/find_fork_point.py +2 -4
  245. chia/consensus/full_block_to_block_record.py +11 -13
  246. chia/consensus/generator_tools.py +2 -3
  247. chia/consensus/get_block_challenge.py +42 -26
  248. chia/consensus/get_block_generator.py +2 -3
  249. chia/consensus/make_sub_epoch_summary.py +8 -7
  250. chia/consensus/multiprocess_validation.py +31 -20
  251. chia/consensus/pos_quality.py +6 -23
  252. chia/consensus/pot_iterations.py +17 -44
  253. chia/consensus/signage_point.py +4 -5
  254. chia/consensus/vdf_info_computation.py +2 -4
  255. chia/daemon/client.py +8 -8
  256. chia/daemon/keychain_proxy.py +31 -37
  257. chia/daemon/server.py +32 -33
  258. chia/daemon/windows_signal.py +4 -3
  259. chia/data_layer/data_layer.py +86 -77
  260. chia/data_layer/data_layer_rpc_api.py +9 -9
  261. chia/data_layer/data_layer_rpc_client.py +13 -15
  262. chia/data_layer/data_layer_server.py +3 -3
  263. chia/data_layer/data_layer_util.py +14 -14
  264. chia/data_layer/data_layer_wallet.py +94 -101
  265. chia/data_layer/data_store.py +50 -50
  266. chia/data_layer/dl_wallet_store.py +9 -12
  267. chia/data_layer/download_data.py +8 -9
  268. chia/data_layer/s3_plugin_service.py +5 -9
  269. chia/data_layer/start_data_layer.py +5 -5
  270. chia/farmer/farmer.py +31 -31
  271. chia/farmer/farmer_api.py +45 -33
  272. chia/farmer/farmer_rpc_api.py +5 -4
  273. chia/farmer/farmer_rpc_client.py +6 -6
  274. chia/farmer/start_farmer.py +6 -6
  275. chia/full_node/block_store.py +13 -16
  276. chia/full_node/check_fork_next_block.py +1 -2
  277. chia/full_node/coin_store.py +15 -16
  278. chia/full_node/eligible_coin_spends.py +3 -3
  279. chia/full_node/fee_estimate_store.py +2 -3
  280. chia/full_node/fee_tracker.py +1 -2
  281. chia/full_node/full_block_utils.py +4 -4
  282. chia/full_node/full_node.py +238 -224
  283. chia/full_node/full_node_api.py +193 -150
  284. chia/full_node/full_node_rpc_api.py +53 -31
  285. chia/full_node/full_node_rpc_client.py +18 -19
  286. chia/full_node/full_node_store.py +45 -43
  287. chia/full_node/hint_management.py +2 -2
  288. chia/full_node/mempool.py +17 -19
  289. chia/full_node/mempool_manager.py +89 -42
  290. chia/full_node/pending_tx_cache.py +2 -3
  291. chia/full_node/start_full_node.py +5 -5
  292. chia/full_node/sync_store.py +3 -4
  293. chia/full_node/tx_processing_queue.py +34 -13
  294. chia/full_node/weight_proof.py +61 -48
  295. chia/harvester/harvester.py +25 -24
  296. chia/harvester/harvester_api.py +61 -38
  297. chia/harvester/harvester_rpc_api.py +10 -10
  298. chia/harvester/start_harvester.py +4 -4
  299. chia/introducer/introducer.py +3 -3
  300. chia/introducer/introducer_api.py +6 -4
  301. chia/introducer/start_introducer.py +4 -4
  302. chia/legacy/keyring.py +3 -3
  303. chia/plot_sync/delta.py +1 -2
  304. chia/plot_sync/receiver.py +20 -17
  305. chia/plot_sync/sender.py +15 -10
  306. chia/plotters/bladebit.py +7 -7
  307. chia/plotters/chiapos.py +2 -2
  308. chia/plotters/madmax.py +4 -4
  309. chia/plotters/plotters.py +4 -4
  310. chia/plotters/plotters_util.py +3 -3
  311. chia/plotting/cache.py +20 -14
  312. chia/plotting/check_plots.py +26 -35
  313. chia/plotting/create_plots.py +22 -23
  314. chia/plotting/manager.py +21 -14
  315. chia/plotting/prover.py +59 -42
  316. chia/plotting/util.py +16 -16
  317. chia/pools/pool_config.py +2 -1
  318. chia/pools/pool_puzzles.py +11 -12
  319. chia/pools/pool_wallet.py +34 -57
  320. chia/pools/pool_wallet_info.py +39 -10
  321. chia/protocols/farmer_protocol.py +8 -9
  322. chia/protocols/fee_estimate.py +3 -4
  323. chia/protocols/full_node_protocol.py +3 -4
  324. chia/protocols/harvester_protocol.py +27 -15
  325. chia/protocols/outbound_message.py +3 -3
  326. chia/protocols/pool_protocol.py +8 -9
  327. chia/protocols/shared_protocol.py +1 -2
  328. chia/protocols/solver_protocol.py +9 -2
  329. chia/protocols/timelord_protocol.py +4 -7
  330. chia/protocols/wallet_protocol.py +11 -12
  331. chia/rpc/rpc_client.py +9 -9
  332. chia/rpc/rpc_server.py +17 -17
  333. chia/rpc/util.py +2 -2
  334. chia/seeder/crawler.py +8 -8
  335. chia/seeder/crawler_api.py +21 -27
  336. chia/seeder/crawler_rpc_api.py +2 -2
  337. chia/seeder/dns_server.py +21 -21
  338. chia/seeder/start_crawler.py +4 -4
  339. chia/server/address_manager.py +15 -16
  340. chia/server/api_protocol.py +11 -11
  341. chia/server/chia_policy.py +46 -26
  342. chia/server/introducer_peers.py +2 -3
  343. chia/server/node_discovery.py +19 -19
  344. chia/server/rate_limit_numbers.py +4 -5
  345. chia/server/rate_limits.py +4 -4
  346. chia/server/resolve_peer_info.py +4 -4
  347. chia/server/server.py +49 -52
  348. chia/server/signal_handlers.py +6 -6
  349. chia/server/start_service.py +17 -17
  350. chia/server/upnp.py +4 -6
  351. chia/server/ws_connection.py +52 -37
  352. chia/simulator/add_blocks_in_batches.py +1 -3
  353. chia/simulator/block_tools.py +312 -200
  354. chia/simulator/full_node_simulator.py +56 -35
  355. chia/simulator/keyring.py +2 -3
  356. chia/simulator/setup_services.py +15 -15
  357. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  358. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  359. chia/simulator/simulator_protocol.py +1 -2
  360. chia/simulator/simulator_test_tools.py +3 -3
  361. chia/simulator/start_simulator.py +7 -7
  362. chia/simulator/wallet_tools.py +10 -10
  363. chia/solver/solver.py +10 -10
  364. chia/solver/solver_api.py +10 -8
  365. chia/solver/solver_rpc_api.py +2 -2
  366. chia/solver/start_solver.py +4 -4
  367. chia/ssl/cacert.pem +148 -90
  368. chia/ssl/chia_ca.crt +14 -10
  369. chia/ssl/chia_ca_old.crt +19 -0
  370. chia/ssl/create_ssl.py +4 -4
  371. chia/ssl/renewedselfsignedca.conf +4 -0
  372. chia/ssl/ssl_check.py +1 -2
  373. chia/timelord/iters_from_block.py +1 -4
  374. chia/timelord/start_timelord.py +4 -4
  375. chia/timelord/timelord.py +44 -40
  376. chia/timelord/timelord_api.py +6 -4
  377. chia/timelord/timelord_launcher.py +2 -2
  378. chia/timelord/timelord_rpc_api.py +2 -2
  379. chia/timelord/timelord_state.py +11 -12
  380. chia/types/block_protocol.py +1 -3
  381. chia/types/blockchain_format/coin.py +1 -3
  382. chia/types/blockchain_format/program.py +11 -8
  383. chia/types/blockchain_format/proof_of_space.py +123 -76
  384. chia/types/blockchain_format/tree_hash.py +3 -3
  385. chia/types/blockchain_format/vdf.py +1 -2
  386. chia/types/coin_spend.py +3 -3
  387. chia/types/mempool_item.py +5 -5
  388. chia/types/mempool_submission_status.py +2 -3
  389. chia/types/peer_info.py +1 -2
  390. chia/types/unfinished_header_block.py +3 -4
  391. chia/types/validation_state.py +1 -2
  392. chia/util/action_scope.py +8 -8
  393. chia/util/async_pool.py +5 -5
  394. chia/util/bech32m.py +1 -2
  395. chia/util/beta_metrics.py +2 -2
  396. chia/util/block_cache.py +4 -4
  397. chia/util/chia_logging.py +2 -2
  398. chia/util/chia_version.py +1 -2
  399. chia/util/config.py +15 -16
  400. chia/util/db_wrapper.py +26 -27
  401. chia/util/default_root.py +1 -2
  402. chia/util/errors.py +3 -3
  403. chia/util/file_keyring.py +14 -14
  404. chia/util/files.py +2 -3
  405. chia/util/hash.py +4 -4
  406. chia/util/initial-config.yaml +3 -5
  407. chia/util/inline_executor.py +2 -1
  408. chia/util/ip_address.py +1 -2
  409. chia/util/keychain.py +25 -27
  410. chia/util/keyring_wrapper.py +18 -19
  411. chia/util/lock.py +3 -4
  412. chia/util/log_exceptions.py +1 -2
  413. chia/util/lru_cache.py +2 -2
  414. chia/util/network.py +6 -6
  415. chia/util/path.py +2 -3
  416. chia/util/priority_mutex.py +2 -2
  417. chia/util/profiler.py +1 -2
  418. chia/util/safe_cancel_task.py +1 -2
  419. chia/util/streamable.py +22 -8
  420. chia/util/task_referencer.py +1 -1
  421. chia/util/timing.py +3 -3
  422. chia/util/virtual_project_analysis.py +6 -5
  423. chia/util/ws_message.py +2 -2
  424. chia/wallet/cat_wallet/cat_info.py +3 -4
  425. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  426. chia/wallet/cat_wallet/cat_utils.py +3 -4
  427. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  428. chia/wallet/cat_wallet/lineage_store.py +3 -4
  429. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  430. chia/wallet/coin_selection.py +9 -10
  431. chia/wallet/conditions.py +120 -105
  432. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  433. chia/wallet/derivation_record.py +1 -2
  434. chia/wallet/derive_keys.py +2 -4
  435. chia/wallet/did_wallet/did_info.py +10 -11
  436. chia/wallet/did_wallet/did_wallet.py +36 -82
  437. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  438. chia/wallet/driver_protocol.py +5 -7
  439. chia/wallet/lineage_proof.py +4 -4
  440. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  441. chia/wallet/nft_wallet/nft_info.py +8 -9
  442. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  443. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  444. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  445. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  446. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  447. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  448. chia/wallet/notification_manager.py +3 -3
  449. chia/wallet/notification_store.py +44 -61
  450. chia/wallet/outer_puzzles.py +6 -7
  451. chia/wallet/puzzle_drivers.py +34 -6
  452. chia/wallet/puzzles/clawback/drivers.py +6 -6
  453. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  454. chia/wallet/puzzles/load_clvm.py +1 -1
  455. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  456. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  457. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  458. chia/wallet/puzzles/tails.py +3 -3
  459. chia/wallet/singleton.py +5 -7
  460. chia/wallet/singleton_record.py +3 -3
  461. chia/wallet/start_wallet.py +5 -5
  462. chia/wallet/trade_manager.py +37 -58
  463. chia/wallet/trade_record.py +4 -4
  464. chia/wallet/trading/offer.py +59 -46
  465. chia/wallet/trading/trade_store.py +8 -9
  466. chia/wallet/transaction_record.py +8 -8
  467. chia/wallet/uncurried_puzzle.py +1 -2
  468. chia/wallet/util/clvm_streamable.py +12 -12
  469. chia/wallet/util/compute_hints.py +4 -5
  470. chia/wallet/util/curry_and_treehash.py +1 -2
  471. chia/wallet/util/merkle_tree.py +2 -3
  472. chia/wallet/util/peer_request_cache.py +8 -8
  473. chia/wallet/util/signing.py +85 -0
  474. chia/wallet/util/tx_config.py +15 -6
  475. chia/wallet/util/wallet_sync_utils.py +14 -16
  476. chia/wallet/util/wallet_types.py +2 -2
  477. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  478. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  479. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  480. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  481. chia/wallet/vc_wallet/vc_store.py +5 -6
  482. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  483. chia/wallet/wallet.py +50 -78
  484. chia/wallet/wallet_action_scope.py +11 -11
  485. chia/wallet/wallet_blockchain.py +12 -12
  486. chia/wallet/wallet_coin_record.py +12 -6
  487. chia/wallet/wallet_coin_store.py +24 -25
  488. chia/wallet/wallet_interested_store.py +3 -5
  489. chia/wallet/wallet_nft_store.py +10 -11
  490. chia/wallet/wallet_node.py +53 -61
  491. chia/wallet/wallet_node_api.py +5 -3
  492. chia/wallet/wallet_protocol.py +23 -23
  493. chia/wallet/wallet_puzzle_store.py +15 -18
  494. chia/wallet/wallet_request_types.py +778 -114
  495. chia/wallet/wallet_retry_store.py +1 -3
  496. chia/wallet/wallet_rpc_api.py +572 -909
  497. chia/wallet/wallet_rpc_client.py +87 -279
  498. chia/wallet/wallet_singleton_store.py +3 -4
  499. chia/wallet/wallet_state_manager.py +332 -106
  500. chia/wallet/wallet_transaction_store.py +11 -14
  501. chia/wallet/wallet_user_store.py +4 -6
  502. chia/wallet/wallet_weight_proof_handler.py +4 -4
  503. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
  505. chia/apis.py +0 -21
  506. chia/consensus/check_time_locks.py +0 -57
  507. chia/data_layer/puzzles/__init__.py +0 -0
  508. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  509. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  510. chia/types/coin_record.py +0 -44
  511. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  512. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  513. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  514. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  515. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  516. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  517. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  518. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  520. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  521. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  522. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  524. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  525. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  526. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
@@ -7,10 +7,11 @@ import logging
7
7
  import traceback
8
8
  from concurrent.futures import Executor, ThreadPoolExecutor
9
9
  from enum import Enum
10
- from typing import TYPE_CHECKING, ClassVar, Optional, cast
10
+ from typing import TYPE_CHECKING, ClassVar, cast
11
11
 
12
12
  from chia_rs import (
13
13
  BlockRecord,
14
+ CoinRecord,
14
15
  ConsensusConstants,
15
16
  EndOfSubSlotBundle,
16
17
  FullBlock,
@@ -33,12 +34,12 @@ from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_dif
33
34
  from chia.consensus.find_fork_point import lookup_fork_chain
34
35
  from chia.consensus.full_block_to_block_record import block_to_block_record
35
36
  from chia.consensus.generator_tools import get_block_header
37
+ from chia.consensus.get_block_challenge import pre_sp_tx_block_height
36
38
  from chia.consensus.get_block_generator import get_block_generator
37
39
  from chia.consensus.multiprocess_validation import PreValidationResult
38
40
  from chia.full_node.block_store import BlockStore
39
41
  from chia.types.blockchain_format.coin import Coin
40
42
  from chia.types.blockchain_format.vdf import VDFInfo
41
- from chia.types.coin_record import CoinRecord
42
43
  from chia.types.generator_types import BlockGenerator
43
44
  from chia.types.unfinished_header_block import UnfinishedHeaderBlock
44
45
  from chia.types.validation_state import ValidationState
@@ -73,7 +74,7 @@ class StateChangeSummary:
73
74
  # list of coin-id, puzzle-hash pairs
74
75
  removals: list[tuple[bytes32, bytes32]]
75
76
  # new coin and hint
76
- additions: list[tuple[Coin, Optional[bytes]]]
77
+ additions: list[tuple[Coin, bytes | None]]
77
78
  new_rewards: list[Coin]
78
79
 
79
80
 
@@ -93,7 +94,7 @@ class Blockchain:
93
94
  constants: ConsensusConstants
94
95
 
95
96
  # peak of the blockchain
96
- _peak_height: Optional[uint32]
97
+ _peak_height: uint32 | None
97
98
  # All blocks in peak path are guaranteed to be included, can include orphan blocks
98
99
  __block_records: dict[bytes32, BlockRecord]
99
100
  # all hashes of blocks in block_record by height, used for garbage collection
@@ -185,7 +186,7 @@ class Blockchain:
185
186
  assert self.__height_map.contains_height(self._peak_height)
186
187
  assert not self.__height_map.contains_height(uint32(self._peak_height + 1))
187
188
 
188
- def get_peak(self) -> Optional[BlockRecord]:
189
+ def get_peak(self) -> BlockRecord | None:
189
190
  """
190
191
  Return the peak of the blockchain
191
192
  """
@@ -193,7 +194,7 @@ class Blockchain:
193
194
  return None
194
195
  return self.height_to_block_record(self._peak_height)
195
196
 
196
- def get_tx_peak(self) -> Optional[BlockRecord]:
197
+ def get_tx_peak(self) -> BlockRecord | None:
197
198
  """
198
199
  Return the most recent transaction block. i.e. closest to the peak of the blockchain
199
200
  Requires the blockchain to be initialized and there to be a peak set
@@ -213,17 +214,17 @@ class Blockchain:
213
214
 
214
215
  return tx_peak
215
216
 
216
- async def get_full_peak(self) -> Optional[FullBlock]:
217
+ async def get_full_peak(self) -> FullBlock | None:
217
218
  if self._peak_height is None:
218
219
  return None
219
220
  """ Return list of FullBlocks that are peaks"""
220
- peak_hash: Optional[bytes32] = self.height_to_hash(self._peak_height)
221
+ peak_hash: bytes32 | None = self.height_to_hash(self._peak_height)
221
222
  assert peak_hash is not None # Since we must have the peak block
222
223
  block = await self.block_store.get_full_block(peak_hash)
223
224
  assert block is not None
224
225
  return block
225
226
 
226
- async def get_full_block(self, header_hash: bytes32) -> Optional[FullBlock]:
227
+ async def get_full_block(self, header_hash: bytes32) -> FullBlock | None:
227
228
  return await self.block_store.get_full_block(header_hash)
228
229
 
229
230
  async def advance_fork_info(self, block: FullBlock, fork_info: ForkInfo) -> None:
@@ -258,7 +259,7 @@ class Blockchain:
258
259
  assert len(chain) == block.height - fork_info.peak_height - 1
259
260
 
260
261
  for height in range(fork_info.peak_height + 1, block.height):
261
- fork_block: Optional[FullBlock] = await self.block_store.get_full_block(chain[uint32(height)])
262
+ fork_block: FullBlock | None = await self.block_store.get_full_block(chain[uint32(height)])
262
263
  assert fork_block is not None
263
264
  await self.run_single_block(fork_block, fork_info)
264
265
 
@@ -266,14 +267,21 @@ class Blockchain:
266
267
  assert fork_info.peak_height == block.height - 1
267
268
  assert block.height == 0 or fork_info.peak_hash == block.prev_header_hash
268
269
 
269
- additions: list[tuple[Coin, Optional[bytes]]] = []
270
+ additions: list[tuple[Coin, bytes | None]] = []
270
271
  removals: list[tuple[bytes32, Coin]] = []
271
272
  if block.transactions_generator is not None:
272
- block_generator: Optional[BlockGenerator] = await get_block_generator(self.lookup_block_generators, block)
273
+ block_generator: BlockGenerator | None = await get_block_generator(self.lookup_block_generators, block)
273
274
  assert block_generator is not None
274
275
  assert block.transactions_info is not None
275
276
  assert block.foliage_transaction_block is not None
276
- flags = get_flags_for_height_and_constants(block.height, self.constants)
277
+ prev_tx_height = pre_sp_tx_block_height(
278
+ constants=self.constants,
279
+ blocks=self,
280
+ prev_b_hash=block.prev_header_hash,
281
+ sp_index=block.reward_chain_block.signage_point_index,
282
+ first_in_sub_slot=len(block.finished_sub_slots) > 0,
283
+ )
284
+ flags = get_flags_for_height_and_constants(prev_tx_height, self.constants)
277
285
  additions, removals = additions_and_removals(
278
286
  bytes(block.transactions_generator),
279
287
  block_generator.generator_refs,
@@ -289,9 +297,9 @@ class Blockchain:
289
297
  pre_validation_result: PreValidationResult,
290
298
  sub_slot_iters: uint64,
291
299
  fork_info: ForkInfo,
292
- prev_ses_block: Optional[BlockRecord] = None,
293
- block_record: Optional[BlockRecord] = None,
294
- ) -> tuple[AddBlockResult, Optional[Err], Optional[StateChangeSummary]]:
300
+ prev_ses_block: BlockRecord | None = None,
301
+ block_record: BlockRecord | None = None,
302
+ ) -> tuple[AddBlockResult, Err | None, StateChangeSummary | None]:
295
303
  """
296
304
  This method must be called under the blockchain lock
297
305
  Adds a new block into the blockchain, if it's valid and connected to the current
@@ -325,7 +333,7 @@ class Blockchain:
325
333
  # first check if this block is disconnected from the currently known
326
334
  # blocks. We can only accept blocks that are connected to another block
327
335
  # we know of.
328
- prev_block: Optional[BlockRecord] = None
336
+ prev_block: BlockRecord | None = None
329
337
  if not extending_main_chain and not genesis:
330
338
  prev_block = self.try_block_record(block.prev_header_hash)
331
339
  if prev_block is None:
@@ -480,7 +488,7 @@ class Blockchain:
480
488
  block_record: BlockRecord,
481
489
  genesis: bool,
482
490
  fork_info: ForkInfo,
483
- ) -> tuple[list[BlockRecord], Optional[StateChangeSummary]]:
491
+ ) -> tuple[list[BlockRecord], StateChangeSummary | None]:
484
492
  """
485
493
  When a new block is added, this is called, to check if the new block is the new peak of the chain.
486
494
  This also handles reorgs by reverting blocks which are not in the heaviest chain.
@@ -620,14 +628,14 @@ class Blockchain:
620
628
 
621
629
  async def get_sp_and_ip_sub_slots(
622
630
  self, header_hash: bytes32
623
- ) -> Optional[tuple[Optional[EndOfSubSlotBundle], Optional[EndOfSubSlotBundle]]]:
624
- block: Optional[FullBlock] = await self.block_store.get_full_block(header_hash)
631
+ ) -> tuple[EndOfSubSlotBundle | None, EndOfSubSlotBundle | None] | None:
632
+ block: FullBlock | None = await self.block_store.get_full_block(header_hash)
625
633
  if block is None:
626
634
  return None
627
635
  curr_br: BlockRecord = self.block_record(block.header_hash)
628
636
  is_overflow = curr_br.overflow
629
637
 
630
- curr: Optional[FullBlock] = block
638
+ curr: FullBlock | None = block
631
639
  assert curr is not None
632
640
  while True:
633
641
  if curr_br.first_in_sub_slot:
@@ -652,7 +660,7 @@ class Blockchain:
652
660
  # Have both sub-slots
653
661
  return curr.finished_sub_slots[-2], ip_sub_slot
654
662
 
655
- prev_curr: Optional[FullBlock] = await self.block_store.get_full_block(curr.prev_header_hash)
663
+ prev_curr: FullBlock | None = await self.block_store.get_full_block(curr.prev_header_hash)
656
664
  if prev_curr is None:
657
665
  assert curr.height == 0
658
666
  prev_curr = curr
@@ -676,7 +684,7 @@ class Blockchain:
676
684
  if peak is None:
677
685
  return []
678
686
  recent_rc: list[tuple[bytes32, uint128]] = []
679
- curr: Optional[BlockRecord] = peak
687
+ curr: BlockRecord | None = peak
680
688
  while curr is not None and len(recent_rc) < 2 * self.constants.MAX_SUB_SLOT_BLOCKS:
681
689
  if curr != peak:
682
690
  recent_rc.append((curr.reward_infusion_new_challenge, curr.total_iters))
@@ -694,16 +702,26 @@ class Blockchain:
694
702
 
695
703
  async def validate_unfinished_block_header(
696
704
  self, block: UnfinishedBlock, skip_overflow_ss_validation: bool = True
697
- ) -> tuple[Optional[uint64], Optional[Err]]:
705
+ ) -> tuple[uint64 | None, Err | None]:
698
706
  if len(block.transactions_generator_ref_list) > self.constants.MAX_GENERATOR_REF_LIST_SIZE:
699
707
  return None, Err.TOO_MANY_GENERATOR_REFS
700
708
 
701
- if (
702
- self.try_block_record(block.prev_header_hash) is None
703
- and block.prev_header_hash != self.constants.GENESIS_CHALLENGE
704
- ):
709
+ prev_b = self.try_block_record(block.prev_header_hash)
710
+ if prev_b is None and block.prev_header_hash != self.constants.GENESIS_CHALLENGE:
705
711
  return None, Err.INVALID_PREV_BLOCK_HASH
706
712
 
713
+ prev_tx_height = pre_sp_tx_block_height(
714
+ constants=self.constants,
715
+ blocks=self,
716
+ prev_b_hash=block.prev_header_hash,
717
+ sp_index=block.reward_chain_block.signage_point_index,
718
+ first_in_sub_slot=len(block.finished_sub_slots) > 0,
719
+ )
720
+
721
+ # With hard fork 2 we ban transactions_generator_ref_list.
722
+ if prev_tx_height >= self.constants.HARD_FORK2_HEIGHT and block.transactions_generator_ref_list != []:
723
+ return None, Err.TOO_MANY_GENERATOR_REFS
724
+
707
725
  if block.transactions_info is not None:
708
726
  if block.transactions_generator is not None:
709
727
  if std_hash(bytes(block.transactions_generator)) != block.transactions_info.generator_root:
@@ -750,7 +768,7 @@ class Blockchain:
750
768
  return required_iters, None
751
769
 
752
770
  async def validate_unfinished_block(
753
- self, block: UnfinishedBlock, npc_result: Optional[NPCResult], skip_overflow_ss_validation: bool = True
771
+ self, block: UnfinishedBlock, npc_result: NPCResult | None, skip_overflow_ss_validation: bool = True
754
772
  ) -> PreValidationResult:
755
773
  required_iters, error = await self.validate_unfinished_block_header(block, skip_overflow_ss_validation)
756
774
 
@@ -793,7 +811,7 @@ class Blockchain:
793
811
 
794
812
  def height_to_block_record(self, height: uint32) -> BlockRecord:
795
813
  # Precondition: height is in the blockchain
796
- header_hash: Optional[bytes32] = self.height_to_hash(height)
814
+ header_hash: bytes32 | None = self.height_to_hash(height)
797
815
  if header_hash is None:
798
816
  raise ValueError(f"Height is not in blockchain: {height}")
799
817
  return self.block_record(header_hash)
@@ -804,7 +822,7 @@ class Blockchain:
804
822
  def get_ses(self, height: uint32) -> SubEpochSummary:
805
823
  return self.__height_map.get_ses(height)
806
824
 
807
- def height_to_hash(self, height: uint32) -> Optional[bytes32]:
825
+ def height_to_hash(self, height: uint32) -> bytes32 | None:
808
826
  if not self.__height_map.contains_height(height):
809
827
  return None
810
828
  return self.__height_map.get_hash(height)
@@ -812,7 +830,7 @@ class Blockchain:
812
830
  def contains_height(self, height: uint32) -> bool:
813
831
  return self.__height_map.contains_height(height)
814
832
 
815
- def get_peak_height(self) -> Optional[uint32]:
833
+ def get_peak_height(self) -> uint32 | None:
816
834
  return self._peak_height
817
835
 
818
836
  async def warmup(self, fork_point: uint32) -> None:
@@ -876,7 +894,7 @@ class Blockchain:
876
894
  ) -> dict[bytes32, HeaderBlock]:
877
895
  hashes = []
878
896
  for height in range(start, stop + 1):
879
- header_hash: Optional[bytes32] = self.height_to_hash(uint32(height))
897
+ header_hash: bytes32 | None = self.height_to_hash(uint32(height))
880
898
  if header_hash is not None:
881
899
  hashes.append(header_hash)
882
900
 
@@ -917,7 +935,7 @@ class Blockchain:
917
935
 
918
936
  async def get_header_block_by_height(
919
937
  self, height: int, header_hash: bytes32, tx_filter: bool = True
920
- ) -> Optional[HeaderBlock]:
938
+ ) -> HeaderBlock | None:
921
939
  header_dict: dict[bytes32, HeaderBlock] = await self.get_header_blocks_in_range(height, height, tx_filter)
922
940
  if len(header_dict) == 0:
923
941
  return None
@@ -931,19 +949,19 @@ class Blockchain:
931
949
  """
932
950
  hashes: list[bytes32] = []
933
951
  for height in heights:
934
- header_hash: Optional[bytes32] = self.height_to_hash(height)
952
+ header_hash: bytes32 | None = self.height_to_hash(height)
935
953
  if header_hash is None:
936
954
  raise ValueError(f"Do not have block at height {height}")
937
955
  hashes.append(header_hash)
938
956
 
939
957
  return await self.block_store.get_block_records_by_hash(hashes)
940
958
 
941
- def try_block_record(self, header_hash: bytes32) -> Optional[BlockRecord]:
959
+ def try_block_record(self, header_hash: bytes32) -> BlockRecord | None:
942
960
  if header_hash in self.__block_records:
943
961
  return self.block_record(header_hash)
944
962
  return None
945
963
 
946
- async def get_block_record_from_db(self, header_hash: bytes32) -> Optional[BlockRecord]:
964
+ async def get_block_record_from_db(self, header_hash: bytes32) -> BlockRecord | None:
947
965
  ret = self.__block_records.get(header_hash)
948
966
  if ret is not None:
949
967
  return ret
@@ -993,8 +1011,8 @@ class Blockchain:
993
1011
  async def get_sub_epoch_challenge_segments(
994
1012
  self,
995
1013
  ses_block_hash: bytes32,
996
- ) -> Optional[list[SubEpochChallengeSegment]]:
997
- segments: Optional[list[SubEpochChallengeSegment]] = await self.block_store.get_sub_epoch_challenge_segments(
1014
+ ) -> list[SubEpochChallengeSegment] | None:
1015
+ segments: list[SubEpochChallengeSegment] | None = await self.block_store.get_sub_epoch_challenge_segments(
998
1016
  ses_block_hash
999
1017
  )
1000
1018
  if segments is None:
@@ -1040,7 +1058,7 @@ class Blockchain:
1040
1058
  peak_block = await self.get_block_record_from_db(header_hash)
1041
1059
  assert peak_block is not None
1042
1060
  if self.height_to_hash(peak_block.height) != header_hash:
1043
- peak: Optional[BlockRecord] = self.get_peak()
1061
+ peak: BlockRecord | None = self.get_peak()
1044
1062
  assert peak is not None
1045
1063
  reorg_chain: dict[uint32, bytes32]
1046
1064
  # Then we look up blocks up to fork point one at a time, backtracking
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional, Protocol
3
+ from typing import Protocol
4
4
 
5
5
  from chia_rs import BlockRecord, HeaderBlock, SubEpochChallengeSegment, SubEpochSummary
6
6
  from chia_rs.sized_bytes import bytes32
@@ -8,11 +8,11 @@ from chia_rs.sized_ints import uint32
8
8
 
9
9
 
10
10
  class BlockRecordsProtocol(Protocol):
11
- def try_block_record(self, header_hash: bytes32) -> Optional[BlockRecord]: ...
11
+ def try_block_record(self, header_hash: bytes32) -> BlockRecord | None: ...
12
12
  def block_record(self, header_hash: bytes32) -> BlockRecord: ...
13
13
  def contains_height(self, height: uint32) -> bool: ...
14
14
  def contains_block(self, header_hash: bytes32, height: uint32) -> bool: ...
15
- def height_to_hash(self, height: uint32) -> Optional[bytes32]: ...
15
+ def height_to_hash(self, height: uint32) -> bytes32 | None: ...
16
16
  def height_to_block_record(self, height: uint32) -> BlockRecord: ...
17
17
 
18
18
  # given a list of block header hashes, return the header hashes of their
@@ -25,13 +25,13 @@ class BlocksProtocol(BlockRecordsProtocol, Protocol):
25
25
  async def lookup_block_generators(
26
26
  self, header_hash: bytes32, generator_refs: set[uint32]
27
27
  ) -> dict[uint32, bytes]: ...
28
- async def get_block_record_from_db(self, header_hash: bytes32) -> Optional[BlockRecord]: ...
28
+ async def get_block_record_from_db(self, header_hash: bytes32) -> BlockRecord | None: ...
29
29
  def add_block_record(self, block_record: BlockRecord) -> None: ...
30
30
 
31
31
 
32
32
  class BlockchainInterface(BlocksProtocol, Protocol):
33
- def get_peak(self) -> Optional[BlockRecord]: ...
34
- def get_peak_height(self) -> Optional[uint32]: ...
33
+ def get_peak(self) -> BlockRecord | None: ...
34
+ def get_peak_height(self) -> uint32 | None: ...
35
35
  def get_ses_heights(self) -> list[uint32]: ...
36
36
  def get_ses(self, height: uint32) -> SubEpochSummary: ...
37
37
  async def contains_block_from_db(self, header_hash: bytes32) -> bool: ...
@@ -50,4 +50,4 @@ class BlockchainInterface(BlocksProtocol, Protocol):
50
50
  async def get_sub_epoch_challenge_segments(
51
51
  self,
52
52
  sub_epoch_summary_hash: bytes32,
53
- ) -> Optional[list[SubEpochChallengeSegment]]: ...
53
+ ) -> list[SubEpochChallengeSegment] | None: ...
@@ -1,14 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections.abc import Collection
4
- from typing import Optional, Protocol
4
+ from typing import Protocol
5
5
 
6
- from chia_rs import CoinState
6
+ from chia_rs import CoinRecord, CoinState
7
7
  from chia_rs.sized_bytes import bytes32
8
8
  from chia_rs.sized_ints import uint32, uint64
9
9
 
10
10
  from chia.types.blockchain_format.coin import Coin
11
- from chia.types.coin_record import CoinRecord
12
11
  from chia.types.mempool_item import UnspentLineageInfo
13
12
 
14
13
 
@@ -30,7 +29,7 @@ class CoinStoreProtocol(Protocol):
30
29
  Add a new block to the coin store
31
30
  """
32
31
 
33
- async def get_coin_record(self, coin_id: bytes32) -> Optional[CoinRecord]:
32
+ async def get_coin_record(self, coin_id: bytes32) -> CoinRecord | None:
34
33
  """
35
34
  Returns the coin record for the specified coin id
36
35
  """
@@ -129,12 +128,12 @@ class CoinStoreProtocol(Protocol):
129
128
  include_hinted: bool = ...,
130
129
  min_amount: uint64 = ...,
131
130
  max_items: int = ...,
132
- ) -> tuple[list[CoinState], Optional[uint32]]:
131
+ ) -> tuple[list[CoinState], uint32 | None]:
133
132
  """
134
133
  Returns the coin states, as well as the next block height (or `None` if finished).
135
134
  """
136
135
 
137
- async def get_unspent_lineage_info_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[UnspentLineageInfo]:
136
+ async def get_unspent_lineage_info_for_puzzle_hash(self, puzzle_hash: bytes32) -> UnspentLineageInfo | None:
138
137
  """
139
138
  Lookup the most recent unspent lineage that matches a puzzle hash
140
139
  """
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections.abc import Callable
3
4
  from functools import lru_cache
4
- from typing import Callable, Union
5
5
 
6
6
  from chia_rs import G1Element, SpendBundleConditions, SpendConditions
7
7
  from chia_rs.sized_bytes import bytes32
@@ -74,7 +74,7 @@ def agg_sig_additional_data(agg_sig_data: bytes) -> dict[ConditionOpcode, bytes]
74
74
  def make_aggsig_final_message(
75
75
  opcode: ConditionOpcode,
76
76
  msg: bytes,
77
- spend_conditions: Union[Coin, SpendConditions],
77
+ spend_conditions: Coin | SpendConditions,
78
78
  agg_sig_additional_data: dict[ConditionOpcode, bytes],
79
79
  ) -> bytes:
80
80
  if isinstance(spend_conditions, Coin):
@@ -181,7 +181,7 @@ def created_outputs_for_conditions_dict(
181
181
 
182
182
 
183
183
  def conditions_dict_for_solution(
184
- puzzle_reveal: Union[Program, SerializedProgram], solution: Union[Program, SerializedProgram], max_cost: int
184
+ puzzle_reveal: Program | SerializedProgram, solution: Program | SerializedProgram, max_cost: int
185
185
  ) -> dict[ConditionOpcode, list[ConditionWithArgs]]:
186
186
  conditions_dict: dict[ConditionOpcode, list[ConditionWithArgs]] = {}
187
187
  for cvp in conditions_for_solution(puzzle_reveal, solution, max_cost):
@@ -190,7 +190,7 @@ def conditions_dict_for_solution(
190
190
 
191
191
 
192
192
  def conditions_for_solution(
193
- puzzle_reveal: Union[Program, SerializedProgram], solution: Union[Program, SerializedProgram], max_cost: int
193
+ puzzle_reveal: Program | SerializedProgram, solution: Program | SerializedProgram, max_cost: int
194
194
  ) -> list[ConditionWithArgs]:
195
195
  # get the standard script for a puzzle hash and feed in the solution
196
196
  try:
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Optional
5
4
 
6
5
  from chia_rs import SpendBundleConditions
7
6
  from chia_rs.sized_ints import uint16
@@ -12,5 +11,5 @@ from chia.util.streamable import Streamable, streamable
12
11
  @streamable
13
12
  @dataclass(frozen=True)
14
13
  class NPCResult(Streamable):
15
- error: Optional[uint16]
16
- conds: Optional[SpendBundleConditions]
14
+ error: uint16 | None
15
+ conds: SpendBundleConditions | None
@@ -34,8 +34,7 @@ DEFAULT_CONSTANTS = ConsensusConstants(
34
34
  ), # H(plot signature of the challenge) must start with these many zeroes. for v2 plots
35
35
  MIN_PLOT_SIZE_V1=uint8(32), # 32 for mainnet
36
36
  MAX_PLOT_SIZE_V1=uint8(50),
37
- MIN_PLOT_SIZE_V2=uint8(28),
38
- MAX_PLOT_SIZE_V2=uint8(32),
37
+ PLOT_SIZE_V2=uint8(28),
39
38
  SUB_SLOT_TIME_TARGET=uint16(600), # The target number of seconds per slot, mainnet 600
40
39
  NUM_SP_INTERVALS_EXTRA=uint8(3), # The number of sp intervals to add to the signage point
41
40
  MAX_FUTURE_TIME2=uint32(2 * 60), # The next block can have a timestamp of at most these many seconds in the future
@@ -76,27 +75,28 @@ DEFAULT_CONSTANTS = ConsensusConstants(
76
75
  # inclusive, so the max allowed range of 32 is a request for 33 blocks
77
76
  # (which is allowed)
78
77
  MAX_BLOCK_COUNT_PER_REQUESTS=uint32(32),
79
- MAX_GENERATOR_SIZE=uint32(1000000),
80
78
  MAX_GENERATOR_REF_LIST_SIZE=uint32(512), # Number of references allowed in the block generator ref list
81
79
  POOL_SUB_SLOT_ITERS=uint64(37600000000), # iters limit * NUM_SPS
82
80
  # June 2024
83
81
  HARD_FORK_HEIGHT=uint32(5496000),
82
+ # TODO: todo_v2_plots finalize fork height
84
83
  HARD_FORK2_HEIGHT=uint32(0xFFFFFFFA),
85
84
  # starting at the hard fork 2 height, v1 plots will gradually be phased out,
86
- # and stop working entirely after this many blocks
87
- PLOT_V1_PHASE_OUT=uint32(1179648),
85
+ # and stop working entirely after (1 << this) many epochs
86
+ PLOT_V1_PHASE_OUT_EPOCH_BITS=uint8(8),
88
87
  # June 2027
89
88
  PLOT_FILTER_128_HEIGHT=uint32(10542000),
90
89
  # June 2030
91
90
  PLOT_FILTER_64_HEIGHT=uint32(15592000),
92
91
  # June 2033
93
92
  PLOT_FILTER_32_HEIGHT=uint32(20643000),
94
- PLOT_STRENGTH_INITIAL=uint8(2),
95
- PLOT_STRENGTH_4_HEIGHT=uint32(0xFFFFFFFB),
96
- PLOT_STRENGTH_5_HEIGHT=uint32(0xFFFFFFFC),
97
- PLOT_STRENGTH_6_HEIGHT=uint32(0xFFFFFFFD),
98
- PLOT_STRENGTH_7_HEIGHT=uint32(0xFFFFFFFE),
99
- PLOT_STRENGTH_8_HEIGHT=uint32(0xFFFFFFFF),
93
+ MIN_PLOT_STRENGTH=uint8(2),
94
+ MAX_PLOT_STRENGTH=uint8(32),
95
+ QUALITY_PROOF_SCAN_FILTER=uint8(5),
96
+ # TODO: todo_v2_plots finalize plot filter schedule
97
+ PLOT_FILTER_V2_FIRST_ADJUSTMENT_HEIGHT=uint32(0xFFFFFFFB),
98
+ PLOT_FILTER_V2_SECOND_ADJUSTMENT_HEIGHT=uint32(0xFFFFFFFC),
99
+ PLOT_FILTER_V2_THIRD_ADJUSTMENT_HEIGHT=uint32(0xFFFFFFFD),
100
100
  )
101
101
 
102
102
 
@@ -109,5 +109,8 @@ def update_testnet_overrides(network_id: str, overrides: dict[str, Any]) -> None
109
109
  overrides["MAX_PLOT_SIZE_V1"] = overrides["MAX_PLOT_SIZE"]
110
110
  overrides.pop("MAX_PLOT_SIZE")
111
111
  if network_id in {"testnet11", "testneta"}:
112
- if "MIN_PLOT_SIZE_V2" not in overrides:
113
- overrides["MIN_PLOT_SIZE_V2"] = 18
112
+ if "PLOT_SIZE_V2" not in overrides:
113
+ overrides["PLOT_SIZE_V2"] = 28
114
+ if network_id == "testneta":
115
+ if "HARD_FORK_HEIGHT" not in overrides:
116
+ overrides["HARD_FORK_HEIGHT"] = 3693395
chia/consensus/deficit.py CHANGED
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional
4
-
5
3
  from chia_rs import BlockRecord, ConsensusConstants
6
4
  from chia_rs.sized_ints import uint8, uint32
7
5
 
@@ -9,7 +7,7 @@ from chia_rs.sized_ints import uint8, uint32
9
7
  def calculate_deficit(
10
8
  constants: ConsensusConstants,
11
9
  height: uint32,
12
- prev_b: Optional[BlockRecord],
10
+ prev_b: BlockRecord | None,
13
11
  overflow: bool,
14
12
  num_finished_sub_slots: int,
15
13
  ) -> uint8:
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional
4
-
5
3
  from chia_rs import BlockRecord, ConsensusConstants
6
4
  from chia_rs.sized_bytes import bytes32
7
5
  from chia_rs.sized_ints import uint8, uint32, uint64, uint128
@@ -137,10 +135,10 @@ def can_finish_sub_and_full_epoch(
137
135
  constants: ConsensusConstants,
138
136
  blocks: BlockRecordsProtocol,
139
137
  height: uint32,
140
- prev_header_hash: Optional[bytes32],
138
+ prev_header_hash: bytes32 | None,
141
139
  deficit: uint8,
142
140
  block_at_height_included_ses: bool,
143
- prev_ses_block: Optional[BlockRecord] = None,
141
+ prev_ses_block: BlockRecord | None = None,
144
142
  ) -> tuple[bool, bool]:
145
143
  """
146
144
  Returns a bool tuple
@@ -355,7 +353,7 @@ def _get_next_difficulty(
355
353
  def get_next_sub_slot_iters_and_difficulty(
356
354
  constants: ConsensusConstants,
357
355
  is_first_in_sub_slot: bool,
358
- prev_b: Optional[BlockRecord],
356
+ prev_b: BlockRecord | None,
359
357
  blocks: BlockRecordsProtocol,
360
358
  ) -> tuple[uint64, uint64]:
361
359
  """
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Union
4
-
5
3
  from chia_rs import BlockRecord, ConsensusConstants, HeaderBlock
6
4
  from chia_rs.sized_bytes import bytes32
7
5
  from chia_rs.sized_ints import uint32
@@ -11,8 +9,8 @@ from chia.consensus.blockchain_interface import BlockRecordsProtocol
11
9
 
12
10
  async def find_fork_point_in_chain(
13
11
  blocks: BlockRecordsProtocol,
14
- block_1: Union[BlockRecord, HeaderBlock],
15
- block_2: Union[BlockRecord, HeaderBlock],
12
+ block_1: BlockRecord | HeaderBlock,
13
+ block_2: BlockRecord | HeaderBlock,
16
14
  ) -> int:
17
15
  """Tries to find height where new chain (block_2) diverged from block_1 (assuming prev blocks
18
16
  are all included in chain)
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional, Union
4
-
5
3
  from chia_rs import BlockRecord, ChallengeBlockInfo, ConsensusConstants, FullBlock, HeaderBlock, SubEpochSummary
6
4
  from chia_rs.sized_bytes import bytes32
7
5
  from chia_rs.sized_ints import uint8, uint32, uint64
@@ -19,9 +17,9 @@ def block_to_block_record(
19
17
  constants: ConsensusConstants,
20
18
  blocks: BlockRecordsProtocol,
21
19
  required_iters: uint64,
22
- block: Union[FullBlock, HeaderBlock],
20
+ block: FullBlock | HeaderBlock,
23
21
  sub_slot_iters: uint64,
24
- prev_ses_block: Optional[BlockRecord] = None,
22
+ prev_ses_block: BlockRecord | None = None,
25
23
  ) -> BlockRecord:
26
24
  prev_b = blocks.try_block_record(block.prev_header_hash)
27
25
  if block.height > 0:
@@ -39,8 +37,8 @@ def block_to_block_record(
39
37
  len(block.finished_sub_slots),
40
38
  )
41
39
 
42
- found_ses_hash: Optional[bytes32] = None
43
- ses: Optional[SubEpochSummary] = None
40
+ found_ses_hash: bytes32 | None = None
41
+ ses: SubEpochSummary | None = None
44
42
  if len(block.finished_sub_slots) > 0:
45
43
  for sub_slot in block.finished_sub_slots:
46
44
  if sub_slot.challenge_chain.subepoch_summary_hash is not None:
@@ -61,7 +59,7 @@ def block_to_block_record(
61
59
  raise ValueError(Err.INVALID_SUB_EPOCH_SUMMARY)
62
60
 
63
61
  prev_transaction_block_height = uint32(0)
64
- curr: Optional[BlockRecord] = blocks.try_block_record(block.prev_header_hash)
62
+ curr: BlockRecord | None = blocks.try_block_record(block.prev_header_hash)
65
63
  while curr is not None and not curr.is_transaction_block:
66
64
  curr = blocks.try_block_record(curr.prev_hash)
67
65
 
@@ -83,12 +81,12 @@ def block_to_block_record(
83
81
  def header_block_to_sub_block_record(
84
82
  constants: ConsensusConstants,
85
83
  required_iters: uint64,
86
- block: Union[FullBlock, HeaderBlock],
84
+ block: FullBlock | HeaderBlock,
87
85
  sub_slot_iters: uint64,
88
86
  overflow: bool,
89
87
  deficit: uint8,
90
88
  prev_transaction_block_height: uint32,
91
- ses: Optional[SubEpochSummary],
89
+ ses: SubEpochSummary | None,
92
90
  ) -> BlockRecord:
93
91
  reward_claims_incorporated = (
94
92
  block.transactions_info.reward_claims_incorporated if block.transactions_info is not None else None
@@ -102,18 +100,18 @@ def header_block_to_sub_block_record(
102
100
  )
103
101
 
104
102
  if block.reward_chain_block.infused_challenge_chain_ip_vdf is not None:
105
- icc_output: Optional[ClassgroupElement] = block.reward_chain_block.infused_challenge_chain_ip_vdf.output
103
+ icc_output: ClassgroupElement | None = block.reward_chain_block.infused_challenge_chain_ip_vdf.output
106
104
  else:
107
105
  icc_output = None
108
106
 
109
107
  if len(block.finished_sub_slots) > 0:
110
- finished_challenge_slot_hashes: Optional[list[bytes32]] = [
108
+ finished_challenge_slot_hashes: list[bytes32] | None = [
111
109
  sub_slot.challenge_chain.get_hash() for sub_slot in block.finished_sub_slots
112
110
  ]
113
- finished_reward_slot_hashes: Optional[list[bytes32]] = [
111
+ finished_reward_slot_hashes: list[bytes32] | None = [
114
112
  sub_slot.reward_chain.get_hash() for sub_slot in block.finished_sub_slots
115
113
  ]
116
- finished_infused_challenge_slot_hashes: Optional[list[bytes32]] = [
114
+ finished_infused_challenge_slot_hashes: list[bytes32] | None = [
117
115
  sub_slot.infused_challenge_chain.get_hash()
118
116
  for sub_slot in block.finished_sub_slots
119
117
  if sub_slot.infused_challenge_chain is not None