chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/pools/pool_wallet.py CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import dataclasses
4
4
  import logging
5
5
  import time
6
- from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Optional, Set, Tuple, cast
6
+ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
7
7
 
8
8
  from chia_rs import G1Element, G2Element, PrivateKey
9
9
  from typing_extensions import final
@@ -80,7 +80,7 @@ class PoolWallet:
80
80
  next_transaction_fee: uint64 = uint64(0)
81
81
  next_tx_config: TXConfig = DEFAULT_TX_CONFIG
82
82
  target_state: Optional[PoolState] = None
83
- _owner_sk_and_index: Optional[Tuple[PrivateKey, uint32]] = None
83
+ _owner_sk_and_index: Optional[tuple[PrivateKey, uint32]] = None
84
84
 
85
85
  """
86
86
  From the user's perspective, this is not a wallet at all, but a way to control
@@ -137,7 +137,7 @@ class PoolWallet:
137
137
  @classmethod
138
138
  def _verify_self_pooled(cls, state: PoolState) -> Optional[str]:
139
139
  err = ""
140
- if state.pool_url not in [None, ""]:
140
+ if state.pool_url not in {None, ""}:
141
141
  err += " Unneeded pool_url for self-pooling"
142
142
 
143
143
  if state.relative_lock_height != 0:
@@ -159,7 +159,7 @@ class PoolWallet:
159
159
  f"is greater than recommended maximum ({cls.MAXIMUM_RELATIVE_LOCK_HEIGHT})"
160
160
  )
161
161
 
162
- if state.pool_url in [None, ""]:
162
+ if state.pool_url in {None, ""}:
163
163
  err += " Empty pool url in pooling state"
164
164
  return err
165
165
 
@@ -177,10 +177,7 @@ class PoolWallet:
177
177
 
178
178
  if state.state == PoolSingletonState.SELF_POOLING.value:
179
179
  return cls._verify_self_pooled(state)
180
- elif (
181
- state.state == PoolSingletonState.FARMING_TO_POOL.value
182
- or state.state == PoolSingletonState.LEAVING_POOL.value
183
- ):
180
+ elif state.state in {PoolSingletonState.FARMING_TO_POOL.value, PoolSingletonState.LEAVING_POOL.value}:
184
181
  return cls._verify_pooling_state(state)
185
182
  else:
186
183
  return "Internal Error"
@@ -191,12 +188,12 @@ class PoolWallet:
191
188
  if err:
192
189
  raise ValueError(f"Invalid internal Pool State: {err}: {initial_target_state}")
193
190
 
194
- async def get_spend_history(self) -> List[Tuple[uint32, CoinSpend]]:
191
+ async def get_spend_history(self) -> list[tuple[uint32, CoinSpend]]:
195
192
  return await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id)
196
193
 
197
194
  async def get_current_state(self) -> PoolWalletInfo:
198
- history: List[Tuple[uint32, CoinSpend]] = await self.get_spend_history()
199
- all_spends: List[CoinSpend] = [cs for _, cs in history]
195
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
196
+ all_spends: list[CoinSpend] = [cs for _, cs in history]
200
197
 
201
198
  # We must have at least the launcher spend
202
199
  assert len(all_spends) >= 1
@@ -228,21 +225,29 @@ class PoolWallet:
228
225
  last_singleton_spend_height,
229
226
  )
230
227
 
231
- async def get_unconfirmed_transactions(self) -> List[TransactionRecord]:
228
+ async def get_unconfirmed_transactions(self) -> list[TransactionRecord]:
232
229
  return await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
233
230
 
234
- async def get_tip(self) -> Tuple[uint32, CoinSpend]:
231
+ async def get_tip(self) -> tuple[uint32, CoinSpend]:
235
232
  return (await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id))[-1]
236
233
 
237
234
  async def update_pool_config(self) -> None:
238
235
  current_state: PoolWalletInfo = await self.get_current_state()
239
- pool_config_list: List[PoolWalletConfig] = load_pool_config(self.wallet_state_manager.root_path)
240
- pool_config_dict: Dict[bytes32, PoolWalletConfig] = {c.launcher_id: c for c in pool_config_list}
236
+ pool_config_list: list[PoolWalletConfig] = load_pool_config(self.wallet_state_manager.root_path)
237
+ pool_config_dict: dict[bytes32, PoolWalletConfig] = {c.launcher_id: c for c in pool_config_list}
241
238
  existing_config: Optional[PoolWalletConfig] = pool_config_dict.get(current_state.launcher_id, None)
242
239
  payout_instructions: str = existing_config.payout_instructions if existing_config is not None else ""
243
240
 
244
241
  if len(payout_instructions) == 0:
245
- payout_instructions = (await self.standard_wallet.get_new_puzzlehash()).hex()
242
+ reuse_puzhash_config = self.wallet_state_manager.config.get("reuse_public_key_for_change", None)
243
+ if reuse_puzhash_config is None:
244
+ reuse_puzhash = False
245
+ else:
246
+ reuse_puzhash = reuse_puzhash_config.get(
247
+ str(self.wallet_state_manager.root_pubkey.get_fingerprint()), False
248
+ )
249
+
250
+ payout_instructions = (await self.standard_wallet.get_puzzle_hash(new=not reuse_puzhash)).hex()
246
251
  self.log.info(f"New config entry. Generated payout_instructions puzzle hash: {payout_instructions}")
247
252
 
248
253
  new_config: PoolWalletConfig = PoolWalletConfig(
@@ -262,7 +267,7 @@ class PoolWallet:
262
267
  The DB must be committed after calling this method. All validation should be done here. Returns True iff
263
268
  the spend is a valid transition spend for the singleton, False otherwise.
264
269
  """
