chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
@@ -1,11 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import contextlib
3
4
  import json
4
5
  import operator
6
+ import unittest
7
+ from collections.abc import Iterator
5
8
  from dataclasses import asdict, dataclass, field
6
- from typing import TYPE_CHECKING, ClassVar, Dict, List, Optional, Tuple, Union, cast
9
+ from typing import TYPE_CHECKING, Any, ClassVar, Union, cast
7
10
 
8
11
  from chia._tests.environments.common import ServiceEnvironment
12
+ from chia.cmds.cmd_helpers import NeedsTXConfig, NeedsWalletRPC, TransactionEndpoint, TransactionsOut, WalletClientInfo
13
+ from chia.cmds.param_types import CliAmount, cli_amount_none
9
14
  from chia.rpc.full_node_rpc_client import FullNodeRpcClient
10
15
  from chia.rpc.rpc_server import RpcServer
11
16
  from chia.rpc.wallet_rpc_api import WalletRpcApi
@@ -14,9 +19,8 @@ from chia.server.server import ChiaServer
14
19
  from chia.server.start_service import Service
15
20
  from chia.simulator.full_node_simulator import FullNodeSimulator
16
21
  from chia.types.blockchain_format.sized_bytes import bytes32
17
- from chia.util.ints import uint32
18
- from chia.wallet.derivation_record import DerivationRecord
19
- from chia.wallet.transaction_record import TransactionRecord
22
+ from chia.util.ints import uint32, uint64
23
+ from chia.wallet.transaction_record import LightTransactionRecord
20
24
  from chia.wallet.util.transaction_type import CLAWBACK_INCOMING_TRANSACTION_TYPES
21
25
  from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig
22
26
  from chia.wallet.wallet import Wallet
@@ -24,13 +28,29 @@ from chia.wallet.wallet_node import Balance, WalletNode
24
28
  from chia.wallet.wallet_node_api import WalletNodeAPI
25
29
  from chia.wallet.wallet_state_manager import WalletStateManager
26
30
 
31
+ STANDARD_TX_ENDPOINT_ARGS: dict[str, Any] = TransactionEndpoint(
32
+ rpc_info=NeedsWalletRPC(client_info=None, wallet_rpc_port=None, fingerprint=None),
33
+ tx_config_loader=NeedsTXConfig(
34
+ min_coin_amount=cli_amount_none,
35
+ max_coin_amount=cli_amount_none,
36
+ coins_to_exclude=(),
37
+ amounts_to_exclude=(),
38
+ reuse=None,
39
+ ),
40
+ transaction_writer=TransactionsOut(transaction_file_out=None),
41
+ fee=uint64(0),
42
+ push=True,
43
+ valid_at=None,
44
+ expires_at=None,
45
+ ).__dict__
46
+
27
47
  OPP_DICT = {"<": operator.lt, ">": operator.gt, "<=": operator.le, ">=": operator.ge}
28
48
 
29
49
 
30
50
  class BalanceCheckingError(Exception):
31
- errors: Dict[Union[int, str], List[str]]
51
+ errors: dict[Union[int, str], list[str]]
32
52
 
33
- def __init__(self, errors: Dict[Union[int, str], List[str]]) -> None:
53
+ def __init__(self, errors: dict[Union[int, str], list[str]]) -> None:
34
54
  self.errors = errors
35
55
 
36
56
  def __repr__(self) -> str:
@@ -47,10 +67,10 @@ class WalletState:
47
67
 
48
68
  @dataclass
49
69
  class WalletStateTransition:
50
- pre_block_balance_updates: Dict[Union[int, str], Dict[str, int]] = field(default_factory=dict)
51
- post_block_balance_updates: Dict[Union[int, str], Dict[str, int]] = field(default_factory=dict)
52
- pre_block_additional_balance_info: Dict[Union[int, str], Dict[str, int]] = field(default_factory=dict)
53
- post_block_additional_balance_info: Dict[Union[int, str], Dict[str, int]] = field(default_factory=dict)
70
+ pre_block_balance_updates: dict[Union[int, str], dict[str, int]] = field(default_factory=dict)
71
+ post_block_balance_updates: dict[Union[int, str], dict[str, int]] = field(default_factory=dict)
72
+ pre_block_additional_balance_info: dict[Union[int, str], dict[str, int]] = field(default_factory=dict)
73
+ post_block_additional_balance_info: dict[Union[int, str], dict[str, int]] = field(default_factory=dict)
54
74
 
