chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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 (531) 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_blockchain_transactions.py +5 -2
  6. chia/_tests/blockchain/test_build_chains.py +2 -4
  7. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  8. chia/_tests/clvm/coin_store.py +4 -7
  9. chia/_tests/clvm/test_clvm_step.py +4 -4
  10. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  11. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  12. chia/_tests/clvm/test_singletons.py +2 -4
  13. chia/_tests/clvm/test_spend_sim.py +2 -2
  14. chia/_tests/cmds/cmd_test_utils.py +27 -45
  15. chia/_tests/cmds/test_cmd_framework.py +6 -6
  16. chia/_tests/cmds/test_daemon.py +3 -3
  17. chia/_tests/cmds/test_show.py +4 -4
  18. chia/_tests/cmds/test_tx_config_args.py +1 -2
  19. chia/_tests/cmds/testing_classes.py +4 -5
  20. chia/_tests/cmds/wallet/test_did.py +24 -27
  21. chia/_tests/cmds/wallet/test_nft.py +12 -10
  22. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  23. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  24. chia/_tests/conftest.py +66 -31
  25. chia/_tests/connection_utils.py +2 -2
  26. chia/_tests/core/cmds/test_beta.py +4 -4
  27. chia/_tests/core/cmds/test_keys.py +2 -3
  28. chia/_tests/core/cmds/test_wallet.py +15 -15
  29. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  30. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  31. chia/_tests/core/daemon/test_daemon.py +11 -11
  32. chia/_tests/core/data_layer/conftest.py +2 -2
  33. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  34. chia/_tests/core/data_layer/test_data_store.py +10 -10
  35. chia/_tests/core/data_layer/util.py +11 -11
  36. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  37. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  38. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  39. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  40. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  41. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  42. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  43. chia/_tests/core/full_node/test_conditions.py +21 -23
  44. chia/_tests/core/full_node/test_full_node.py +273 -70
  45. chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
  46. chia/_tests/core/full_node/test_hint_management.py +2 -4
  47. chia/_tests/core/full_node/test_performance.py +0 -1
  48. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  49. chia/_tests/core/full_node/test_transactions.py +1 -2
  50. chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
  51. chia/_tests/core/mempool/test_mempool.py +54 -50
  52. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  53. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  54. chia/_tests/core/mempool/test_mempool_manager.py +988 -854
  55. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  56. chia/_tests/core/server/serve.py +7 -7
  57. chia/_tests/core/server/test_dos.py +1 -2
  58. chia/_tests/core/server/test_event_loop.py +12 -4
  59. chia/_tests/core/server/test_loop.py +7 -8
  60. chia/_tests/core/server/test_rate_limits.py +9 -8
  61. chia/_tests/core/server/test_server.py +61 -1
  62. chia/_tests/core/services/test_services.py +2 -2
  63. chia/_tests/core/ssl/test_ssl.py +2 -2
  64. chia/_tests/core/test_cost_calculation.py +2 -6
  65. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  66. chia/_tests/core/test_filter.py +0 -1
  67. chia/_tests/core/test_full_node_rpc.py +2 -2
  68. chia/_tests/core/test_merkle_set.py +1 -2
  69. chia/_tests/core/test_seeder.py +4 -4
  70. chia/_tests/core/util/test_config.py +4 -4
  71. chia/_tests/core/util/test_jsonify.py +2 -2
  72. chia/_tests/core/util/test_keychain.py +3 -3
  73. chia/_tests/core/util/test_lockfile.py +2 -1
  74. chia/_tests/core/util/test_log_exceptions.py +1 -2
  75. chia/_tests/core/util/test_streamable.py +17 -17
  76. chia/_tests/db/test_db_wrapper.py +3 -2
  77. chia/_tests/environments/wallet.py +14 -14
  78. chia/_tests/ether.py +4 -3
  79. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  80. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  81. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  82. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  83. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  84. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  85. chia/_tests/harvester/test_harvester_api.py +11 -4
  86. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  87. chia/_tests/plot_sync/test_receiver.py +11 -10
  88. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  89. chia/_tests/plot_sync/util.py +1 -2
  90. chia/_tests/plotting/test_plot_manager.py +7 -6
  91. chia/_tests/plotting/test_prover.py +30 -38
  92. chia/_tests/pools/test_pool_cmdline.py +4 -6
  93. chia/_tests/pools/test_pool_rpc.py +203 -61
  94. chia/_tests/pools/test_pool_wallet.py +3 -3
  95. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  96. chia/_tests/process_junit.py +2 -2
  97. chia/_tests/rpc/test_rpc_client.py +4 -4
  98. chia/_tests/rpc/test_rpc_server.py +3 -3
  99. chia/_tests/simulation/test_simulation.py +12 -25
  100. chia/_tests/solver/test_solver_service.py +13 -4
  101. chia/_tests/testconfig.py +2 -2
  102. chia/_tests/timelord/test_new_peak.py +22 -11
  103. chia/_tests/tools/test_run_block.py +0 -2
  104. chia/_tests/tools/test_virtual_project.py +2 -1
  105. chia/_tests/util/benchmarks.py +1 -0
  106. chia/_tests/util/blockchain.py +38 -36
  107. chia/_tests/util/blockchain_mock.py +11 -11
  108. chia/_tests/util/build_network_protocol_files.py +2 -1
  109. chia/_tests/util/coin_store.py +2 -1
  110. chia/_tests/util/config.py +1 -1
  111. chia/_tests/util/db_connection.py +2 -3
  112. chia/_tests/util/full_sync.py +9 -11
  113. chia/_tests/util/gen_ssl_certs.py +4 -5
  114. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  115. chia/_tests/util/misc.py +24 -24
  116. chia/_tests/util/network_protocol_data.py +20 -3
  117. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  118. chia/_tests/util/protocol_messages_json.py +292 -3
  119. chia/_tests/util/setup_nodes.py +62 -47
  120. chia/_tests/util/spend_sim.py +57 -57
  121. chia/_tests/util/test_async_pool.py +2 -3
  122. chia/_tests/util/test_chia_version.py +1 -3
  123. chia/_tests/util/test_config.py +3 -3
  124. chia/_tests/util/test_full_block_utils.py +6 -3
  125. chia/_tests/util/test_limited_semaphore.py +1 -2
  126. chia/_tests/util/test_misc.py +2 -2
  127. chia/_tests/util/test_network.py +1 -2
  128. chia/_tests/util/test_priority_mutex.py +3 -3
  129. chia/_tests/util/test_recursive_replace.py +5 -6
  130. chia/_tests/util/test_replace_str_to_bytes.py +9 -10
  131. chia/_tests/util/test_testnet_overrides.py +3 -3
  132. chia/_tests/util/time_out_assert.py +2 -2
  133. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  134. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  135. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  136. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  137. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  138. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  139. chia/_tests/wallet/conftest.py +6 -6
  140. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  141. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  142. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  145. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  146. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  147. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  148. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  149. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  150. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  151. chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
  152. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  153. chia/_tests/wallet/test_coin_management.py +2 -2
  154. chia/_tests/wallet/test_conditions.py +45 -51
  155. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  156. chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
  157. chia/_tests/wallet/test_notifications.py +14 -14
  158. chia/_tests/wallet/test_signer_protocol.py +5 -5
  159. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  160. chia/_tests/wallet/test_transaction_store.py +20 -20
  161. chia/_tests/wallet/test_util.py +2 -2
  162. chia/_tests/wallet/test_wallet.py +380 -228
  163. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  164. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  165. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  166. chia/_tests/wallet/test_wallet_node.py +16 -15
  167. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  168. chia/_tests/wallet/test_wallet_utils.py +2 -3
  169. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  170. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  171. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  172. chia/_tests/wallet/wallet_block_tools.py +12 -11
  173. chia/_tests/weight_proof/config.py +1 -0
  174. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  175. chia/apis/__init__.py +21 -0
  176. chia/apis/farmer_stub.py +102 -0
  177. chia/apis/full_node_stub.py +374 -0
  178. chia/apis/harvester_stub.py +57 -0
  179. chia/apis/introducer_stub.py +35 -0
  180. chia/apis/solver_stub.py +30 -0
  181. chia/apis/stub_protocol_registry.py +21 -0
  182. chia/apis/timelord_stub.py +39 -0
  183. chia/apis/wallet_stub.py +161 -0
  184. chia/cmds/beta.py +3 -4
  185. chia/cmds/beta_funcs.py +4 -3
  186. chia/cmds/check_wallet_db.py +4 -4
  187. chia/cmds/chia.py +1 -2
  188. chia/cmds/cmd_classes.py +11 -13
  189. chia/cmds/cmd_helpers.py +11 -11
  190. chia/cmds/cmds_util.py +15 -15
  191. chia/cmds/coin_funcs.py +6 -7
  192. chia/cmds/coins.py +2 -3
  193. chia/cmds/configure.py +1 -2
  194. chia/cmds/data.py +42 -42
  195. chia/cmds/data_funcs.py +81 -81
  196. chia/cmds/db.py +4 -5
  197. chia/cmds/db_backup_func.py +2 -2
  198. chia/cmds/db_upgrade_func.py +3 -3
  199. chia/cmds/db_validate_func.py +2 -2
  200. chia/cmds/dev/data.py +4 -4
  201. chia/cmds/dev/gh.py +5 -5
  202. chia/cmds/dev/installers.py +2 -3
  203. chia/cmds/dev/mempool.py +3 -4
  204. chia/cmds/dev/mempool_funcs.py +4 -4
  205. chia/cmds/dev/sim.py +8 -8
  206. chia/cmds/dump_keyring.py +3 -3
  207. chia/cmds/farm.py +6 -8
  208. chia/cmds/farm_funcs.py +25 -24
  209. chia/cmds/init_funcs.py +4 -4
  210. chia/cmds/keys.py +16 -18
  211. chia/cmds/keys_funcs.py +36 -36
  212. chia/cmds/netspace.py +1 -3
  213. chia/cmds/netspace_funcs.py +1 -2
  214. chia/cmds/options.py +3 -2
  215. chia/cmds/param_types.py +17 -16
  216. chia/cmds/passphrase.py +6 -7
  217. chia/cmds/passphrase_funcs.py +11 -13
  218. chia/cmds/peer.py +1 -3
  219. chia/cmds/peer_funcs.py +3 -3
  220. chia/cmds/plotnft.py +6 -7
  221. chia/cmds/plotnft_funcs.py +37 -26
  222. chia/cmds/rpc.py +3 -3
  223. chia/cmds/show.py +3 -5
  224. chia/cmds/show_funcs.py +9 -9
  225. chia/cmds/sim_funcs.py +25 -26
  226. chia/cmds/solver.py +1 -3
  227. chia/cmds/solver_funcs.py +1 -2
  228. chia/cmds/start_funcs.py +2 -2
  229. chia/cmds/wallet.py +76 -81
  230. chia/cmds/wallet_funcs.py +206 -177
  231. chia/consensus/augmented_chain.py +6 -6
  232. chia/consensus/block_body_validation.py +19 -15
  233. chia/consensus/block_creation.py +25 -21
  234. chia/consensus/block_header_validation.py +27 -13
  235. chia/consensus/block_height_map.py +3 -6
  236. chia/consensus/block_height_map_protocol.py +2 -2
  237. chia/consensus/block_record.py +2 -4
  238. chia/consensus/blockchain.py +58 -40
  239. chia/consensus/blockchain_interface.py +7 -7
  240. chia/consensus/coin_store_protocol.py +5 -6
  241. chia/consensus/condition_tools.py +4 -4
  242. chia/consensus/cost_calculator.py +2 -3
  243. chia/consensus/default_constants.py +19 -13
  244. chia/consensus/deficit.py +1 -3
  245. chia/consensus/difficulty_adjustment.py +3 -5
  246. chia/consensus/find_fork_point.py +2 -4
  247. chia/consensus/full_block_to_block_record.py +11 -13
  248. chia/consensus/generator_tools.py +2 -3
  249. chia/consensus/get_block_challenge.py +50 -26
  250. chia/consensus/get_block_generator.py +2 -3
  251. chia/consensus/make_sub_epoch_summary.py +8 -7
  252. chia/consensus/multiprocess_validation.py +31 -20
  253. chia/consensus/pos_quality.py +6 -23
  254. chia/consensus/pot_iterations.py +17 -44
  255. chia/consensus/signage_point.py +4 -5
  256. chia/consensus/vdf_info_computation.py +2 -4
  257. chia/daemon/client.py +8 -8
  258. chia/daemon/keychain_proxy.py +31 -37
  259. chia/daemon/server.py +32 -33
  260. chia/daemon/windows_signal.py +4 -3
  261. chia/data_layer/data_layer.py +86 -77
  262. chia/data_layer/data_layer_rpc_api.py +9 -9
  263. chia/data_layer/data_layer_rpc_client.py +13 -15
  264. chia/data_layer/data_layer_server.py +3 -3
  265. chia/data_layer/data_layer_util.py +14 -14
  266. chia/data_layer/data_layer_wallet.py +94 -101
  267. chia/data_layer/data_store.py +50 -50
  268. chia/data_layer/dl_wallet_store.py +9 -12
  269. chia/data_layer/download_data.py +8 -9
  270. chia/data_layer/s3_plugin_service.py +5 -9
  271. chia/data_layer/start_data_layer.py +5 -5
  272. chia/farmer/farmer.py +31 -31
  273. chia/farmer/farmer_api.py +45 -33
  274. chia/farmer/farmer_rpc_api.py +5 -4
  275. chia/farmer/farmer_rpc_client.py +6 -6
  276. chia/farmer/start_farmer.py +6 -6
  277. chia/full_node/block_store.py +13 -16
  278. chia/full_node/check_fork_next_block.py +1 -2
  279. chia/full_node/coin_store.py +15 -16
  280. chia/full_node/eligible_coin_spends.py +3 -3
  281. chia/full_node/fee_estimate_store.py +2 -3
  282. chia/full_node/fee_tracker.py +1 -2
  283. chia/full_node/full_block_utils.py +4 -4
  284. chia/full_node/full_node.py +239 -223
  285. chia/full_node/full_node_api.py +197 -152
  286. chia/full_node/full_node_rpc_api.py +34 -32
  287. chia/full_node/full_node_rpc_client.py +18 -19
  288. chia/full_node/full_node_store.py +45 -43
  289. chia/full_node/hard_fork_utils.py +44 -0
  290. chia/full_node/hint_management.py +2 -2
  291. chia/full_node/mempool.py +17 -19
  292. chia/full_node/mempool_manager.py +89 -42
  293. chia/full_node/pending_tx_cache.py +2 -3
  294. chia/full_node/start_full_node.py +5 -5
  295. chia/full_node/sync_store.py +3 -4
  296. chia/full_node/tx_processing_queue.py +120 -36
  297. chia/full_node/weight_proof.py +61 -48
  298. chia/harvester/harvester.py +25 -24
  299. chia/harvester/harvester_api.py +61 -38
  300. chia/harvester/harvester_rpc_api.py +10 -10
  301. chia/harvester/start_harvester.py +4 -4
  302. chia/introducer/introducer.py +3 -3
  303. chia/introducer/introducer_api.py +6 -4
  304. chia/introducer/start_introducer.py +4 -4
  305. chia/legacy/keyring.py +3 -3
  306. chia/plot_sync/delta.py +1 -2
  307. chia/plot_sync/receiver.py +20 -17
  308. chia/plot_sync/sender.py +15 -10
  309. chia/plotters/bladebit.py +7 -7
  310. chia/plotters/chiapos.py +2 -2
  311. chia/plotters/madmax.py +4 -4
  312. chia/plotters/plotters.py +4 -4
  313. chia/plotters/plotters_util.py +3 -3
  314. chia/plotting/cache.py +20 -14
  315. chia/plotting/check_plots.py +26 -35
  316. chia/plotting/create_plots.py +22 -23
  317. chia/plotting/manager.py +21 -14
  318. chia/plotting/prover.py +59 -42
  319. chia/plotting/util.py +16 -16
  320. chia/pools/pool_config.py +2 -1
  321. chia/pools/pool_puzzles.py +11 -12
  322. chia/pools/pool_wallet.py +34 -57
  323. chia/pools/pool_wallet_info.py +39 -10
  324. chia/protocols/farmer_protocol.py +8 -9
  325. chia/protocols/fee_estimate.py +3 -4
  326. chia/protocols/full_node_protocol.py +3 -4
  327. chia/protocols/harvester_protocol.py +27 -15
  328. chia/protocols/outbound_message.py +3 -3
  329. chia/protocols/pool_protocol.py +8 -9
  330. chia/protocols/shared_protocol.py +1 -2
  331. chia/protocols/solver_protocol.py +9 -2
  332. chia/protocols/timelord_protocol.py +4 -7
  333. chia/protocols/wallet_protocol.py +11 -12
  334. chia/rpc/rpc_client.py +9 -9
  335. chia/rpc/rpc_server.py +17 -17
  336. chia/rpc/util.py +2 -2
  337. chia/seeder/crawler.py +8 -8
  338. chia/seeder/crawler_api.py +21 -27
  339. chia/seeder/crawler_rpc_api.py +2 -2
  340. chia/seeder/dns_server.py +21 -21
  341. chia/seeder/start_crawler.py +4 -4
  342. chia/server/address_manager.py +15 -16
  343. chia/server/api_protocol.py +11 -11
  344. chia/server/chia_policy.py +46 -26
  345. chia/server/introducer_peers.py +2 -3
  346. chia/server/node_discovery.py +19 -19
  347. chia/server/rate_limit_numbers.py +4 -5
  348. chia/server/rate_limits.py +4 -4
  349. chia/server/resolve_peer_info.py +4 -4
  350. chia/server/server.py +49 -52
  351. chia/server/signal_handlers.py +6 -6
  352. chia/server/start_service.py +17 -17
  353. chia/server/upnp.py +4 -6
  354. chia/server/ws_connection.py +52 -37
  355. chia/simulator/add_blocks_in_batches.py +1 -3
  356. chia/simulator/block_tools.py +312 -200
  357. chia/simulator/full_node_simulator.py +56 -35
  358. chia/simulator/keyring.py +2 -3
  359. chia/simulator/setup_services.py +15 -15
  360. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  361. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  362. chia/simulator/simulator_protocol.py +1 -2
  363. chia/simulator/simulator_test_tools.py +3 -3
  364. chia/simulator/start_simulator.py +7 -7
  365. chia/simulator/wallet_tools.py +10 -10
  366. chia/solver/solver.py +10 -10
  367. chia/solver/solver_api.py +10 -8
  368. chia/solver/solver_rpc_api.py +2 -2
  369. chia/solver/start_solver.py +4 -4
  370. chia/ssl/cacert.pem +148 -90
  371. chia/ssl/chia_ca.crt +14 -10
  372. chia/ssl/chia_ca_old.crt +19 -0
  373. chia/ssl/create_ssl.py +4 -4
  374. chia/ssl/renewedselfsignedca.conf +4 -0
  375. chia/ssl/ssl_check.py +1 -2
  376. chia/timelord/iters_from_block.py +1 -4
  377. chia/timelord/start_timelord.py +4 -4
  378. chia/timelord/timelord.py +44 -40
  379. chia/timelord/timelord_api.py +6 -4
  380. chia/timelord/timelord_launcher.py +2 -2
  381. chia/timelord/timelord_rpc_api.py +2 -2
  382. chia/timelord/timelord_state.py +11 -12
  383. chia/types/block_protocol.py +1 -3
  384. chia/types/blockchain_format/coin.py +1 -3
  385. chia/types/blockchain_format/program.py +11 -8
  386. chia/types/blockchain_format/proof_of_space.py +123 -76
  387. chia/types/blockchain_format/tree_hash.py +3 -3
  388. chia/types/blockchain_format/vdf.py +1 -2
  389. chia/types/coin_spend.py +3 -3
  390. chia/types/mempool_item.py +5 -5
  391. chia/types/mempool_submission_status.py +2 -3
  392. chia/types/peer_info.py +1 -2
  393. chia/types/unfinished_header_block.py +3 -4
  394. chia/types/validation_state.py +1 -2
  395. chia/util/action_scope.py +8 -8
  396. chia/util/async_pool.py +5 -5
  397. chia/util/bech32m.py +1 -2
  398. chia/util/beta_metrics.py +2 -2
  399. chia/util/block_cache.py +4 -4
  400. chia/util/chia_logging.py +2 -2
  401. chia/util/chia_version.py +1 -2
  402. chia/util/config.py +15 -16
  403. chia/util/db_wrapper.py +26 -27
  404. chia/util/default_root.py +1 -2
  405. chia/util/errors.py +3 -3
  406. chia/util/file_keyring.py +14 -14
  407. chia/util/files.py +2 -3
  408. chia/util/hash.py +4 -4
  409. chia/util/initial-config.yaml +4 -5
  410. chia/util/inline_executor.py +2 -1
  411. chia/util/ip_address.py +1 -2
  412. chia/util/keychain.py +25 -27
  413. chia/util/keyring_wrapper.py +18 -19
  414. chia/util/lock.py +3 -4
  415. chia/util/log_exceptions.py +1 -2
  416. chia/util/lru_cache.py +2 -2
  417. chia/util/network.py +6 -6
  418. chia/util/path.py +2 -3
  419. chia/util/priority_mutex.py +2 -2
  420. chia/util/profiler.py +1 -2
  421. chia/util/safe_cancel_task.py +1 -2
  422. chia/util/streamable.py +24 -10
  423. chia/util/task_referencer.py +1 -1
  424. chia/util/timing.py +3 -3
  425. chia/util/virtual_project_analysis.py +6 -5
  426. chia/util/ws_message.py +2 -2
  427. chia/wallet/cat_wallet/cat_info.py +3 -4
  428. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  429. chia/wallet/cat_wallet/cat_utils.py +3 -4
  430. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  431. chia/wallet/cat_wallet/lineage_store.py +3 -4
  432. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  433. chia/wallet/coin_selection.py +9 -10
  434. chia/wallet/conditions.py +142 -106
  435. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  436. chia/wallet/derivation_record.py +1 -2
  437. chia/wallet/derive_keys.py +2 -4
  438. chia/wallet/did_wallet/did_info.py +10 -11
  439. chia/wallet/did_wallet/did_wallet.py +36 -82
  440. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  441. chia/wallet/driver_protocol.py +5 -7
  442. chia/wallet/lineage_proof.py +4 -4
  443. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  444. chia/wallet/nft_wallet/nft_info.py +8 -9
  445. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  446. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  447. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  448. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  449. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  450. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  451. chia/wallet/notification_manager.py +3 -3
  452. chia/wallet/notification_store.py +44 -61
  453. chia/wallet/outer_puzzles.py +6 -7
  454. chia/wallet/puzzle_drivers.py +34 -6
  455. chia/wallet/puzzles/clawback/drivers.py +6 -6
  456. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  457. chia/wallet/puzzles/load_clvm.py +1 -1
  458. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  459. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  460. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  461. chia/wallet/puzzles/tails.py +3 -3
  462. chia/wallet/singleton.py +5 -7
  463. chia/wallet/singleton_record.py +3 -3
  464. chia/wallet/start_wallet.py +5 -5
  465. chia/wallet/trade_manager.py +37 -58
  466. chia/wallet/trade_record.py +4 -4
  467. chia/wallet/trading/offer.py +59 -46
  468. chia/wallet/trading/trade_store.py +8 -9
  469. chia/wallet/transaction_record.py +8 -8
  470. chia/wallet/uncurried_puzzle.py +1 -2
  471. chia/wallet/util/clvm_streamable.py +12 -12
  472. chia/wallet/util/compute_hints.py +4 -5
  473. chia/wallet/util/curry_and_treehash.py +1 -2
  474. chia/wallet/util/merkle_tree.py +2 -3
  475. chia/wallet/util/peer_request_cache.py +8 -8
  476. chia/wallet/util/signing.py +85 -0
  477. chia/wallet/util/tx_config.py +15 -6
  478. chia/wallet/util/wallet_sync_utils.py +14 -16
  479. chia/wallet/util/wallet_types.py +2 -2
  480. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  481. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  482. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  483. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  484. chia/wallet/vc_wallet/vc_store.py +5 -6
  485. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  486. chia/wallet/wallet.py +50 -78
  487. chia/wallet/wallet_action_scope.py +11 -11
  488. chia/wallet/wallet_blockchain.py +12 -12
  489. chia/wallet/wallet_coin_record.py +12 -6
  490. chia/wallet/wallet_coin_store.py +24 -25
  491. chia/wallet/wallet_interested_store.py +3 -5
  492. chia/wallet/wallet_nft_store.py +10 -11
  493. chia/wallet/wallet_node.py +53 -61
  494. chia/wallet/wallet_node_api.py +5 -3
  495. chia/wallet/wallet_protocol.py +23 -23
  496. chia/wallet/wallet_puzzle_store.py +15 -18
  497. chia/wallet/wallet_request_types.py +778 -114
  498. chia/wallet/wallet_retry_store.py +1 -3
  499. chia/wallet/wallet_rpc_api.py +572 -909
  500. chia/wallet/wallet_rpc_client.py +87 -279
  501. chia/wallet/wallet_singleton_store.py +3 -4
  502. chia/wallet/wallet_state_manager.py +332 -106
  503. chia/wallet/wallet_transaction_store.py +11 -14
  504. chia/wallet/wallet_user_store.py +4 -6
  505. chia/wallet/wallet_weight_proof_handler.py +4 -4
  506. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
  507. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
  508. chia/apis.py +0 -21
  509. chia/consensus/check_time_locks.py +0 -57
  510. chia/data_layer/puzzles/__init__.py +0 -0
  511. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  512. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  513. chia/types/coin_record.py +0 -44
  514. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  515. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  516. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  517. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  518. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  520. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  521. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  522. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  524. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  525. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  526. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  527. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  528. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  529. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
  530. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
  531. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import zipfile