265
- tip: Tuple[uint32, CoinSpend] = await self.get_tip()
270
+ tip: tuple[uint32, CoinSpend] = await self.get_tip()
266
271
  tip_spend = tip[1]
267
272
 
268
273
  tip_coin: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
@@ -270,7 +275,7 @@ class PoolWallet:
270
275
  spent_coin_name: bytes32 = tip_coin.name()
271
276
 
272
277
  if spent_coin_name != new_state.coin.name():
273
- history: List[Tuple[uint32, CoinSpend]] = await self.get_spend_history()
278
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
274
279
  if new_state.coin.name() in [sp.coin.name() for _, sp in history]:
275
280
  self.log.info(f"Already have state transition: {new_state.coin.name().hex()}")
276
281
  else:
@@ -304,7 +309,7 @@ class PoolWallet:
304
309
  Returns True if the wallet should be removed.
305
310
  """
306
311
  try:
307
- history: List[Tuple[uint32, CoinSpend]] = await self.wallet_state_manager.pool_store.get_spends_for_wallet(
312
+ history: list[tuple[uint32, CoinSpend]] = await self.wallet_state_manager.pool_store.get_spends_for_wallet(
308
313
  self.wallet_id
309
314
  )
310
315
  prev_state: PoolWalletInfo = await self.get_current_state()
@@ -326,7 +331,7 @@ class PoolWallet:
326
331
  wallet_state_manager: Any,
327
332
  wallet: Wallet,
328
333
  launcher_coin_id: bytes32,
329
- block_spends: List[CoinSpend],
334
+ block_spends: list[CoinSpend],
330
335
  block_height: uint32,
331
336
  *,
332
337
  name: Optional[str] = None,
@@ -391,8 +396,8 @@ class PoolWallet:
391
396
  fee: uint64 = uint64(0),
392
397
  p2_singleton_delay_time: Optional[uint64] = None,
393
398
  p2_singleton_delayed_ph: Optional[bytes32] = None,
394
- extra_conditions: Tuple[Condition, ...] = tuple(),
395
- ) -> Tuple[bytes32, bytes32]:
399
+ extra_conditions: tuple[Condition, ...] = tuple(),
400
+ ) -> tuple[bytes32, bytes32]:
396
401
  """
397
402
  A "plot NFT", or pool wallet, represents the idea of a set of plots that all pay to
398
403
  the same pooling puzzle. This puzzle is a `chia singleton` that is
@@ -405,7 +410,9 @@ class PoolWallet:
405
410
  standard_wallet = main_wallet
406
411
 
407
412
  if p2_singleton_delayed_ph is None:
408
- p2_singleton_delayed_ph = await main_wallet.get_new_puzzlehash()
413
+ p2_singleton_delayed_ph = await main_wallet.get_puzzle_hash(
414
+ new=not action_scope.config.tx_config.reuse_puzhash
415
+ )
409
416
  if p2_singleton_delay_time is None:
410
417
  p2_singleton_delay_time = uint64(604800)
411
418
 
@@ -414,12 +421,12 @@ class PoolWallet:
414
421
  if balance < PoolWallet.MINIMUM_INITIAL_BALANCE:
415
422
  raise ValueError("Not enough balance in main wallet to create a managed plotting pool.")
416
423
  if balance < PoolWallet.MINIMUM_INITIAL_BALANCE + fee:
417
- raise ValueError("Not enough balance in main wallet to create a managed plotting pool with fee {fee}.")
424
+ raise ValueError(f"Not enough balance in main wallet to create a managed plotting pool with fee {fee}.")
418
425
 
419
426
  # Verify Parameters - raise if invalid
420
427
  PoolWallet._verify_initial_target_state(initial_target_state)
421
428
 
422
- singleton_puzzle_hash, launcher_coin_id = await PoolWallet.generate_launcher_spend(
429
+ _singleton_puzzle_hash, launcher_coin_id = await PoolWallet.generate_launcher_spend(
423
430
  standard_wallet,
424
431
  uint64(1),
425
432
  fee,
@@ -437,7 +444,7 @@ class PoolWallet:
437
444
 
438
445
  return p2_singleton_puzzle_hash, launcher_coin_id
439
446
 
440
- async def _get_owner_key_cache(self) -> Tuple[PrivateKey, uint32]:
447
+ async def _get_owner_key_cache(self) -> tuple[PrivateKey, uint32]:
441
448
  if self._owner_sk_and_index is None:
442
449
  self._owner_sk_and_index = find_owner_sk(
443
450
  [self.wallet_state_manager.get_master_private_key()],
@@ -453,7 +460,7 @@ class PoolWallet:
453
460
  self,
454
461
  fee: uint64,
455
462
  action_scope: WalletActionScope,
456
- extra_conditions: Tuple[Condition, ...] = tuple(),
463
+ extra_conditions: tuple[Condition, ...] = tuple(),
457
464
  ) -> None:
458
465
  await self.standard_wallet.generate_signed_transaction(
459
466
  uint64(0),
@@ -514,19 +521,19 @@ class PoolWallet:
514
521
  assert new_inner_puzzle != inner_puzzle
515
522
  if is_pool_member_inner_puzzle(inner_puzzle):
516
523
  (
517
- inner_f,
518
- target_puzzle_hash,
519
- p2_singleton_hash,
520
- pubkey_as_program,
521
- pool_reward_prefix,
522
- escape_puzzle_hash,
524
+ _inner_f,
525
+ _target_puzzle_hash,
526
+ _p2_singleton_hash,
527
+ _pubkey_as_program,
528
+ _pool_reward_prefix,
529
+ _escape_puzzle_hash,
523
530
  ) = uncurry_pool_member_inner_puzzle(inner_puzzle)
524
531
  elif is_pool_waitingroom_inner_puzzle(inner_puzzle):
525
532
  (
526
- target_puzzle_hash, # payout_puzzle_hash
527
- relative_lock_height,
528
- pubkey_as_program,
529
- p2_singleton_hash,
533
+ _target_puzzle_hash, # payout_puzzle_hash
534
+ _relative_lock_height,
535
+ _pubkey_as_program,
536
+ _p2_singleton_hash,
530
537
  ) = uncurry_pool_waitingroom_inner_puzzle(inner_puzzle)
531
538
  else:
532
539
  raise RuntimeError("Invalid state")
@@ -570,13 +577,13 @@ class PoolWallet:
570
577
  delay_time: uint64,
571
578
  delay_ph: bytes32,
572
579
  action_scope: WalletActionScope,
573
- extra_conditions: Tuple[Condition, ...] = tuple(),
574
- ) -> Tuple[bytes32, bytes32]:
580
+ extra_conditions: tuple[Condition, ...] = tuple(),
581
+ ) -> tuple[bytes32, bytes32]:
575
582
  """
576
583
  Creates the initial singleton, which includes spending an origin coin, the launcher, and creating a singleton
577
584
  with the "pooling" inner state, which can be either self pooling or using a pool
578
585
  """
579
- coins: Set[Coin] = await standard_wallet.select_coins(uint64(amount + fee), action_scope)
586
+ coins: set[Coin] = await standard_wallet.select_coins(uint64(amount + fee), action_scope)
580
587
  if coins is None:
581
588
  raise ValueError("Not enough coins to create pool wallet")
582
589
 
@@ -663,7 +670,7 @@ class PoolWallet:
663
670
  msg = f"Asked to change to current state. Target = {target_state}"
664
671
  self.log.info(msg)
665
672
  raise ValueError(msg)
666
- elif current_state.current.state in [SELF_POOLING.value, LEAVING_POOL.value]:
673
+ elif current_state.current.state in {SELF_POOLING.value, LEAVING_POOL.value}:
667
674
  total_fee = fee
668
675
  elif current_state.current.state == FARMING_TO_POOL.value:
669
676
  total_fee = uint64(fee * 2)
@@ -674,7 +681,7 @@ class PoolWallet:
674
681
  )