55
75
 
56
76
  @dataclass
@@ -60,14 +80,14 @@ class WalletEnvironment:
60
80
  "WalletEnvironment", None
61
81
  )
62
82
 
63
- __match_args__: ClassVar[Tuple[str, ...]] = ()
83
+ __match_args__: ClassVar[tuple[str, ...]] = ()
64
84
 
65
85
  service: Service[WalletNode, WalletNodeAPI, WalletRpcApi]
66
86
  # TODO: maybe put this in the protocol?
67
87
  rpc_client: WalletRpcClient
68
88
  # TODO: added the default, but should think through implementing it etc. `.create()`?
69
- wallet_states: Dict[uint32, WalletState] = field(default_factory=dict)
70
- wallet_aliases: Dict[str, int] = field(default_factory=dict)
89
+ wallet_states: dict[uint32, WalletState] = field(default_factory=dict)
90
+ wallet_aliases: dict[str, int] = field(default_factory=dict)
71
91
 
72
92
  @property
73
93
  def node(self) -> WalletNode:
@@ -113,31 +133,31 @@ class WalletEnvironment:
113
133
  """
114
134
  This function turns a wallet id into an alias if one is available or the same wallet id if one is not.
115
135
  """
116
- inverted_wallet_aliases: Dict[int, str] = {v: k for k, v in self.wallet_aliases.items()}
136
+ inverted_wallet_aliases: dict[int, str] = {v: k for k, v in self.wallet_aliases.items()}
117
137
  if wallet_id in inverted_wallet_aliases:
118
138
  return inverted_wallet_aliases[wallet_id]
119
139
  else:
120
140
  return wallet_id
121
141
 
122
- async def check_balances(self, additional_balance_info: Dict[Union[int, str], Dict[str, int]] = {}) -> None:
142
+ async def check_balances(self, additional_balance_info: dict[Union[int, str], dict[str, int]] = {}) -> None:
123
143
  """
124
144
  This function checks the internal representation of what the balances should be against the balances that the
125
145
  wallet actually returns via the RPC.
126
146
 
127
147
  Likely this should be called as part of WalletTestFramework.process_pending_states instead of directly.
128
148
  """