4
+ from collections.abc import Callable
4
5
  from pathlib import Path
5
- from typing import Callable, Optional
6
6
 
7
7
  import pytest
8
8
  from click.testing import CliRunner, Result
@@ -26,7 +26,7 @@ def configure(root_path: Path, *args: str) -> Result:
26
26
  )
27
27
 
28
28
 
29
- def configure_interactive(root_path: Path, user_input: Optional[str] = None) -> Result:
29
+ def configure_interactive(root_path: Path, user_input: str | None = None) -> Result:
30
30
  return CliRunner().invoke(
31
31
  cli,
32
32
  [
@@ -53,7 +53,7 @@ def enable(root_path: Path, *args: str) -> Result:
53
53
  )
54
54
 
55
55
 
56
- def enable_interactive(root_path: Path, user_input: Optional[str] = None) -> Result:
56
+ def enable_interactive(root_path: Path, user_input: str | None = None) -> Result:
57
57
  return CliRunner().invoke(
58
58
  cli,
59
59
  [
@@ -66,7 +66,7 @@ def enable_interactive(root_path: Path, user_input: Optional[str] = None) -> Res
66
66
  )
67
67
 
68
68
 
69
- def prepare_submission(root_path: Path, user_input: Optional[str] = None) -> Result:
69
+ def prepare_submission(root_path: Path, user_input: str | None = None) -> Result:
70
70
  return CliRunner().invoke(
71
71
  cli,
72
72
  [
@@ -4,7 +4,6 @@ import json
4
4
  import os
5
5
  import re
6
6
  from pathlib import Path
7
- from typing import Optional
8
7
 
9
8
  import pytest
10
9
  from click.testing import CliRunner, Result
@@ -54,7 +53,7 @@ def setup_keyringwrapper(tmp_path):
54
53
  KeyringWrapper.set_keys_root_path(DEFAULT_KEYS_ROOT_PATH)
55
54
 
56
55
 
57
- def assert_label(keychain: Keychain, label: Optional[str], index: int) -> None:
56
+ def assert_label(keychain: Keychain, label: str | None, index: int) -> None:
58
57
  all_keys = keychain.get_keys()
59
58
  assert len(all_keys) > index
60
59
  assert all_keys[index].label == label
@@ -200,7 +199,7 @@ class TestKeysCommands:
200
199
  ],
201
200
  )
202
201
  def test_generate_and_add_label_parameter(
203
- self, cmd_params: list[str], label: Optional[str], input_str: Optional[str], tmp_path, empty_keyring
202
+ self, cmd_params: list[str], label: str | None, input_str: str | None, tmp_path, empty_keyring
204
203
  ):
205
204
  keychain = empty_keyring
206
205
  keys_root_path = keychain.keyring_wrapper.keys_root_path
@@ -26,7 +26,7 @@ async def cat_name_resolver(request: CATAssetIDToName) -> CATAssetIDToNameRespon
26
26
 
27
27
  @pytest.mark.anyio
28
28
  async def test_print_offer_summary_xch(capsys: Any) -> None:
29
- summary_dict = {"xch": 1_000_000_000_000}
29
+ summary_dict = {"xch": str(1_000_000_000_000)}
30
30
 
31
31
  await print_offer_summary(cat_name_resolver, summary_dict)
32
32
 
@@ -38,7 +38,7 @@ async def test_print_offer_summary_xch(capsys: Any) -> None:
38
38
  @pytest.mark.anyio
39
39
  async def test_print_offer_summary_cat(capsys: Any) -> None:
40
40
  summary_dict = {
41
- TEST_DUCKSAUCE_ASSET_ID: 1_000,
41
+ TEST_DUCKSAUCE_ASSET_ID: str(1_000),
42
42
  }
43
43
 
44
44
  await print_offer_summary(cat_name_resolver, summary_dict)
@@ -51,8 +51,8 @@ async def test_print_offer_summary_cat(capsys: Any) -> None:
51
51
  @pytest.mark.anyio
52
52
  async def test_print_offer_summary_multiple_cats(capsys: Any) -> None:
53
53
  summary_dict = {
54
- TEST_DUCKSAUCE_ASSET_ID: 1_000,
55
- TEST_CRUNCHBERRIES_ASSET_ID: 2_000,
54
+ TEST_DUCKSAUCE_ASSET_ID: str(1_000),
55
+ TEST_CRUNCHBERRIES_ASSET_ID: str(2_000),
56
56
  }
57
57
 
58
58
  await print_offer_summary(cat_name_resolver, summary_dict)
@@ -66,10 +66,10 @@ async def test_print_offer_summary_multiple_cats(capsys: Any) -> None:
66
66
  @pytest.mark.anyio
67
67
  async def test_print_offer_summary_xch_and_cats(capsys: Any) -> None:
68
68
  summary_dict = {
69
- "xch": 2_500_000_000_000,
70
- TEST_DUCKSAUCE_ASSET_ID: 1_111,
71
- TEST_CRUNCHBERRIES_ASSET_ID: 2_222,
72
- TEST_UNICORNTEARS_ASSET_ID: 3_333,
69
+ "xch": str(2_500_000_000_000),
70
+ TEST_DUCKSAUCE_ASSET_ID: str(1_111),
71
+ TEST_CRUNCHBERRIES_ASSET_ID: str(2_222),
72
+ TEST_UNICORNTEARS_ASSET_ID: str(3_333),
73
73
  }
74
74
 
75
75
  await print_offer_summary(cat_name_resolver, summary_dict)
@@ -85,10 +85,10 @@ async def test_print_offer_summary_xch_and_cats(capsys: Any) -> None:
85
85
  @pytest.mark.anyio
86
86
  async def test_print_offer_summary_xch_and_cats_with_zero_values(capsys: Any) -> None:
87
87
  summary_dict = {
88
- "xch": 0,
89
- TEST_DUCKSAUCE_ASSET_ID: 0,
90
- TEST_CRUNCHBERRIES_ASSET_ID: 0,
91
- TEST_UNICORNTEARS_ASSET_ID: 0,
88
+ "xch": str(0),
89
+ TEST_DUCKSAUCE_ASSET_ID: str(0),
90
+ TEST_CRUNCHBERRIES_ASSET_ID: str(0),
91
+ TEST_UNICORNTEARS_ASSET_ID: str(0),
92
92
  }
93
93
 
94
94
  await print_offer_summary(cat_name_resolver, summary_dict)
@@ -104,8 +104,8 @@ async def test_print_offer_summary_xch_and_cats_with_zero_values(capsys: Any) ->
104
104
  @pytest.mark.anyio
105
105
  async def test_print_offer_summary_cat_with_fee_and_change(capsys: Any) -> None:
106
106
  summary_dict = {
107
- TEST_DUCKSAUCE_ASSET_ID: 1_000,
108
- "unknown": 3_456,
107
+ TEST_DUCKSAUCE_ASSET_ID: str(1_000),
108
+ "unknown": str(3_456),
109
109
  }
110
110
 
111
111
  await print_offer_summary(cat_name_resolver, summary_dict, has_fee=True)
@@ -118,7 +118,7 @@ async def test_print_offer_summary_cat_with_fee_and_change(capsys: Any) -> None:
118
118
 
119
119
  @pytest.mark.anyio
120
120
  async def test_print_offer_summary_xch_with_one_mojo(capsys: Any) -> None:
121
- summary_dict = {"xch": 1}
121
+ summary_dict = {"xch": str(1)}
122
122
 
123
123
  await print_offer_summary(cat_name_resolver, summary_dict)
124
124
 
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- import pytest
4
- from chia_rs import PlotSize
3
+ from chia_rs import PlotParam
5
4
  from chia_rs.sized_ints import uint8, uint16, uint32, uint64, uint128
6
5
  from pytest import raises
7
6
 
@@ -10,7 +9,6 @@ from chia.consensus.pos_quality import _expected_plot_size
10
9
  from chia.consensus.pot_iterations import (
11
10
  calculate_ip_iters,
12
11
  calculate_iterations_quality,
13
- calculate_phase_out,
14
12
  calculate_sp_interval_iters,
15
13
  calculate_sp_iters,
16
14
  is_overflow_block,
@@ -84,32 +82,22 @@ class TestPotIterations:
84
82
  assert ip_iters == (sp_iters + test_constants.NUM_SP_INTERVALS_EXTRA * sp_interval_iters + required_iters) % ssi
85
83
  assert sp_iters > ip_iters
86
84
 
87
- @pytest.mark.parametrize(
88
- "height",
89
- [
90
- uint32(0),
91
- test_constants.HARD_FORK2_HEIGHT - 1,
92
- test_constants.HARD_FORK2_HEIGHT,
93
- test_constants.HARD_FORK2_HEIGHT + test_constants.PLOT_V1_PHASE_OUT,
94
- test_constants.HARD_FORK2_HEIGHT + test_constants.PLOT_V1_PHASE_OUT + 1,
95
- ],
96
- )
97
- def test_win_percentage(self, height: uint32):
85
+ def test_win_percentage(self):
98
86
  """
99
87
  Tests that the percentage of blocks won is proportional to the space of each farmer,
100
88
  with the assumption that all farmers have access to the same VDF speed.
101
89
  """
102
90
  farmer_ks = {
103
- PlotSize.make_v1(32): 100,
104
- PlotSize.make_v1(33): 100,
105
- PlotSize.make_v1(34): 100,
106
- PlotSize.make_v1(35): 100,
107
- PlotSize.make_v1(36): 100,
108
- PlotSize.make_v2(28): 200,
109
- PlotSize.make_v2(30): 200,
110
- PlotSize.make_v2(32): 200,
91
+ PlotParam.make_v1(32): 100,
92
+ PlotParam.make_v1(33): 100,
93
+ PlotParam.make_v1(34): 100,
94
+ PlotParam.make_v1(35): 100,
95
+ PlotParam.make_v1(36): 100,
96
+ PlotParam.make_v2(2): 200,
97
+ PlotParam.make_v2(3): 200,
98
+ PlotParam.make_v2(4): 200,
111
99
  }
112
- farmer_space = {k: _expected_plot_size(k) * count for k, count in farmer_ks.items()}
100
+ farmer_space = {k: _expected_plot_size(k, test_constants) * count for k, count in farmer_ks.items()}
113
101
  wins = {k: 0 for k in farmer_ks.keys()}
114
102
 
115
103
  constants = test_constants.replace(DIFFICULTY_CONSTANT_FACTOR=uint128(2**25))
@@ -124,76 +112,34 @@ class TestPotIterations:
124
112
  sp_hash = std_hash(slot_index.to_bytes(4, "big") + sp_index.to_bytes(4, "big"))
125
113
  for k, count in farmer_ks.items():
126
114
  for farmer_index in range(count):
127
- plot_k_val = k.size_v1 if k.size_v2 is None else k.size_v2
115
+ plot_k_val = k.size_v1 if k.size_v1 is not None else constants.PLOT_SIZE_V2
128
116
  assert plot_k_val is not None
129
117
  quality = std_hash(
130
118
  slot_index.to_bytes(4, "big") + plot_k_val.to_bytes(1, "big") + bytes(farmer_index)
131
119
  )
132
- required_iters = calculate_iterations_quality(
133
- constants, quality, k, difficulty, sp_hash, sub_slot_iters, height
134
- )
120
+ required_iters = calculate_iterations_quality(constants, quality, k, difficulty, sp_hash)
135
121
  if required_iters < sp_interval_iters:
136
122
  wins[k] += 1
137
123
  total_wins_in_slot += 1
138
124
 
139
- if height < test_constants.HARD_FORK2_HEIGHT + test_constants.PLOT_V1_PHASE_OUT:
140
- total_space = sum(farmer_space.values())
141
- percentage_space = {k: float(sp / total_space) for k, sp in farmer_space.items()}
142
- else:
143
- # after the phase-out, v1 plots don't count
144
- # all wins are by v2 plots
145
- total_space = sum(0 if k.size_v2 is None else sp for k, sp in farmer_space.items())
146
- percentage_space = {
147
- k: 0.0 if k.size_v2 is None else float(sp / total_space) for k, sp in farmer_space.items()
148
- }
125
+ total_space = sum(farmer_space.values())
126
+ percentage_space = {k: float(sp / total_space) for k, sp in farmer_space.items()}
149
127
 
150
128
  win_percentage = {k: wins[k] / sum(wins.values()) for k in farmer_ks.keys()}
151
129
  for k in farmer_ks.keys():
152
130
  # Win rate is proportional to percentage of space
153
131
  assert abs(win_percentage[k] - percentage_space[k]) < 0.01
154
132
 
155
- @pytest.mark.parametrize("sp_interval", [uint64(6250000000), uint64(1), uint64(2), uint64(10), uint64(10000000000)])
156
- def test_calculate_phase_out(self, sp_interval: uint64):
157
- constants = test_constants
158
- sub_slot_iters = uint64(sp_interval * constants.NUM_SPS_SUB_SLOT)
159
- # Before or at HARD_FORK2_HEIGHT, should return 0
160
- assert calculate_phase_out(constants, sub_slot_iters, uint32(constants.HARD_FORK2_HEIGHT - 1)) == 0
161
- assert calculate_phase_out(constants, sub_slot_iters, constants.HARD_FORK2_HEIGHT) == 0
162
- # after HARD_FORK2_HEIGHT, should return value = delta/phase_out_period * sp_interval
163
- assert (
164
- calculate_phase_out(constants, sub_slot_iters, uint32(constants.HARD_FORK2_HEIGHT + 1))
165
- == sp_interval // constants.PLOT_V1_PHASE_OUT
166
- )
167
- assert (
168
- calculate_phase_out(
169
- constants, sub_slot_iters, uint32(constants.HARD_FORK2_HEIGHT + constants.PLOT_V1_PHASE_OUT // 2)
170
- )
171
- == sp_interval // 2
172
- )
173
- assert (
174
- calculate_phase_out(
175
- constants, sub_slot_iters, uint32(constants.HARD_FORK2_HEIGHT + constants.PLOT_V1_PHASE_OUT)
176
- )
177
- == sp_interval
178
- )
179
-
180
- # Test with maximum uint32 height to ensure no overflow
181
- max_uint32_height = uint32(0xFFFFFFFF)
182
- result_max_height = calculate_phase_out(constants, sub_slot_iters, max_uint32_height)
183
- assert result_max_height == sp_interval # Should cap at sp_interval
184
-
185
133
 
186
134
  def test_expected_plot_size_v1() -> None:
187
135
  last_size = 2_400_000
188
136
  for k in range(18, 50):
189
- plot_size = _expected_plot_size(PlotSize.make_v1(k))
137
+ plot_size = _expected_plot_size(PlotParam.make_v1(k), test_constants)
190
138
  assert plot_size > last_size * 2
191
139
  last_size = plot_size
192
140
 
193
141
 
194
142
  def test_expected_plot_size_v2() -> None:
195
- last_size = 100_000
196
- for k in range(16, 32, 2):
197
- plot_size = _expected_plot_size(PlotSize.make_v2(k))
198
- assert plot_size > last_size * 2
199
- last_size = plot_size
143
+ for strength in [2, 3, 4, 5, 6, 7]:
144
+ plot_size = _expected_plot_size(PlotParam.make_v2(strength), test_constants)
145
+ assert plot_size == 988_513_566
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import logging
3
4
  import random
4
5
  from dataclasses import dataclass
5
- from typing import Optional
6
6
 
7
7
  import pytest
8
- from chia_rs import G1Element, PlotSize
8
+ from chia_rs import G1Element, PlotParam
9
9
  from chia_rs.sized_bytes import bytes32, bytes48
10
10
  from chia_rs.sized_ints import uint8, uint32
11
11
 
@@ -13,9 +13,10 @@ from chia._tests.util.misc import Marks, datacases
13
13
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
14
14
  from chia.types.blockchain_format.proof_of_space import (
15
15
  calculate_prefix_bits,
16
- calculate_required_plot_strength,
17
- check_plot_size,
16
+ check_plot_param,
17
+ is_v1_phased_out,
18
18
  make_pos,
19
+ num_phase_out_epochs,
19
20
  passes_plot_filter,
20
21
  verify_and_get_quality_string,
21
22
  )
@@ -25,12 +26,12 @@ from chia.types.blockchain_format.proof_of_space import (
25
26
  class ProofOfSpaceCase:
26
27
  id: str
27
28
  pos_challenge: bytes32
28
- plot_size: PlotSize
29
+ plot_size: PlotParam
29
30
  plot_public_key: G1Element
30
- pool_public_key: Optional[G1Element] = None
31
- pool_contract_puzzle_hash: Optional[bytes32] = None
32
- height: uint32 = uint32(0)
33
- expected_error: Optional[str] = None
31
+ pool_public_key: G1Element | None = None
32
+ pool_contract_puzzle_hash: bytes32 | None = None
33
+ height: uint32 = DEFAULT_CONSTANTS.HARD_FORK2_HEIGHT
34
+ expected_error: str | None = None
34
35
  marks: Marks = ()
35
36
 
36
37
 
@@ -47,14 +48,14 @@ def b32(key: str) -> bytes32:
47
48
  ProofOfSpaceCase(
48
49
  id="Neither pool public key nor pool contract puzzle hash",
49
50
  pos_challenge=bytes32(b"1" * 32),
50
- plot_size=PlotSize.make_v1(0),
51
+ plot_size=PlotParam.make_v1(0),
51
52
  plot_public_key=G1Element(),
52
53
  expected_error="Expected pool public key or pool contract puzzle hash but got neither",
53
54
  ),
54
55
  ProofOfSpaceCase(
55
56
  id="Both pool public key and pool contract puzzle hash",
56
57
  pos_challenge=bytes32(b"1" * 32),
57
- plot_size=PlotSize.make_v1(0),
58
+ plot_size=PlotParam.make_v1(0),
58
59
  plot_public_key=G1Element(),
59
60
  pool_public_key=G1Element(),
60
61
  pool_contract_puzzle_hash=bytes32(b"1" * 32),
@@ -63,23 +64,23 @@ def b32(key: str) -> bytes32:
63
64
  ProofOfSpaceCase(
64
65
  id="Lower than minimum plot size",
65
66
  pos_challenge=bytes32(b"1" * 32),
66
- plot_size=PlotSize.make_v1(31),
67
+ plot_size=PlotParam.make_v1(31),
67
68
  plot_public_key=G1Element(),
68
69
  pool_public_key=G1Element(),
69
- expected_error="Plot size is lower than the minimum",
70
+ expected_error="Plot size (31) is lower than the minimum (32)",
70
71
  ),
71
72
  ProofOfSpaceCase(
72
73
  id="Higher than maximum plot size",
73
74
  pos_challenge=bytes32(b"1" * 32),
74
- plot_size=PlotSize.make_v1(51),
75
+ plot_size=PlotParam.make_v1(51),
75
76
  plot_public_key=G1Element(),
76
77
  pool_public_key=G1Element(),
77
- expected_error="Plot size is higher than the maximum",
78
+ expected_error="Plot size (51) is higher than the maximum (50)",
78
79
  ),
79
80
  ProofOfSpaceCase(
80
81
  id="Different challenge",
81
82
  pos_challenge=bytes32(b"1" * 32),
82
- plot_size=PlotSize.make_v1(42),
83
+ plot_size=PlotParam.make_v1(42),
83
84
  pool_public_key=G1Element(),
84
85
  plot_public_key=G1Element(),
85
86
  expected_error="Calculated pos challenge doesn't match the provided one",
@@ -87,7 +88,7 @@ def b32(key: str) -> bytes32:
87
88
  ProofOfSpaceCase(
88
89
  id="Not passing the plot filter with size 9",
89
90
  pos_challenge=b32("08b23cc2844dfb92d2eedaa705a1ce665d571ee753bd81cbb67b92caa6d34722"),
90
- plot_size=PlotSize.make_v1(42),
91
+ plot_size=PlotParam.make_v1(42),
91
92
  pool_public_key=g1(
92
93
  "b6449c2c68df97c19e884427e42ee7350982d4020571ead08732615ff39bd216bfd630b6460784982bec98b49fea79d0"
93
94
  ),
@@ -100,7 +101,7 @@ def b32(key: str) -> bytes32:
100
101
  ProofOfSpaceCase(
101
102
  id="Passing the plot filter with size 8",
102
103
  pos_challenge=b32("08b23cc2844dfb92d2eedaa705a1ce665d571ee753bd81cbb67b92caa6d34722"),
103
- plot_size=PlotSize.make_v1(42),
104
+ plot_size=PlotParam.make_v1(42),
104
105
  pool_public_key=g1(
105
106
  "b6449c2c68df97c19e884427e42ee7350982d4020571ead08732615ff39bd216bfd630b6460784982bec98b49fea79d0"
106
107
  ),
@@ -110,35 +111,51 @@ def b32(key: str) -> bytes32:
110
111
  height=uint32(5496000),
111
112
  ),
112
113
  ProofOfSpaceCase(
113
- id="v2 plot size 0",
114
+ id="v2 plot strength 0",
114
115
  pos_challenge=bytes32(b"1" * 32),
115
- plot_size=PlotSize.make_v2(0),
116
+ plot_size=PlotParam.make_v2(0),
117
+ pool_contract_puzzle_hash=bytes32(b"1" * 32),
116
118
  plot_public_key=G1Element(),
117
- pool_public_key=G1Element(),
118
- expected_error="Plot size is lower than the minimum",
119
+ expected_error="Plot strength (0) is lower than the minimum (2)",
119
120
  ),
120
121
  ProofOfSpaceCase(
121
- id="v2 plot size 34",
122
+ id="v2 plot strength 33",
122
123
  pos_challenge=bytes32(b"1" * 32),
123
- plot_size=PlotSize.make_v2(34),
124
+ plot_size=PlotParam.make_v2(33),
125
+ pool_contract_puzzle_hash=bytes32(b"1" * 32),
124
126
  plot_public_key=G1Element(),
125
- pool_public_key=G1Element(),
126
- expected_error="Plot size is higher than the maximum",
127
+ expected_error="Plot strength (33) is too high (max is 32)",
127
128
  ),
128
129
  ProofOfSpaceCase(
129
130
  id="Not passing the plot filter v2",
130
- pos_challenge=b32("3d29ea79d19b3f7e99ebf764ae53697cbe143603909873946af6ab1ece606861"),
131
- plot_size=PlotSize.make_v2(32),
132
- pool_public_key=g1(
133
- "b6449c2c68df97c19e884427e42ee7350982d4020571ead08732615ff39bd216bfd630b6460784982bec98b49fea79d0"
134
- ),
131
+ pos_challenge=b32("4cfaacbd2782db64d07cf490ca938534adb07dfbd2f92b0e479e2e5b196178db"),
132
+ plot_size=PlotParam.make_v2(32),
133
+ pool_contract_puzzle_hash=bytes32(b"1" * 32),
135
134
  plot_public_key=g1(
136
135
  "879526b4e7b616cfd64984d8ad140d0798b048392a6f11e2faf09054ef467ea44dc0dab5e5edb2afdfa850c5c8b629cc"
137
136
  ),
138
137
  expected_error="Did not pass the plot filter",
139
138
  ),
139
+ ProofOfSpaceCase(
140
+ id="v2 not activated",
141
+ pos_challenge=bytes32(b"1" * 32),
142
+ plot_size=PlotParam.make_v2(2),
143
+ pool_contract_puzzle_hash=bytes32(b"1" * 32),
144
+ plot_public_key=G1Element(),
145
+ height=uint32(DEFAULT_CONSTANTS.HARD_FORK2_HEIGHT - 1),
146
+ expected_error="v2 proof support has not yet activated",
147
+ ),
148
+ ProofOfSpaceCase(
149
+ id="v2 plot with pool pk",
150
+ pos_challenge=bytes32(b"1" * 32),
151
+ plot_size=PlotParam.make_v2(2),
152
+ plot_public_key=G1Element(),
153
+ pool_public_key=G1Element(),
154
+ expected_error="v2 plots require pool_contract_puzzle_hash, pool public key is not supported",
155
+ ),
140
156
  )
141
157
  def test_verify_and_get_quality_string(caplog: pytest.LogCaptureFixture, case: ProofOfSpaceCase) -> None:
158
+ caplog.set_level(logging.INFO)
142
159
  pos = make_pos(
143
160
  challenge=case.pos_challenge,
144
161
  pool_public_key=case.pool_public_key,
@@ -153,6 +170,7 @@ def test_verify_and_get_quality_string(caplog: pytest.LogCaptureFixture, case: P
153
170
  original_challenge_hash=b32("0x73490e166d0b88347c37d921660b216c27316aae9a3450933d3ff3b854e5831a"),
154
171
  signage_point=b32("0x7b3e23dbd438f9aceefa9827e2c5538898189987f49b06eceb7a43067e77b531"),
155
172
  height=case.height,
173
+ prev_transaction_block_height=case.height,
156
174
  )
157
175
  assert quality_string is None
158
176
  assert len(caplog.text) == 0 if case.expected_error is None else case.expected_error in caplog.text
@@ -160,17 +178,16 @@ def test_verify_and_get_quality_string(caplog: pytest.LogCaptureFixture, case: P
160
178
 
161
179
  @datacases(
162
180
  ProofOfSpaceCase(
163
- id="v2 plot are not implemented",
164
- plot_size=PlotSize.make_v2(30),
165
- pos_challenge=b32("47deb938e145d25d7b3b3c85ca9e3972b76c01aeeb78a02fe5d3b040d282317e"),
181
+ id="not passing the plot filter v2",
182
+ plot_size=PlotParam.make_v2(2),
183
+ pos_challenge=b32("aefba5c94bc9bbfe2c538b7faaaf03384ac5a6170e40b024657df6b0a27c34a7"),
166
184
  plot_public_key=g1(
167
185
  "afa3aaf09c03885154be49216ee7fb2e4581b9c4a4d7e9cc402e27280bf0cfdbdf1b9ba674e301fd1d1450234b3b1868"
168
186
  ),
169
- pool_public_key=g1(
170
- "b6449c2c68df97c19e884427e42ee7350982d4020571ead08732615ff39bd216bfd630b6460784982bec98b49fea79d0"
171
- ),
172
- expected_error="NotImplementedError",
187
+ pool_contract_puzzle_hash=bytes32(b"1" * 32),
188
+ expected_error="Did not pass the plot filter",
173
189
  ),
190
+ # TODO: todo_v2_plots add test case that passes the plot filter
174
191
  )
175
192
  def test_verify_and_get_quality_string_v2(caplog: pytest.LogCaptureFixture, case: ProofOfSpaceCase) -> None:
176
193
  pos = make_pos(
@@ -181,16 +198,17 @@ def test_verify_and_get_quality_string_v2(caplog: pytest.LogCaptureFixture, case
181
198
  version_and_size=case.plot_size,
182
199
  proof=b"1",
183
200
  )
184
- size = pos.size()
185
- assert size.size_v2 is not None
186
- assert size.size_v1 is None
201
+ plot_param = pos.param()
202
+ assert plot_param.strength_v2 is not None
203
+ assert plot_param.size_v1 is None
187
204
  try:
188
205
  quality_string = verify_and_get_quality_string(
189
206
  pos=pos,
190
207
  constants=DEFAULT_CONSTANTS,
191
208
  original_challenge_hash=b32("0x73490e166d0b88347c37d921660b216c27316aae9a3450933d3ff3b854e5831a"),
192
- signage_point=b32("0x7b3e23dbd438f9aceefa9827e2c5538898189987f49b06eceb7a43067e77b531"),
209
+ signage_point=b32("0xf7c1bd874da5e709d4713d60c8a70639eb1167b367a9c3787c65c1e582e2e662"),
193
210
  height=case.height,
211
+ prev_transaction_block_height=case.height,
194
212
  )
195
213
  except NotImplementedError as e:
196
214
  assert case.expected_error is not None
@@ -201,54 +219,27 @@ def test_verify_and_get_quality_string_v2(caplog: pytest.LogCaptureFixture, case
201
219
 
202
220
 
203
221
  @pytest.mark.parametrize(
204
- "height, strength",
222
+ "plot_param, valid",
205
223
  [
206
- (0, 2),
207
- (DEFAULT_CONSTANTS.HARD_FORK_HEIGHT, 2),
208
- (DEFAULT_CONSTANTS.HARD_FORK2_HEIGHT, 2),
209
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_4_HEIGHT - 1, 2),
210
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_4_HEIGHT, 4),
211
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_5_HEIGHT - 1, 4),
212
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_5_HEIGHT, 5),
213
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_6_HEIGHT - 1, 5),
214
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_6_HEIGHT, 6),
215
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_7_HEIGHT - 1, 6),
216
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_7_HEIGHT, 7),
217
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_8_HEIGHT - 1, 7),
218
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_8_HEIGHT, 8),
219
- (DEFAULT_CONSTANTS.PLOT_STRENGTH_8_HEIGHT + 1000000, 8),
224
+ (PlotParam.make_v1(31), False), # too small
225
+ (PlotParam.make_v1(32), True),
226
+ (PlotParam.make_v1(33), True),
227
+ (PlotParam.make_v1(34), True),
228
+ (PlotParam.make_v1(35), True),
229
+ (PlotParam.make_v1(36), True),
230
+ (PlotParam.make_v1(37), True),
231
+ (PlotParam.make_v1(49), True),
232
+ (PlotParam.make_v1(50), True),
233
+ (PlotParam.make_v1(51), False), # too large
234
+ (PlotParam.make_v2(1), False), # too small
235
+ (PlotParam.make_v2(2), True),
236
+ (PlotParam.make_v2(3), True),
237
+ (PlotParam.make_v2(32), True),
238
+ (PlotParam.make_v2(33), False), # strength too high
220
239
  ],
221
240
  )
222
- def test_calculate_plot_strength(height: uint32, strength: uint8) -> None:
223
- assert calculate_required_plot_strength(DEFAULT_CONSTANTS, height) == strength
224
-
225
-
226
- @pytest.mark.parametrize(
227
- "size, valid",
228
- [
229
- (PlotSize.make_v1(31), False), # too small
230
- (PlotSize.make_v1(32), True),
231
- (PlotSize.make_v1(33), True),
232
- (PlotSize.make_v1(34), True),
233
- (PlotSize.make_v1(35), True),
234
- (PlotSize.make_v1(36), True),
235
- (PlotSize.make_v1(37), True),
236
- (PlotSize.make_v1(49), True),
237
- (PlotSize.make_v1(50), True),
238
- (PlotSize.make_v1(51), False), # too large
239
- (PlotSize.make_v2(26), False), # too small
240
- (PlotSize.make_v2(27), False), # too small (and odd)
241
- (PlotSize.make_v2(28), True),
242
- (PlotSize.make_v2(29), False), # odd
243
- (PlotSize.make_v2(30), True),
244
- (PlotSize.make_v2(31), False), # odd
245
- (PlotSize.make_v2(32), True),
246
- (PlotSize.make_v2(33), False), # too large (and odd)
247
- (PlotSize.make_v2(34), False), # too large
248
- ],
249
- )
250
- def test_check_plot_size(size: PlotSize, valid: bool) -> None:
251
- assert check_plot_size(DEFAULT_CONSTANTS, size) == valid
241
+ def test_check_plot_param(plot_param: PlotParam, valid: bool) -> None:
242
+ assert check_plot_param(DEFAULT_CONSTANTS, plot_param) == valid
252
243
 
253
244
 
254
245
  class TestProofOfSpace:
@@ -272,12 +263,9 @@ class TestProofOfSpace:
272
263
 
273
264
 
274
265
  @pytest.mark.parametrize("height,expected", [(0, 3), (5496000, 2), (10542000, 1), (15592000, 0), (20643000, 0)])
275
- @pytest.mark.parametrize("plot_size", [PlotSize.make_v1(32), PlotSize.make_v2(28)])
276
- def test_calculate_prefix_bits_clamp_zero(height: uint32, expected: int, plot_size: PlotSize) -> None:
266
+ def test_calculate_prefix_bits_clamp_zero_v1(height: uint32, expected: int) -> None:
277
267
  constants = DEFAULT_CONSTANTS.replace(NUMBER_ZERO_BITS_PLOT_FILTER_V1=uint8(3))
278
- if plot_size.size_v2 is not None:
279
- expected = constants.NUMBER_ZERO_BITS_PLOT_FILTER_V2
280
- assert calculate_prefix_bits(constants, height, plot_size) == expected
268
+ assert calculate_prefix_bits(constants, height, PlotParam.make_v1(32)) == expected
281
269
 
282
270
 
283
271
  @pytest.mark.parametrize(
@@ -294,9 +282,47 @@ def test_calculate_prefix_bits_clamp_zero(height: uint32, expected: int, plot_si
294
282
  (20643000, 5),
295
283
  ],
296
284
  )
297
- @pytest.mark.parametrize("plot_size", [PlotSize.make_v1(32), PlotSize.make_v2(28)])
298
- def test_calculate_prefix_bits_default(height: uint32, expected: int, plot_size: PlotSize) -> None:
299
- constants = DEFAULT_CONSTANTS
300
- if plot_size.size_v2 is not None:
301
- expected = DEFAULT_CONSTANTS.NUMBER_ZERO_BITS_PLOT_FILTER_V2
302
- assert calculate_prefix_bits(constants, height, plot_size) == expected
285
+ def test_calculate_prefix_bits_v1(height: uint32, expected: int) -> None:
286
+ assert calculate_prefix_bits(DEFAULT_CONSTANTS, height, PlotParam.make_v1(32)) == expected
287
+
288
+
289
+ @pytest.mark.parametrize(
290
+ argnames=["height", "expected"],
291
+ argvalues=[
292
+ (0, 5),
293
+ (0xFFFFFFFA, 5),
294
+ (0xFFFFFFFB, 4),
295
+ (0xFFFFFFFC, 3),
296
+ (0xFFFFFFFD, 2),
297
+ (0xFFFFFFFF, 2),
298
+ ],
299
+ )
300
+ def test_calculate_prefix_bits_v2(height: uint32, expected: int) -> None:
301
+ assert calculate_prefix_bits(DEFAULT_CONSTANTS, height, PlotParam.make_v2(28)) == expected
302
+
303
+
304
+ def test_v1_phase_out() -> None:
305
+ constants = DEFAULT_CONSTANTS.replace(HARD_FORK2_HEIGHT=uint32(500000))
306
+ rng = random.Random()
307
+
308
+ phase_out_epochs = num_phase_out_epochs(constants)
309
+ print(f"phase-out epochs: {phase_out_epochs}")
310
+
311
+ for epoch in range(-5, phase_out_epochs + 5):
312
+ prev_tx_height = uint32(constants.HARD_FORK2_HEIGHT + epoch * constants.EPOCH_BLOCKS)
313
+ num_phased_out = 0
314
+ rng.seed(1337)
315
+ for i in range(1000):
316
+ proof = rng.randbytes(32)
317
+ if is_v1_phased_out(proof, prev_tx_height, constants):
318
+ num_phased_out += 1
319
+
320
+ expect = min(1.0, max(0.0, epoch / phase_out_epochs))
321
+
322
+ print(
323
+ f"height: {prev_tx_height} "
324
+ f"epoch: {epoch} "
325
+ f"phased-out: {num_phased_out / 10:0.2f}% "
326
+ f"expect: {expect * 100.0:0.2f}%"
327
+ )
328
+ assert abs((num_phased_out / 1000) - expect) < 0.05