675
682
  PoolWallet._verify_initial_target_state(target_state)
676
683
  if current_state.current.state == LEAVING_POOL.value:
677
- history: List[Tuple[uint32, CoinSpend]] = await self.get_spend_history()
684
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
678
685
  last_height: uint32 = history[-1][0]
679
686
  if (
680
687
  await self.wallet_state_manager.blockchain.get_finished_sync_up_to()
@@ -711,7 +718,7 @@ class PoolWallet:
711
718
 
712
719
  if current_state.current.state == LEAVING_POOL.value:
713
720
  total_fee = fee
714
- history: List[Tuple[uint32, CoinSpend]] = await self.get_spend_history()
721
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
715
722
  last_height: uint32 = history[-1][0]
716
723
  if (
717
724
  await self.wallet_state_manager.blockchain.get_finished_sync_up_to()
@@ -746,21 +753,21 @@ class PoolWallet:
746
753
  unspent_coin_records = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.wallet_id)
747
754
  if len(unspent_coin_records) == 0:
748
755
  raise ValueError("Nothing to claim, no transactions to p2_singleton_puzzle_hash")
749
- farming_rewards: List[TransactionRecord] = await self.wallet_state_manager.tx_store.get_farming_rewards()
750
- coin_to_height_farmed: Dict[Coin, uint32] = {}
756
+ farming_rewards: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_farming_rewards()
757
+ coin_to_height_farmed: dict[Coin, uint32] = {}
751
758
  for tx_record in farming_rewards:
752
759
  height_farmed: Optional[uint32] = tx_record.height_farmed(
753
760
  self.wallet_state_manager.constants.GENESIS_CHALLENGE
754
761
  )
755
762
  assert height_farmed is not None
756
763
  coin_to_height_farmed[tx_record.additions[0]] = height_farmed
757
- history: List[Tuple[uint32, CoinSpend]] = await self.get_spend_history()
764
+ history: list[tuple[uint32, CoinSpend]] = await self.get_spend_history()
758
765
  assert len(history) > 0
759
766
  delayed_seconds, delayed_puzhash = get_delayed_puz_info_from_launcher_spend(history[0][1])
760
767
  current_state: PoolWalletInfo = await self.get_current_state()
761
768
  last_solution: CoinSpend = history[-1][1]
762
769
 
763
- all_spends: List[CoinSpend] = []
770
+ all_spends: list[CoinSpend] = []
764
771
  total_amount = 0
765
772
 
766
773
  # The coins being claimed are gathered into the `SpendBundle`, :absorb_spend:
@@ -778,7 +785,7 @@ class PoolWallet:
778
785
  self.log.info(f"pool wallet truncating absorb to {max_spends_in_tx} spends to fit into block")
779
786
  print(f"pool wallet truncating absorb to {max_spends_in_tx} spends to fit into block")
780
787
  break
781
- absorb_spend: List[CoinSpend] = create_absorb_spend(
788
+ absorb_spend: list[CoinSpend] = create_absorb_spend(
782
789
  last_solution,
783
790
  current_state.current,
784
791
  current_state.launcher_coin,
@@ -821,7 +828,7 @@ class PoolWallet:
821
828
  confirmed=False,
822
829
  sent=uint32(0),
823
830
  spend_bundle=claim_spend,
824
- additions=claim_spend.additions(),
831
+ additions=[add for add in claim_spend.additions() if add.amount == last_solution.coin.amount],
825
832
  removals=claim_spend.removals(),
826
833
  wallet_id=uint32(self.wallet_id),
827
834
  sent_to=[],
@@ -846,16 +853,16 @@ class PoolWallet:
846
853
  raise ValueError(f"Internal error. Pool wallet {self.wallet_id} state: {pool_wallet_info.current}")
847
854
 
848
855
  if (
849
- self.target_state.state in [FARMING_TO_POOL.value, SELF_POOLING.value]
856
+ self.target_state.state in {FARMING_TO_POOL.value, SELF_POOLING.value}
850
857
  and pool_wallet_info.current.state == LEAVING_POOL.value
851
858
  ):
852
859
  leave_height = tip_height + pool_wallet_info.current.relative_lock_height
853
860
 
854
861
  # Add some buffer (+2) to reduce chances of a reorg
855
862
  if peak_height > leave_height + 2:
856
- unconfirmed: List[TransactionRecord] = (
857
- await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
858
- )
863
+ unconfirmed: list[
864
+ TransactionRecord
865
+ ] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
859
866
  next_tip: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
860
867
  assert next_tip is not None
861
868
 
@@ -879,7 +886,7 @@ class PoolWallet:
879
886
  await self.generate_travel_transactions(self.next_transaction_fee, action_scope)
880
887
 
881
888
  async def have_unconfirmed_transaction(self) -> bool:
882
- unconfirmed: List[TransactionRecord] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(
889
+ unconfirmed: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(
883
890
  self.wallet_id
884
891
  )
885
892
  return len(unconfirmed) > 0
@@ -887,7 +894,7 @@ class PoolWallet:
887
894
  async def get_confirmed_balance(self, _: Optional[object] = None) -> uint128:
888
895
  amount: uint128 = uint128(0)
889
896
  if (await self.get_current_state()).current.state == SELF_POOLING.value:
890
- unspent_coin_records: List[WalletCoinRecord] = list(
897
+ unspent_coin_records: list[WalletCoinRecord] = list(
891
898
  await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.wallet_id)
892
899
  )
893
900
  for record in unspent_coin_records:
@@ -904,13 +911,13 @@ class PoolWallet:
904
911
  async def get_pending_change_balance(self) -> uint64:
905
912
  return uint64(0)
906
913
 
907
- async def get_max_send_amount(self, records: Optional[Set[WalletCoinRecord]] = None) -> uint128:
914
+ async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
908
915
  return uint128(0)
909
916
 
910
917
  async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[object]) -> None:
911
918
  pass
912
919
 
913
- async def select_coins(self, amount: uint64, action_scope: WalletActionScope) -> Set[Coin]:
920
+ async def select_coins(self, amount: uint64, action_scope: WalletActionScope) -> set[Coin]:
914
921
  raise RuntimeError("PoolWallet does not support select_coins()")
915
922
 
916
923
  def require_derivation_paths(self) -> bool:
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from enum import IntEnum
5
- from typing import Any, Dict, Optional
5
+ from typing import Any, Optional
6
6
 
7
7
  from chia_rs import G1Element
8
8
 
@@ -62,7 +62,7 @@ class PoolState(Streamable):
62
62
 
63
63
 
64
64
  def initial_pool_state_from_dict(
65
- state_dict: Dict[str, Any],
65
+ state_dict: dict[str, Any],
66
66
  owner_pubkey: G1Element,
67
67
  owner_puzzle_hash: bytes32,
68
68
  ) -> PoolState:
@@ -93,7 +93,7 @@ def create_pool_state(
93
93
  relative_lock_height: uint32,
94
94
  ) -> PoolState:
95
95
  if state not in {s.value for s in PoolSingletonState}:
96
- raise AssertionError("state {state} is not a valid PoolSingletonState,")
96
+ raise AssertionError(f"state {state} is not a valid PoolSingletonState,")
97
97
  ps = PoolState(
98
98
  POOL_PROTOCOL_VERSION, uint8(state), target_puzzle_hash, owner_pubkey, pool_url, relative_lock_height
99
99
  )
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List, Optional
4
+ from typing import Optional
5
5
 
6
6
  from chia.types.blockchain_format.sized_bytes import bytes32
7
7
  from chia.types.blockchain_format.vdf import VDFInfo, VDFProof
@@ -90,7 +90,7 @@ class RequestBlocks(Streamable):
90
90
  class RespondBlocks(Streamable):
91
91
  start_height: uint32
92
92
  end_height: uint32
93
- blocks: List[FullBlock]
93
+ blocks: list[FullBlock]
94
94
 
95
95
 
96
96
  @streamable
@@ -216,4 +216,4 @@ class RequestPeers(Streamable):
216
216
  @streamable
217
217
  @dataclass(frozen=True)
218
218
  class RespondPeers(Streamable):
219
- peer_list: List[TimestampedPeerInfo]
219
+ peer_list: list[TimestampedPeerInfo]
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from enum import IntEnum
5
- from typing import List, Optional, Tuple
5
+ from typing import Optional
6
6
 
7
7
  from chia_rs import G1Element, G2Element
8
8
 
@@ -29,8 +29,8 @@ class PoolDifficulty(Streamable):
29
29
  @streamable
30
30
  @dataclass(frozen=True)
31
31
  class HarvesterHandshake(Streamable):
32
- farmer_public_keys: List[G1Element]
33
- pool_public_keys: List[G1Element]
32
+ farmer_public_keys: list[G1Element]
33
+ pool_public_keys: list[G1Element]
34
34
 
35
35
 
36
36
  @streamable
@@ -41,7 +41,7 @@ class NewSignagePointHarvester(Streamable):
41
41
  sub_slot_iters: uint64
42
42
  signage_point_index: uint8
43
43
  sp_hash: bytes32
44
- pool_difficulties: List[PoolDifficulty]
44
+ pool_difficulties: list[PoolDifficulty]
45
45
  filter_prefix_bits: uint8
46
46
 
47
47
 
@@ -90,9 +90,9 @@ class RequestSignatures(Streamable):
90
90
  plot_identifier: str
91
91
  challenge_hash: bytes32
92
92
  sp_hash: bytes32
93
- messages: List[bytes32]
93
+ messages: list[bytes32]
94
94
  # This, and rc_block_unfinished are only set when using a third-party harvester (see CHIP-22)
95
- message_data: Optional[List[Optional[SignatureRequestSourceData]]]
95
+ message_data: Optional[list[Optional[SignatureRequestSourceData]]]
96
96
  rc_block_unfinished: Optional[RewardChainBlockUnfinished]
97
97
 
98
98
 
@@ -104,7 +104,7 @@ class RespondSignatures(Streamable):
104
104
  sp_hash: bytes32
105
105
  local_pk: G1Element
106
106
  farmer_pk: G1Element
107
- message_signatures: List[Tuple[bytes32, G2Element]]
107
+ message_signatures: list[tuple[bytes32, G2Element]]
108
108
  include_source_signature_data: bool
109
109
  farmer_reward_address_override: Optional[bytes32]
110
110
 
@@ -132,9 +132,9 @@ class RequestPlots(Streamable):
132
132
  @streamable
133
133
  @dataclass(frozen=True)
134
134
  class RespondPlots(Streamable):
135
- plots: List[Plot]
136
- failed_to_open_filenames: List[str]
137
- no_key_filenames: List[str]
135
+ plots: list[Plot]
136
+ failed_to_open_filenames: list[str]
137
+ no_key_filenames: list[str]
138
138
 
139
139
 
140
140
  @streamable
@@ -166,7 +166,7 @@ class PlotSyncStart(Streamable):
166
166
  @dataclass(frozen=True)
167
167
  class PlotSyncPathList(Streamable):
168
168
  identifier: PlotSyncIdentifier
169
- data: List[str]
169
+ data: list[str]
170
170
  final: bool
171
171
 
172
172
  def __str__(self) -> str:
@@ -177,7 +177,7 @@ class PlotSyncPathList(Streamable):
177
177
  @dataclass(frozen=True)
178
178
  class PlotSyncPlotList(Streamable):
179
179
  identifier: PlotSyncIdentifier
180
- data: List[Plot]
180
+ data: list[Plot]
181
181
  final: bool
182
182
 
183
183
  def __str__(self) -> str:
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List
5
4
 
6
5
  from chia.types.peer_info import TimestampedPeerInfo
7
6
  from chia.util.streamable import Streamable, streamable
@@ -23,4 +22,4 @@ class RequestPeersIntroducer(Streamable):
23
22
  @streamable
24
23
  @dataclass(frozen=True)
25
24
  class RespondPeersIntroducer(Streamable):
26
- peer_list: List[TimestampedPeerInfo]
25
+ peer_list: list[TimestampedPeerInfo]
@@ -100,10 +100,10 @@ class ProtocolMessageTypes(Enum):
100
100
 
101
101
  # More wallet protocol
102
102
  coin_state_update = 69
103
- register_interest_in_puzzle_hash = 70
104
- respond_to_ph_update = 71
105
- register_interest_in_coin = 72
106
- respond_to_coin_update = 73
103
+ register_for_ph_updates = 70
104
+ respond_to_ph_updates = 71
105
+ register_for_coin_updates = 72
106
+ respond_to_coin_updates = 73
107
107
  request_children = 74
108
108
  respond_children = 75
109
109
  request_ses_hashes = 76
@@ -41,8 +41,8 @@ VALID_REPLY_MESSAGE_MAP = {
41
41
  pmt.request_compact_vdf: [pmt.respond_compact_vdf],
42
42
  pmt.request_peers: [pmt.respond_peers],
43
43
  pmt.request_header_blocks: [pmt.respond_header_blocks, pmt.reject_header_blocks, pmt.reject_block_headers],
44
- pmt.register_interest_in_puzzle_hash: [pmt.respond_to_ph_update],
45
- pmt.register_interest_in_coin: [pmt.respond_to_coin_update],
44
+ pmt.register_for_ph_updates: [pmt.respond_to_ph_updates],
45
+ pmt.register_for_coin_updates: [pmt.respond_to_coin_updates],
46
46
  pmt.request_children: [pmt.respond_children],
47
47
  pmt.request_ses_hashes: [pmt.respond_ses_hashes],
48
48
  pmt.request_block_headers: [pmt.respond_block_headers, pmt.reject_block_headers, pmt.reject_header_blocks],
@@ -5,3 +5,4 @@ INVALID_PROTOCOL_BAN_SECONDS = 10
5
5
  API_EXCEPTION_BAN_SECONDS = 10
6
6
  INTERNAL_PROTOCOL_ERROR_BAN_SECONDS = 10 # Don't flap if our client is at fault
7
7
  CONSENSUS_ERROR_BAN_SECONDS = 600
8
+ RATE_LIMITER_BAN_SECONDS = 300
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from enum import IntEnum
5
- from typing import List, Optional, Tuple
5
+ from typing import Optional
6
6
 
7
7
  from chia.server.outbound_message import NodeType
8
8
  from chia.util.ints import int16, uint8, uint16
@@ -47,7 +47,7 @@ class Capability(IntEnum):
47
47
 
48
48
  # These are the default capabilities used in all outgoing handshakes.
49
49
  # "1" means the capability is supported and enabled.
50
- _capabilities: List[Tuple[uint16, str]] = [
50
+ _capabilities: list[tuple[uint16, str]] = [
51
51
  (uint16(Capability.BASE.value), "1"),
52
52
  (uint16(Capability.BLOCK_HEADERS.value), "1"),
53
53
  (uint16(Capability.RATE_LIMITS_V2.value), "1"),
@@ -75,7 +75,7 @@ class Handshake(Streamable):
75
75
  software_version: str
76
76
  server_port: uint16
77
77
  node_type: uint8
78
- capabilities: List[Tuple[uint16, str]]
78
+ capabilities: list[tuple[uint16, str]]
79
79
 
80
80
 
81
81
  @streamable
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import List, Optional, Tuple
4
+ from typing import Optional
5
5
 
6
6
  from chia.types.blockchain_format.foliage import Foliage
7
7
  from chia.types.blockchain_format.reward_chain_block import RewardChainBlock, RewardChainBlockUnfinished
@@ -28,7 +28,7 @@ class NewPeakTimelord(Streamable):
28
28
  sub_epoch_summary: Optional[
29
29
  SubEpochSummary
30
30
  ] # If NewPeak is the last slot in epoch, the next slot should include this
31
- previous_reward_challenges: List[Tuple[bytes32, uint128]]
31
+ previous_reward_challenges: list[tuple[bytes32, uint128]]
32
32
  last_challenge_sb_or_eos_total_iters: uint128
33
33
  passes_ses_height_but_not_yet_included: bool
34
34