129
- dealiased_additional_balance_info: Dict[uint32, Dict[str, int]] = {
149
+ dealiased_additional_balance_info: dict[uint32, dict[str, int]] = {
130
150
  self.dealias_wallet_id(k): v for k, v in additional_balance_info.items()
131
151
  }
132
- errors: Dict[Union[int, str], List[str]] = {}
152
+ errors: dict[Union[int, str], list[str]] = {}
133
153
  for wallet_id in self.wallet_state_manager.wallets:
134
154
  if wallet_id not in self.wallet_states:
135
155
  raise KeyError(f"No wallet state for wallet id {wallet_id} (alias: {self.alias_wallet_id(wallet_id)})")
136
156
  wallet_state: WalletState = self.wallet_states[wallet_id]
137
- wallet_errors: List[str] = []
157
+ wallet_errors: list[str] = []
138
158
 
139
159
  assert self.node.logged_in_fingerprint is not None
140
- expected_result: Dict[str, int] = {
160
+ expected_result: dict[str, int] = {
141
161
  **wallet_state.balance.to_json_dict(),
142
162
  "wallet_id": wallet_id,
143
163
  "wallet_type": self.wallet_state_manager.wallets[wallet_id].type().value,
@@ -148,7 +168,7 @@ class WalletEnvironment:
148
168
  else {}
149
169
  ),
150
170
  }
151
- balance_response: Dict[str, int] = await self.rpc_client.get_wallet_balance(wallet_id)
171
+ balance_response: dict[str, int] = await self.rpc_client.get_wallet_balance(wallet_id)
152
172
 
153
173
  if not expected_result.items() <= balance_response.items():
154
174
  for key, value in expected_result.items():
@@ -165,7 +185,7 @@ class WalletEnvironment:
165
185
  if errors != {}:
166
186
  raise BalanceCheckingError(errors)
167
187
 
168
- async def change_balances(self, update_dictionary: Dict[Union[int, str], Dict[str, int]]) -> None:
188
+ async def change_balances(self, update_dictionary: dict[Union[int, str], dict[str, int]]) -> None:
169
189
  """
170
190
  This method changes the internal representation of what the wallet balances should be. This is probably
171
191
  necessary to call before check_balances as most wallet operations will result in a balance change that causes
@@ -193,10 +213,10 @@ class WalletEnvironment:
193
213
  for wallet_id_or_alias, kwargs in update_dictionary.items():
194
214
  wallet_id: uint32 = self.dealias_wallet_id(wallet_id_or_alias)
195
215
 
196
- new_values: Dict[str, int] = {}
216
+ new_values: dict[str, int] = {}
197
217
  existing_values: Balance = await self.node.get_balance(wallet_id)
198
- if "init" in kwargs and kwargs["init"]:
199
- new_values = {k: v for k, v in kwargs.items() if k not in ("set_remainder", "init")}
218
+ if kwargs.get("init", False):
219
+ new_values = {k: v for k, v in kwargs.items() if k not in {"set_remainder", "init"}}
200
220
  elif wallet_id not in self.wallet_states:
201
221
  raise ValueError(
202
222
  f"Wallet id {wallet_id} (alias: {self.alias_wallet_id(wallet_id)}) does not have a current state. "
@@ -227,17 +247,13 @@ class WalletEnvironment:
227
247
  **self.wallet_states,
228
248
  wallet_id: WalletState(
229
249
  **{
230
- **({} if "init" in kwargs and kwargs["init"] else asdict(self.wallet_states[wallet_id])),
250
+ **({} if kwargs.get("init", False) else asdict(self.wallet_states[wallet_id])),
231
251
  "balance": Balance(
232
252
  **{
233
253
  **(
234
254
  asdict(existing_values)
235
- if "set_remainder" in kwargs and kwargs["set_remainder"]
236
- else (
237
- {}
238
- if "init" in kwargs and kwargs["init"]
239
- else asdict(self.wallet_states[wallet_id].balance)
240
- )
255
+ if kwargs.get("set_remainder", False)
256
+ else ({} if kwargs.get("init") else asdict(self.wallet_states[wallet_id].balance))
241
257
  ),
242
258
  **new_values,
243
259
  }
@@ -247,10 +263,10 @@ class WalletEnvironment:
247
263
  }
248
264
 
249
265
  async def wait_for_transactions_to_settle(
250
- self, full_node_api: FullNodeSimulator, _exclude_from_mempool_check: List[bytes32] = []
251
- ) -> List[TransactionRecord]:
266
+ self, full_node_api: FullNodeSimulator, _exclude_from_mempool_check: list[bytes32] = []
267
+ ) -> list[LightTransactionRecord]:
252
268
  # Gather all pending transactions
253
- pending_txs: List[TransactionRecord] = await self.wallet_state_manager.tx_store.get_all_unconfirmed()
269
+ pending_txs: list[LightTransactionRecord] = await self.wallet_state_manager.tx_store.get_all_unconfirmed()
254
270
  # Filter clawback txs
255
271
  pending_txs = [
256
272
  tx
@@ -264,16 +280,62 @@ class WalletEnvironment:
264
280
  return pending_txs
265
281
 
266
282
 
283
+ class NewPuzzleHashError(Exception):
284
+ pass
285
+
286
+
287
+ def catch_puzzle_hash_errors(func: Any) -> Any:
288
+ @contextlib.asynccontextmanager
289
+ async def catching_puzhash_errors(self: WalletStateManager, *args: Any, **kwargs: Any) -> Any:
290
+ try:
291
+ async with func(self, *args, **kwargs) as action_scope:
292
+ yield action_scope
293
+ except NewPuzzleHashError:
294
+ pass
295
+
296
+ return catching_puzhash_errors
297
+
298
+
267
299
  @dataclass
268
300
  class WalletTestFramework:
269
301
  full_node: FullNodeSimulator
270
302
  full_node_rpc_client: FullNodeRpcClient
271
303
  trusted_full_node: bool
272
- environments: List[WalletEnvironment]
304
+ environments: list[WalletEnvironment]
273
305
  tx_config: TXConfig = DEFAULT_TX_CONFIG
274
306
 
307
+ def cmd_tx_endpoint_args(self, env: WalletEnvironment) -> dict[str, Any]:
308
+ return {
309
+ **STANDARD_TX_ENDPOINT_ARGS,
310
+ "rpc_info": NeedsWalletRPC(
311
+ client_info=WalletClientInfo(
312
+ env.rpc_client,
313
+ env.wallet_state_manager.root_pubkey.get_fingerprint(),
314
+ env.wallet_state_manager.config,
315
+ )
316
+ ),
317
+ "tx_config_loader": NeedsTXConfig(
318
+ min_coin_amount=CliAmount(amount=self.tx_config.min_coin_amount, mojos=True),
319
+ max_coin_amount=CliAmount(amount=self.tx_config.max_coin_amount, mojos=True),
320
+ coins_to_exclude=tuple(self.tx_config.excluded_coin_ids),
321
+ amounts_to_exclude=tuple(
322
+ CliAmount(amount=amt, mojos=True) for amt in self.tx_config.excluded_coin_amounts
323
+ ),
324
+ reuse=self.tx_config.reuse_puzhash,
325
+ ),
326
+ }
327
+
328
+ @staticmethod
329
+ @contextlib.contextmanager
330
+ def new_puzzle_hashes_allowed() -> Iterator[None]:
331
+ with unittest.mock.patch(
332
+ "chia.wallet.wallet_state_manager.WalletStateManager.new_action_scope",
333
+ catch_puzzle_hash_errors(WalletStateManager.new_action_scope),
334
+ ):
335
+ yield
336
+
275
337
  async def process_pending_states(
276
- self, state_transitions: List[WalletStateTransition], invalid_transactions: List[bytes32] = []
338
+ self, state_transitions: list[WalletStateTransition], invalid_transactions: list[bytes32] = []
277
339
  ) -> None:
278
340
  """
279
341
  This is the main entry point for processing state in wallet tests. It does the following things:
@@ -288,21 +350,20 @@ class WalletTestFramework:
288
350
  """
289
351
  # Take note of the number of puzzle hashes if we're supposed to be reusing
290
352
  if self.tx_config.reuse_puzhash:
291
- puzzle_hash_indexes: List[Dict[uint32, Optional[DerivationRecord]]] = []
353
+ puzzle_hash_indexes: list[dict[uint32, int]] = []
292
354
  for env in self.environments:
293
- ph_indexes: Dict[uint32, Optional[DerivationRecord]] = {}
355
+ ph_indexes: dict[uint32, int] = {}
294
356
  for wallet_id in env.wallet_state_manager.wallets:
295
- ph_indexes[wallet_id] = (
296
- await env.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(wallet_id)
297
- )
357
+ ph_indexes[wallet_id] = await env.wallet_state_manager.puzzle_store.get_unused_count(wallet_id)
298
358
  puzzle_hash_indexes.append(ph_indexes)
299
359
 
300
- pending_txs: List[List[TransactionRecord]] = []
301
-
360
+ pending_txs: list[list[LightTransactionRecord]] = []
361
+ peak = self.full_node.full_node.blockchain.get_peak_height()
362
+ assert peak is not None
302
363
  # Check balances prior to block
303
364
  try:
304
365
  for i, env in enumerate(self.environments):
305
- await self.full_node.wait_for_wallet_synced(wallet_node=env.node, timeout=20)
366
+ await self.full_node.wait_for_wallet_synced(wallet_node=env.node, timeout=20, peak_height=peak)
306
367
  try:
307
368
  pending_txs.append(
308
369
  await env.wait_for_transactions_to_settle(
@@ -322,8 +383,6 @@ class WalletTestFramework:
322
383
  raise ValueError("Error before block was farmed")
323
384
 
324
385
  # Farm block
325
- peak = self.full_node.full_node.blockchain.get_peak_height()
326
- assert peak is not None
327
386
  await self.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
328
387
 
329
388
  # Check balances after block
@@ -354,7 +413,9 @@ class WalletTestFramework:
354
413
  try:
355
414
  await self.full_node.check_transactions_confirmed(env.wallet_state_manager, txs)
356
415
  except TimeoutError: # pragma: no cover
357
- unconfirmed: List[TransactionRecord] = await env.wallet_state_manager.tx_store.get_all_unconfirmed()
416
+ unconfirmed: list[
417
+ LightTransactionRecord
418
+ ] = await env.wallet_state_manager.tx_store.get_all_unconfirmed()
358
419
  raise TimeoutError(
359
420
  f"ENV-{i} TXs not confirmed: {[tx.to_json_dict() for tx in unconfirmed if tx in txs]}"
360
421
  )
@@ -364,5 +425,5 @@ class WalletTestFramework:
364
425
  for env, ph_indexes_before in zip(self.environments, puzzle_hash_indexes):
365
426
  for wallet_id, ph_index in zip(env.wallet_state_manager.wallets, ph_indexes_before):
366
427
  assert ph_indexes_before[wallet_id] == (
367
- await env.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(wallet_id)
428
+ await env.wallet_state_manager.puzzle_store.get_unused_count(wallet_id)
368
429
  )
@@ -5,7 +5,7 @@ import logging
5
5
  from dataclasses import dataclass
6
6
  from time import time
7
7
  from types import TracebackType
8
- from typing import Any, Dict, List, Optional, Tuple, Type, Union, cast
8
+ from typing import Any, Optional, Union, cast
9
9
  from unittest.mock import ANY
10
10
 
11
11
  import pytest
@@ -39,23 +39,23 @@ log = logging.getLogger(__name__)
39
39
 
40
40
 
41
41
  class StripOldEntriesCase:
42
- pairs: List[Tuple[float, int]]
42
+ pairs: list[tuple[float, int]]
43
43
  before: float
44
- expected_result: List[Tuple[float, int]]
44
+ expected_result: list[tuple[float, int]]
45
45
 
46
- def __init__(self, pairs: List[Tuple[float, int]], before: float, expected_result: List[Tuple[float, int]]):
46
+ def __init__(self, pairs: list[tuple[float, int]], before: float, expected_result: list[tuple[float, int]]):
47
47
  self.pairs = pairs
48
48
  self.before = before
49
49
  self.expected_result = expected_result
50
50
 
51
51
 
52
52
  class IncrementPoolStatsCase:
53
- pool_states: Dict[bytes32, Any]
53
+ pool_states: dict[bytes32, Any]
54
54
  p2_singleton_puzzle_hash: bytes32
55
55
  name: str
56
56
  current_time: float
57
57
  count: int
58
- value: Optional[Union[int, Dict[str, Any]]]
58
+ value: Optional[Union[int, dict[str, Any]]]
59
59
  expected_result: Any
60
60
 
61
61
  def __init__(
@@ -64,7 +64,7 @@ class IncrementPoolStatsCase:
64
64
  name: str,
65
65
  current_time: float,
66
66
  count: int,
67
- value: Optional[Union[int, Dict[str, Any]]],
67
+ value: Optional[Union[int, dict[str, Any]]],
68
68
  expected_result: Any,
69
69
  ):
70
70
  prepared_p2_singleton_puzzle_hash = std_hash(b"11223344")
@@ -142,10 +142,10 @@ class NewProofOfSpaceCase:
142
142
  pool_config: PoolWalletConfig
143
143
  pool_difficulty: Optional[uint64]
144
144
  authentication_token_timeout: Optional[uint8]
145
- farmer_private_keys: List[PrivateKey]
146
- authentication_keys: Dict[bytes32, PrivateKey]
145
+ farmer_private_keys: list[PrivateKey]
146
+ authentication_keys: dict[bytes32, PrivateKey]
147
147
  use_invalid_peer_response: bool
148
- expected_pool_state: Dict[str, Any]
148
+ expected_pool_state: dict[str, Any]
149
149
  marks: Marks = ()
150
150
 
151
151
  # This creates a test case whose proof of space passes plot filter and quality check
@@ -159,7 +159,7 @@ class NewProofOfSpaceCase:
159
159
  authentication_token_timeout: Optional[uint8],
160
160
  use_invalid_peer_response: bool,
161
161
  has_valid_authentication_keys: bool,
162
- expected_pool_stats: Dict[str, Any],
162
+ expected_pool_stats: dict[str, Any],
163
163
  ) -> NewProofOfSpaceCase:
164
164
  p2_singleton_puzzle_hash = bytes32.fromhex("302e05a1e6af431c22043ae2a9a8f71148c955c372697cb8ab348160976283df")
165
165
  pool_config = PoolWalletConfig(
@@ -348,7 +348,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
348
348
  expected_pool_stats={
349
349
  "points_found_since_start": 0,
350
350
  # Original item format here is (timestamp, value) but we'll ignore timestamp part
351
- # so every `xxx_24h` item in this dict will be List[Any].
351
+ # so every `xxx_24h` item in this dict will be list[Any].
352
352
  "points_found_24h": [],
353
353
  "points_acknowledged_since_start": 0,
354
354
  "points_acknowledged_24h": [],
@@ -380,7 +380,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
380
380
  expected_pool_stats={
381
381
  "points_found_since_start": 0,
382
382
  # Original item format here is (timestamp, value) but we'll ignore timestamp part
383
- # so every `xxx_24h` item in this dict will be List[Any].
383
+ # so every `xxx_24h` item in this dict will be list[Any].
384
384
  "points_found_24h": [],
385
385
  "points_acknowledged_since_start": 0,
386
386
  "points_acknowledged_24h": [],
@@ -411,7 +411,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
411
411
  expected_pool_stats={
412
412
  "points_found_since_start": 0,
413
413
  # Original item format here is (timestamp, value) but we'll ignore timestamp part
414
- # so every `xxx_24h` item in this dict will be List[Any].
414
+ # so every `xxx_24h` item in this dict will be list[Any].
415
415
  "points_found_24h": [],
416
416
  "points_acknowledged_since_start": 0,
417
417
  "points_acknowledged_24h": [],
@@ -442,7 +442,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
442
442
  expected_pool_stats={
443
443
  "points_found_since_start": 0,
444
444
  # Original item format here is (timestamp, value) but we'll ignore timestamp part
445
- # so every `xxx_24h` item in this dict will be List[Any].
445
+ # so every `xxx_24h` item in this dict will be list[Any].
446
446
  "points_found_24h": [],
447
447
  "points_acknowledged_since_start": 0,
448
448
  "points_acknowledged_24h": [],
@@ -473,7 +473,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
473
473
  expected_pool_stats={
474
474
  "points_found_since_start": 0,
475
475
  # Original item format here is (timestamp, value) but we'll ignore timestamp part
476
- # so every `xxx_24h` item in this dict will be List[Any].
476
+ # so every `xxx_24h` item in this dict will be list[Any].
477
477
  "points_found_24h": [],
478
478
  "points_acknowledged_since_start": 0,
479
479
  "points_acknowledged_24h": [],
@@ -504,7 +504,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
504
504
  expected_pool_stats={
505
505
  "points_found_since_start": 0,
506
506
  # Original item format here is (timestamp, value) but we'll ignore timestamp part
507
- # so every `xxx_24h` item in this dict will be List[Any].
507
+ # so every `xxx_24h` item in this dict will be list[Any].
508
508
  "points_found_24h": [],
509
509
  "points_acknowledged_since_start": 0,
510
510
  "points_acknowledged_24h": [],
@@ -535,7 +535,7 @@ def test_increment_pool_stats(case: IncrementPoolStatsCase) -> None:
535
535
  expected_pool_stats={
536
536
  "points_found_since_start": 1,
537
537
  # Original item format here is (timestamp, value) but we'll ignore timestamp part
538
- # so every `xxx_24h` item in this dict will be List[Any].
538
+ # so every `xxx_24h` item in this dict will be list[Any].
539
539
  "points_found_24h": [1],
540
540
  "points_acknowledged_since_start": 0,
541
541
  "points_acknowledged_24h": [],
@@ -561,7 +561,7 @@ async def test_farmer_new_proof_of_space_for_pool_stats(
561
561
  harvester_farmer_environment: HarvesterFarmerEnvironment,
562
562
  case: NewProofOfSpaceCase,
563
563
  ) -> None:
564
- farmer_service, farmer_rpc_client, _, _, _ = harvester_farmer_environment
564
+ farmer_service, _farmer_rpc_client, _, _, _ = harvester_farmer_environment
565
565
  farmer_api = farmer_service._api
566
566
 
567
567
  sp = farmer_protocol.NewSignagePoint(
@@ -672,7 +672,7 @@ class DummyPoolResponse:
672
672
  new_difficulty: Optional[int] = None
673
673
 
674
674
  async def text(self) -> str:
675
- json_dict: Dict[str, Any] = dict()
675
+ json_dict: dict[str, Any] = dict()
676
676
  if self.error_code:
677
677
  json_dict["error_code"] = self.error_code
678
678
  json_dict["error_message"] = self.error_message if self.error_message else "error-msg"
@@ -686,14 +686,14 @@ class DummyPoolResponse:
686
686
 
687
687
  async def __aexit__(
688
688
  self,
689
- exc_type: Optional[Type[BaseException]],
689
+ exc_type: Optional[type[BaseException]],
690
690
  exc_val: Optional[BaseException],
691
691
  exc_tb: Optional[TracebackType],
692
692
  ) -> None:
693
693
  pass
694
694
 
695
695
 
696
- def create_valid_pos(farmer: Farmer) -> Tuple[farmer_protocol.NewSignagePoint, ProofOfSpace, NewProofOfSpace]:
696
+ def create_valid_pos(farmer: Farmer) -> tuple[farmer_protocol.NewSignagePoint, ProofOfSpace, NewProofOfSpace]:
697
697
  case = NewProofOfSpaceCase.create_verified_quality_case(
698
698
  difficulty=uint64(1),
699
699
  sub_slot_iters=uint64(1000000000000),
@@ -764,11 +764,11 @@ def create_valid_pos(farmer: Farmer) -> Tuple[farmer_protocol.NewSignagePoint, P
764
764
  return sp, pos, new_pos
765
765
 
766
766
 
767
- def override_pool_state(overrides: Dict[str, Any]) -> Dict[str, Any]:
767
+ def override_pool_state(overrides: dict[str, Any]) -> dict[str, Any]:
768
768
  pool_state = {
769
769
  "points_found_since_start": 0,
770
770
  # Original item format here is (timestamp, value) but we'll ignore timestamp part
771
- # so every `xxx_24h` item in this dict will be List[Any].
771
+ # so every `xxx_24h` item in this dict will be list[Any].
772
772
  "points_found_24h": [],
773
773
  "points_acknowledged_since_start": 0,
774
774
  "points_acknowledged_24h": [],
@@ -793,7 +793,7 @@ def override_pool_state(overrides: Dict[str, Any]) -> Dict[str, Any]:
793
793
  class PoolStateCase:
794
794
  id: str
795
795
  pool_response: DummyPoolResponse
796
- expected_pool_state: Dict[str, Any]
796
+ expected_pool_state: dict[str, Any]
797
797
  marks: Marks = ()
798
798
 
799
799
 
@@ -867,7 +867,7 @@ class PoolStateCase:
867
867
  @pytest.mark.anyio
868
868
  async def test_farmer_pool_response(
869
869
  mocker: MockerFixture,
870
- farmer_one_harvester: Tuple[List[HarvesterService], FarmerService, BlockTools],
870
+ farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
871
871
  case: PoolStateCase,
872
872
  ) -> None:
873
873
  _, farmer_service, _ = farmer_one_harvester
@@ -927,7 +927,7 @@ async def test_farmer_pool_response(
927
927
  assert_stats_24h("missing_partials_24h")
928
928
 
929
929
 
930
- def make_pool_list_entry(overrides: Dict[str, Any]) -> Dict[str, Any]:
930
+ def make_pool_list_entry(overrides: dict[str, Any]) -> dict[str, Any]:
931
931
  pool_list_entry = {
932
932
  "owner_public_key": "84c3fcf9d5581c1ddc702cb0f3b4a06043303b334dd993ab42b2c320ebfa98e5ce558448615b3f69638ba92cf7f43da5", # noqa: E501
933
933
  "p2_singleton_puzzle_hash": "302e05a1e6af431c22043ae2a9a8f71148c955c372697cb8ab348160976283df",
@@ -941,7 +941,7 @@ def make_pool_list_entry(overrides: Dict[str, Any]) -> Dict[str, Any]:
941
941
  return pool_list_entry
942
942
 
943
943
 
944
- def make_pool_info() -> Dict[str, Any]:
944
+ def make_pool_info() -> dict[str, Any]:
945
945
  return {
946
946
  "name": "Pool Name",
947
947
  "description": "Pool Description",
@@ -955,7 +955,7 @@ def make_pool_info() -> Dict[str, Any]:
955
955
  }
956
956
 
957
957
 
958
- def make_pool_state(p2_singleton_puzzle_hash: bytes32, overrides: Dict[str, Any]) -> Dict[str, Any]:
958
+ def make_pool_state(p2_singleton_puzzle_hash: bytes32, overrides: dict[str, Any]) -> dict[str, Any]:
959
959
  pool_info = {
960
960
  "p2_singleton_puzzle_hash": p2_singleton_puzzle_hash.hex(),
961
961
  "points_found_since_start": 0,
@@ -995,8 +995,8 @@ class DummyPoolInfoResponse:
995
995
  ok: bool
996
996
  status: int
997
997
  url: URL
998
- pool_info: Optional[Dict[str, Any]] = None
999
- history: Tuple[DummyClientResponse, ...] = ()
998
+ pool_info: Optional[dict[str, Any]] = None
999
+ history: tuple[DummyClientResponse, ...] = ()
1000
1000
 
1001
1001
  async def text(self) -> str:
1002
1002
  if self.pool_info is None:
@@ -1009,7 +1009,7 @@ class DummyPoolInfoResponse:
1009
1009
 
1010
1010
  async def __aexit__(
1011
1011
  self,
1012
- exc_type: Optional[Type[BaseException]],
1012
+ exc_type: Optional[type[BaseException]],
1013
1013
  exc_val: Optional[BaseException],
1014
1014
  exc_tb: Optional[TracebackType],
1015
1015
  ) -> None:
@@ -1171,7 +1171,7 @@ class PoolInfoCase(DataCase):
1171
1171
  @pytest.mark.anyio
1172
1172
  async def test_farmer_pool_info_config_update(
1173
1173
  mocker: MockerFixture,
1174
- farmer_one_harvester: Tuple[List[HarvesterService], FarmerService, BlockTools],
1174
+ farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
1175
1175
  case: PoolInfoCase,
1176
1176
  ) -> None:
1177
1177
  _, farmer_service, _ = farmer_one_harvester
@@ -1212,7 +1212,7 @@ async def test_farmer_pool_info_config_update(
1212
1212
  class PartialSubmitHeaderCase(DataCase):
1213
1213
  _id: str
1214
1214
  harvester_peer: DummyHarvesterPeer
1215
- expected_headers: Dict[str, str]
1215
+ expected_headers: dict[str, str]
1216
1216
  marks: Marks = ()
1217
1217
 
1218
1218
  @property
@@ -1236,7 +1236,7 @@ class PartialSubmitHeaderCase(DataCase):
1236
1236
  @pytest.mark.anyio
1237
1237
  async def test_farmer_additional_headers_on_partial_submit(
1238
1238
  mocker: MockerFixture,
1239
- farmer_one_harvester: Tuple[List[HarvesterService], FarmerService, BlockTools],
1239
+ farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
1240
1240
  case: PartialSubmitHeaderCase,
1241
1241
  ) -> None:
1242
1242
  _, farmer_service, _ = farmer_one_harvester