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
@@ -4,7 +4,7 @@ import dataclasses
4
4
  import logging
5
5
  import time
6
6
  from collections import deque
7
- from typing import TYPE_CHECKING, Any, Deque, Dict, List, Optional, Set, Tuple, Union
7
+ from typing import TYPE_CHECKING, Any, Optional, Union
8
8
 
9
9
  from typing_extensions import Literal
10
10
 
@@ -72,20 +72,20 @@ class TradeManager:
72
72
  {
73
73
  "coin": bytes
74
74
  "parent_spend": bytes
75
- "siblings": List[bytes] # other coins of the same type being offered
76
- "sibling_spends": List[bytes] # The parent spends for the siblings
77
- "sibling_puzzles": List[Program] # The inner puzzles of the siblings (always OFFER_MOD)
78
- "sibling_solutions": List[Program] # The inner solution of the siblings
75
+ "siblings": list[bytes] # other coins of the same type being offered
76
+ "sibling_spends": list[bytes] # The parent spends for the siblings
77
+ "sibling_puzzles": list[Program] # The inner puzzles of the siblings (always OFFER_MOD)
78
+ "sibling_solutions": list[Program] # The inner solution of the siblings
79
79
  }
80
80
  )
81
81
 
82
82
  Wallet:
83
83
  - Segments in this code that call general wallet methods are highlighted by comments: # ATTENTION: new wallets
84
84
  - To be able to be traded, a wallet must implement these methods on itself:
85
- - generate_signed_transaction(...) -> List[TransactionRecord] (See cat_wallet.py for full API)
85
+ - generate_signed_transaction(...) -> list[TransactionRecord] (See cat_wallet.py for full API)
86
86
  - convert_puzzle_hash(puzzle_hash: bytes32) -> bytes32 # Converts a puzzlehash from outer to inner puzzle
87
87
  - get_puzzle_info(asset_id: bytes32) -> PuzzleInfo
88
- - get_coins_to_offer(asset_id: bytes32, amount: uint64) -> Set[Coin]
88
+ - get_coins_to_offer(asset_id: bytes32, amount: uint64) -> set[Coin]
89
89
  - If you would like assets from your wallet to be referenced with just a wallet ID, you must also implement:
90
90
  - get_asset_id() -> bytes32
91
91
  - Finally, you must make sure that your wallet will respond appropriately when these WSM methods are called:
@@ -97,7 +97,7 @@ class TradeManager:
97
97
  wallet_state_manager: WalletStateManager
98
98
  log: logging.Logger
99
99
  trade_store: TradeStore
100
- most_recently_deserialized_trade: Optional[Tuple[bytes32, Offer]]
100
+ most_recently_deserialized_trade: Optional[tuple[bytes32, Offer]]
101
101
 
102
102
  @staticmethod
103
103
  async def create(
@@ -116,13 +116,13 @@ class TradeManager:
116
116
  self.most_recently_deserialized_trade = None
117
117
  return self
118
118
 
119
- async def get_offers_with_status(self, status: TradeStatus) -> List[TradeRecord]:
119
+ async def get_offers_with_status(self, status: TradeStatus) -> list[TradeRecord]:
120
120
  records = await self.trade_store.get_trade_record_with_status(status)
121
121
  return records
122
122
 
123
123
  async def get_coins_of_interest(
124
124
  self,
125
- ) -> Set[bytes32]:
125
+ ) -> set[bytes32]:
126
126
  """
127
127
  Returns list of coins we want to check if they are included in filter,
128
128
  These will include coins that belong to us and coins that that on other side of treade
@@ -132,14 +132,15 @@ class TradeManager:
132
132
  )
133
133
  return coin_ids
134
134
 
135
- async def get_trade_by_coin(self, coin: Coin) -> Optional[TradeRecord]:
135
+ async def get_trades_by_coin(self, coin: Coin) -> list[TradeRecord]:
136
136
  all_trades = await self.get_all_trades()
137
+ trades_by_coin = []
137
138
  for trade in all_trades:
138
139
  if trade.status == TradeStatus.CANCELLED.value:
139
140
  continue
140
141
  if coin in trade.coins_of_interest:
141
- return trade
142
- return None
142
+ trades_by_coin.append(trade)
143
+ return trades_by_coin
143
144
 
144
145
  async def coins_of_interest_farmed(
145
146
  self, coin_state: CoinState, fork_height: Optional[uint32], peer: WSChiaConnection
@@ -151,64 +152,65 @@ class TradeManager:
151
152
  If our coins got farmed but coins from other side didn't, we successfully canceled trade by spending inputs.
152
153
  """
153
154
  self.log.info(f"coins_of_interest_farmed: {coin_state}")
154
- trade = await self.get_trade_by_coin(coin_state.coin)
155
- if trade is None:
156
- self.log.error(f"Coin: {coin_state.coin}, not in any trade")
157
- return
158
- if coin_state.spent_height is None:
159
- self.log.error(f"Coin: {coin_state.coin}, has not been spent so trade can remain valid")
160
- # Then let's filter the offer into coins that WE offered
161
- if (
162
- self.most_recently_deserialized_trade is not None
163
- and trade.trade_id == self.most_recently_deserialized_trade[0]
164
- ):
165
- offer = self.most_recently_deserialized_trade[1]
166
- else:
167
- offer = Offer.from_bytes(trade.offer)
168
- self.most_recently_deserialized_trade = (trade.trade_id, offer)
169
- primary_coin_ids = [c.name() for c in offer.removals()]
170
- # TODO: Add `WalletCoinStore.get_coins`.
171
- result = await self.wallet_state_manager.coin_store.get_coin_records(
172
- coin_id_filter=HashFilter.include(primary_coin_ids)
173
- )
174
- our_primary_coins: List[Coin] = [cr.coin for cr in result.records]
175
- our_additions: List[Coin] = list(
176
- filter(lambda c: offer.get_root_removal(c) in our_primary_coins, offer.additions())
177
- )
178
- our_addition_ids: List[bytes32] = [c.name() for c in our_additions]
179
-
180
- # And get all relevant coin states
181
- coin_states = await self.wallet_state_manager.wallet_node.get_coin_state(
182
- our_addition_ids,
183
- peer=peer,
184
- fork_height=fork_height,
185
- )
186
- assert coin_states is not None
187
- coin_state_names: List[bytes32] = [cs.coin.name() for cs in coin_states]
188
- # If any of our settlement_payments were spent, this offer was a success!
189
- if set(our_addition_ids) == set(coin_state_names):
190
- height = coin_state.spent_height
191
- assert height is not None
192
- await self.trade_store.set_status(trade.trade_id, TradeStatus.CONFIRMED, index=height)
193
- tx_records: List[TransactionRecord] = await self.calculate_tx_records_for_offer(offer, False)
194
- for tx in tx_records:
195
- if TradeStatus(trade.status) == TradeStatus.PENDING_ACCEPT:
196
- await self.wallet_state_manager.add_transaction(
197
- dataclasses.replace(tx, confirmed_at_height=height, confirmed=True)
198
- )
155
+ trades = await self.get_trades_by_coin(coin_state.coin)
156
+ for trade in trades:
157
+ if trade is None:
158
+ self.log.error(f"Coin: {coin_state.coin}, not in any trade")
159
+ continue
160
+ if coin_state.spent_height is None:
161
+ self.log.error(f"Coin: {coin_state.coin}, has not been spent so trade can remain valid")
162
+ # Then let's filter the offer into coins that WE offered
163
+ if (
164
+ self.most_recently_deserialized_trade is not None
165
+ and trade.trade_id == self.most_recently_deserialized_trade[0]
166
+ ):
167
+ offer = self.most_recently_deserialized_trade[1]
168
+ else:
169
+ offer = Offer.from_bytes(trade.offer)
170
+ self.most_recently_deserialized_trade = (trade.trade_id, offer)
171
+ primary_coin_ids = [c.name() for c in offer.removals()]
172
+ # TODO: Add `WalletCoinStore.get_coins`.
173
+ result = await self.wallet_state_manager.coin_store.get_coin_records(
174
+ coin_id_filter=HashFilter.include(primary_coin_ids)
175
+ )
176
+ our_primary_coins: list[Coin] = [cr.coin for cr in result.records]
177
+ our_additions: list[Coin] = list(
178
+ filter(lambda c: offer.get_root_removal(c) in our_primary_coins, offer.additions())
179
+ )
180
+ our_addition_ids: list[bytes32] = [c.name() for c in our_additions]
199
181
 
200
- self.log.info(f"Trade with id: {trade.trade_id} confirmed at height: {height}")
201
- else:
202
- # In any other scenario this trade failed
203
- await self.wallet_state_manager.delete_trade_transactions(trade.trade_id)
204
- if trade.status == TradeStatus.PENDING_CANCEL.value:
205
- await self.trade_store.set_status(trade.trade_id, TradeStatus.CANCELLED)
206
- self.log.info(f"Trade with id: {trade.trade_id} canceled")
207
- elif trade.status == TradeStatus.PENDING_CONFIRM.value:
208
- await self.trade_store.set_status(trade.trade_id, TradeStatus.FAILED)
209
- self.log.warning(f"Trade with id: {trade.trade_id} failed")
182
+ # And get all relevant coin states
183
+ coin_states = await self.wallet_state_manager.wallet_node.get_coin_state(
184
+ our_addition_ids,
185
+ peer=peer,
186
+ fork_height=fork_height,
187
+ )
188
+ assert coin_states is not None
189
+ coin_state_names: list[bytes32] = [cs.coin.name() for cs in coin_states]
190
+ # If any of our settlement_payments were spent, this offer was a success!
191
+ if set(our_addition_ids) == set(coin_state_names):
192
+ height = coin_state.spent_height
193
+ assert height is not None
194
+ await self.trade_store.set_status(trade.trade_id, TradeStatus.CONFIRMED, index=height)
195
+ tx_records: list[TransactionRecord] = await self.calculate_tx_records_for_offer(offer, False)
196
+ for tx in tx_records:
197
+ if TradeStatus(trade.status) == TradeStatus.PENDING_ACCEPT:
198
+ await self.wallet_state_manager.add_transaction(
199
+ dataclasses.replace(tx, confirmed_at_height=height, confirmed=True)
200
+ )
210
201
 
211
- async def get_locked_coins(self) -> Dict[bytes32, WalletCoinRecord]:
202
+ self.log.info(f"Trade with id: {trade.trade_id} confirmed at height: {height}")
203
+ else:
204
+ # In any other scenario this trade failed
205
+ await self.wallet_state_manager.delete_trade_transactions(trade.trade_id)
206
+ if trade.status == TradeStatus.PENDING_CANCEL.value:
207
+ await self.trade_store.set_status(trade.trade_id, TradeStatus.CANCELLED)
208
+ self.log.info(f"Trade with id: {trade.trade_id} canceled")
209
+ elif trade.status == TradeStatus.PENDING_CONFIRM.value:
210
+ await self.trade_store.set_status(trade.trade_id, TradeStatus.FAILED)
211
+ self.log.warning(f"Trade with id: {trade.trade_id} failed")
212
+
213
+ async def get_locked_coins(self) -> dict[bytes32, WalletCoinRecord]:
212
214
  """Returns a dictionary of confirmed coins that are locked by a trade."""
213
215
  all_pending = []
214
216
  pending_accept = await self.get_offers_with_status(TradeStatus.PENDING_ACCEPT)
@@ -230,8 +232,8 @@ class TradeManager:
230
232
  )
231
233
  ).coin_id_to_record
232
234
 
233
- async def get_all_trades(self) -> List[TradeRecord]:
234
- all: List[TradeRecord] = await self.trade_store.get_all_trades()
235
+ async def get_all_trades(self) -> list[TradeRecord]:
236
+ all: list[TradeRecord] = await self.trade_store.get_all_trades()
235
237
  return all
236
238
 
237
239
  async def get_trade_by_id(self, trade_id: bytes32) -> Optional[TradeRecord]:
@@ -244,22 +246,22 @@ class TradeManager:
244
246
 
245
247
  async def cancel_pending_offers(
246
248
  self,
247
- trades: List[bytes32],
249
+ trade_ids: list[bytes32],
248
250
  action_scope: WalletActionScope,
249
251
  fee: uint64 = uint64(0),
250
252
  secure: bool = True, # Cancel with a transaction on chain
251
- trade_cache: Dict[bytes32, TradeRecord] = {}, # Optional pre-fetched trade records for optimization
252
- extra_conditions: Tuple[Condition, ...] = tuple(),
253
+ trade_cache: dict[bytes32, TradeRecord] = {}, # Optional pre-fetched trade records for optimization
254
+ extra_conditions: tuple[Condition, ...] = tuple(),
253
255
  ) -> None:
254
256
  """This will create a transaction that includes coins that were offered"""
255
257
 
256
258
  # Need to do some pre-figuring of announcements that will be need to be made
257
- announcement_nonce: bytes32 = std_hash(b"".join(trades))
258
- trade_records: List[TradeRecord] = []
259
- all_cancellation_coins: List[List[Coin]] = []
260
- announcement_creations: Deque[CreateCoinAnnouncement] = deque()
261
- announcement_assertions: Deque[AssertCoinAnnouncement] = deque()
262
- for trade_id in trades:
259
+ announcement_nonce: bytes32 = std_hash(b"".join(trade_ids))
260
+ trade_records: list[TradeRecord] = []
261
+ all_cancellation_coins: list[list[Coin]] = []
262
+ announcement_creations: deque[CreateCoinAnnouncement] = deque()
263
+ announcement_assertions: deque[AssertCoinAnnouncement] = deque()
264
+ for trade_id in trade_ids:
263
265
  if trade_id in trade_cache:
264
266
  trade = trade_cache[trade_id]
265
267
  else:
@@ -282,7 +284,7 @@ class TradeManager:
282
284
  # Make every coin assert the announcement from the one before them
283
285
  announcement_assertions.rotate(1)
284
286
 
285
- all_txs: List[TransactionRecord] = []
287
+ all_txs: list[TransactionRecord] = []
286
288
  fee_to_pay: uint64 = fee
287
289
  for trade, cancellation_coins in zip(trade_records, all_cancellation_coins):
288
290
  self.log.info(f"Secure-Cancel pending offer with id trade_id {trade.trade_id.hex()}")
@@ -292,8 +294,9 @@ class TradeManager:
292
294
  await self.trade_store.set_status(trade.trade_id, TradeStatus.CANCELLED)
293
295
  continue
294
296
 
295
- cancellation_additions: List[Coin] = []
297
+ cancellation_additions: list[Coin] = []
296
298
  valid_times: ConditionValidTimes = parse_timelock_info(extra_conditions)
299
+ trades_to_cancel: list[TradeRecord] = []
297
300
  for coin in cancellation_coins:
298
301
  wallet = await self.wallet_state_manager.get_wallet_for_coin(coin.name())
299
302
 
@@ -306,7 +309,7 @@ class TradeManager:
306
309
  )
307
310
 
308
311
  if len(trade_records) > 1 or len(cancellation_coins) > 1:
309
- announcement_conditions: Tuple[Condition, ...] = (
312
+ announcement_conditions: tuple[Condition, ...] = (
310
313
  announcement_creations.popleft(),
311
314
  announcement_assertions.popleft(),
312
315
  )
@@ -318,7 +321,7 @@ class TradeManager:
318
321
  if wallet.type() == WalletType.STANDARD_WALLET:
319
322
  assert isinstance(wallet, Wallet)
320
323
  if fee_to_pay > coin.amount:
321
- selected_coins: Set[Coin] = await wallet.select_coins(
324
+ selected_coins: set[Coin] = await wallet.select_coins(
322
325
  uint64(fee_to_pay - coin.amount),
323
326
  action_scope,
324
327
  )
@@ -391,7 +394,14 @@ class TradeManager:
391
394
  )
392
395
  all_txs.append(incoming_tx)
393
396
 
397
+ # The statuses of trades which offer cancellation coin needs to be set to `PENDING_CANCEL`
398
+ trades_to_cancel.extend(await self.get_trades_by_coin(coin))
399
+
394
400
  await self.trade_store.set_status(trade.trade_id, TradeStatus.PENDING_CANCEL)
401
+ self.log.info(f"Cancelling trade: {trade.trade_id}")
402
+ for t in trades_to_cancel:
403
+ await self.trade_store.set_status(t.trade_id, TradeStatus.PENDING_CANCEL)
404
+ self.log.info(f"Cancelling trade: {t.trade_id} along with {trade.trade_id}")
395
405
 
396
406
  if secure:
397
407
  async with action_scope.use() as interface:
@@ -415,9 +425,9 @@ class TradeManager:
415
425
  await self.trade_store.add_trade_record(trade, offer_name)
416
426
 
417
427
  # We want to subscribe to the coin IDs of all coins that are not the ephemeral offer coins
418
- offered_coins: Set[Coin] = {value for values in offer.get_offered_coins().values() for value in values}
419
- non_offer_additions: Set[Coin] = set(offer.additions()) ^ offered_coins
420
- non_offer_removals: Set[Coin] = set(offer.removals()) ^ offered_coins
428
+ offered_coins: set[Coin] = {value for values in offer.get_offered_coins().values() for value in values}
429
+ non_offer_additions: set[Coin] = set(offer.additions()) ^ offered_coins
430
+ non_offer_removals: set[Coin] = set(offer.removals()) ^ offered_coins
421
431
  await self.wallet_state_manager.add_interested_coin_ids(
422
432
  [coin.name() for coin in (*non_offer_removals, *non_offer_additions)]
423
433
  )
@@ -426,15 +436,15 @@ class TradeManager:
426
436
 
427
437
  async def create_offer_for_ids(
428
438
  self,
429
- offer: Dict[Union[int, bytes32], int],
439
+ offer: dict[Union[int, bytes32], int],
430
440
  action_scope: WalletActionScope,
431
- driver_dict: Optional[Dict[bytes32, PuzzleInfo]] = None,
441
+ driver_dict: Optional[dict[bytes32, PuzzleInfo]] = None,
432
442
  solver: Optional[Solver] = None,
433
443
  fee: uint64 = uint64(0),
434
444
  validate_only: bool = False,
435
- extra_conditions: Tuple[Condition, ...] = tuple(),
445
+ extra_conditions: tuple[Condition, ...] = tuple(),
436
446
  taking: bool = False,
437
- ) -> Union[Tuple[Literal[True], TradeRecord, None], Tuple[Literal[False], None, str]]:
447
+ ) -> Union[tuple[Literal[True], TradeRecord, None], tuple[Literal[False], None, str]]:
438
448
  if driver_dict is None:
439
449
  driver_dict = {}
440
450
  if solver is None:
@@ -476,14 +486,14 @@ class TradeManager:
476
486
 
477
487
  async def _create_offer_for_ids(
478
488
  self,
479
- offer_dict: Dict[Union[int, bytes32], int],
489
+ offer_dict: dict[Union[int, bytes32], int],
480
490
  action_scope: WalletActionScope,
481
- driver_dict: Optional[Dict[bytes32, PuzzleInfo]] = None,
491
+ driver_dict: Optional[dict[bytes32, PuzzleInfo]] = None,
482
492
  solver: Optional[Solver] = None,
483
493
  fee: uint64 = uint64(0),
484
- extra_conditions: Tuple[Condition, ...] = tuple(),
494
+ extra_conditions: tuple[Condition, ...] = tuple(),
485
495
  taking: bool = False,
486
- ) -> Union[Tuple[Literal[True], Offer, None], Tuple[Literal[False], None, str]]:
496
+ ) -> Union[tuple[Literal[True], Offer, None], tuple[Literal[False], None, str]]:
487
497
  """
488
498
  Offer is dictionary of wallet ids and amount
489
499
  """
@@ -492,23 +502,28 @@ class TradeManager:
492
502
  if solver is None:
493
503
  solver = Solver({})
494
504
  try:
495
- coins_to_offer: Dict[Union[int, bytes32], Set[Coin]] = {}
496
- requested_payments: Dict[Optional[bytes32], List[Payment]] = {}
497
- offer_dict_no_ints: Dict[Optional[bytes32], int] = {}
505
+ coins_to_offer: dict[Union[int, bytes32], set[Coin]] = {}
506
+ requested_payments: dict[Optional[bytes32], list[Payment]] = {}
507
+ offer_dict_no_ints: dict[Optional[bytes32], int] = {}
498
508
  for id, amount in offer_dict.items():
499
509
  asset_id: Optional[bytes32] = None
500
510
  # asset_id can either be none if asset is XCH or
501
511
  # bytes32 if another asset (e.g. NFT, CAT)
502
512
  if amount > 0:
503
513
  # this is what we are receiving in the trade
504
- memos: List[bytes] = []
514
+ memos: list[bytes] = []
505
515
  if isinstance(id, int):
506
516
  wallet_id = uint32(id)
507
517
  wallet = self.wallet_state_manager.wallets.get(wallet_id)
508
518
  assert isinstance(wallet, (CATWallet, Wallet))
509
- p2_ph: bytes32 = await wallet.get_puzzle_hash(
510
- new=not action_scope.config.tx_config.reuse_puzhash
511
- )
519
+ if isinstance(wallet, Wallet):
520
+ p2_ph: bytes32 = await wallet.get_puzzle_hash(
521
+ new=not action_scope.config.tx_config.reuse_puzhash
522
+ )
523
+ else:
524
+ p2_ph = await wallet.standard_wallet.get_puzzle_hash(
525
+ new=not action_scope.config.tx_config.reuse_puzhash
526
+ )
512
527
  if wallet.type() != WalletType.STANDARD_WALLET:
513
528
  if callable(getattr(wallet, "get_asset_id", None)): # ATTENTION: new wallets
514
529
  assert isinstance(wallet, CATWallet)
@@ -601,13 +616,13 @@ class TradeManager:
601
616
  if potential_special_offer is not None:
602
617
  return True, potential_special_offer, None
603
618
 
604
- all_coins: List[Coin] = [c for coins in coins_to_offer.values() for c in coins]
605
- notarized_payments: Dict[Optional[bytes32], List[NotarizedPayment]] = Offer.notarize_payments(
619
+ all_coins: list[Coin] = [c for coins in coins_to_offer.values() for c in coins]
620
+ notarized_payments: dict[Optional[bytes32], list[NotarizedPayment]] = Offer.notarize_payments(
606
621
  requested_payments, all_coins
607
622
  )
608
623
  announcements_to_assert = Offer.calculate_announcements(notarized_payments, driver_dict)
609
624
 
610
- all_transactions: List[TransactionRecord] = []
625
+ all_transactions: list[TransactionRecord] = []
611
626
  fee_left_to_pay: uint64 = fee
612
627
  # The access of the sorted keys here makes sure we create the XCH transaction first to make sure we pay fee
613
628
  # with the XCH side of the offer and don't create an extra fee transaction in other wallets.
@@ -689,9 +704,9 @@ class TradeManager:
689
704
  await wsm.create_wallet_for_puzzle_info(offer.driver_dict[key])
690
705
 
691
706
  async def check_offer_validity(self, offer: Offer, peer: WSChiaConnection) -> bool:
692
- all_removals: List[Coin] = offer.removals()
693
- all_removal_names: List[bytes32] = [c.name() for c in all_removals]
694
- non_ephemeral_removals: List[Coin] = list(
707
+ all_removals: list[Coin] = offer.removals()
708
+ all_removal_names: list[bytes32] = [c.name() for c in all_removals]
709
+ non_ephemeral_removals: list[Coin] = list(
695
710
  filter(lambda c: c.parent_coin_info not in all_removal_names, all_removals)
696
711
  )
697
712
  coin_states = await self.wallet_state_manager.wallet_node.get_coin_state(
@@ -700,27 +715,27 @@ class TradeManager:
700
715
 
701
716
  return len(coin_states) == len(non_ephemeral_removals) and all([cs.spent_height is None for cs in coin_states])
702
717
 
703
- async def calculate_tx_records_for_offer(self, offer: Offer, validate: bool) -> List[TransactionRecord]:
718
+ async def calculate_tx_records_for_offer(self, offer: Offer, validate: bool) -> list[TransactionRecord]:
704
719
  if validate:
705
720
  final_spend_bundle: WalletSpendBundle = offer.to_valid_spend()
706
- hint_dict: Dict[bytes32, bytes32] = {}
707
- additions_dict: Dict[bytes32, Coin] = {}
721
+ hint_dict: dict[bytes32, bytes32] = {}
722
+ additions_dict: dict[bytes32, Coin] = {}
708
723
  for hinted_coins, _ in (
709
724
  compute_spend_hints_and_additions(spend) for spend in final_spend_bundle.coin_spends
710
725
  ):
711
726
  hint_dict.update({id: hc.hint for id, hc in hinted_coins.items() if hc.hint is not None})
712
727
  additions_dict.update({id: hc.coin for id, hc in hinted_coins.items()})
713
- all_additions: List[Coin] = list(a for a in additions_dict.values())
728
+ all_additions: list[Coin] = list(a for a in additions_dict.values())
714
729
  else:
715
730
  final_spend_bundle = offer._bundle
716
731
  hint_dict = offer.hints()
717
732
  all_additions = offer.additions()
718
733
 
719
- settlement_coins: List[Coin] = [c for coins in offer.get_offered_coins().values() for c in coins]
720
- settlement_coin_ids: List[bytes32] = [c.name() for c in settlement_coins]
734
+ settlement_coins: list[Coin] = [c for coins in offer.get_offered_coins().values() for c in coins]
735
+ settlement_coin_ids: list[bytes32] = [c.name() for c in settlement_coins]
721
736
 
722
- removals: List[Coin] = final_spend_bundle.removals()
723
- additions: List[Coin] = list(a for a in all_additions if a not in removals)
737
+ removals: list[Coin] = final_spend_bundle.removals()
738
+ additions: list[Coin] = list(a for a in all_additions if a not in removals)
724
739
  valid_times: ConditionValidTimes = parse_timelock_info(
725
740
  parse_conditions_non_consensus(
726
741
  condition
@@ -733,7 +748,7 @@ class TradeManager:
733
748
 
734
749
  txs = []
735
750
 
736
- addition_dict: Dict[uint32, List[Coin]] = {}
751
+ addition_dict: dict[uint32, list[Coin]] = {}
737
752
  for addition in additions:
738
753
  wallet_identifier = await self.wallet_state_manager.get_wallet_identifier_for_coin(
739
754
  addition,
@@ -770,7 +785,7 @@ class TradeManager:
770
785
  addition_dict[wallet_identifier.id].append(addition)
771
786
 
772
787
  # While we want additions to show up as separate records, removals of the same wallet should show as one
773
- removal_dict: Dict[uint32, List[Coin]] = {}
788
+ removal_dict: dict[uint32, list[Coin]] = {}
774
789
  for removal in removals:
775
790
  wallet_identifier = await self.wallet_state_manager.get_wallet_identifier_for_coin(
776
791
  removal,
@@ -780,7 +795,7 @@ class TradeManager:
780
795
  removal_dict.setdefault(wallet_identifier.id, [])
781
796
  removal_dict[wallet_identifier.id].append(removal)
782
797
 
783
- all_removals: List[bytes32] = [r.name() for removals in removal_dict.values() for r in removals]
798
+ all_removals: list[bytes32] = [r.name() for removals in removal_dict.values() for r in removals]
784
799
 
785
800
  for wid, grouped_removals in removal_dict.items():
786
801
  wallet = self.wallet_state_manager.wallets[wid]
@@ -788,12 +803,12 @@ class TradeManager:
788
803
  removal_tree_hash = Program.to([coin_as_list(rem) for rem in grouped_removals]).get_tree_hash()
789
804
  # We also need to calculate the sent amount
790
805
  removed: int = sum(c.amount for c in grouped_removals)
791
- removed_ids: List[bytes32] = [c.name() for c in grouped_removals]
792
- all_additions_from_grouped_removals: List[Coin] = [
806
+ removed_ids: list[bytes32] = [c.name() for c in grouped_removals]
807
+ all_additions_from_grouped_removals: list[Coin] = [
793
808
  c for c in all_additions if c.parent_coin_info in removed_ids
794
809
  ]
795
- potential_change_coins: List[Coin] = addition_dict[wid] if wid in addition_dict else []
796
- change_coins: List[Coin] = [c for c in potential_change_coins if c.parent_coin_info in all_removals]
810
+ potential_change_coins: list[Coin] = addition_dict[wid] if wid in addition_dict else []
811
+ change_coins: list[Coin] = [c for c in potential_change_coins if c.parent_coin_info in all_removals]
797
812
  change_amount: int = sum(c.amount for c in change_coins)
798
813
  sent_amount: int = (
799
814
  removed
@@ -835,12 +850,12 @@ class TradeManager:
835
850
  action_scope: WalletActionScope,
836
851
  solver: Optional[Solver] = None,
837
852
  fee: uint64 = uint64(0),
838
- extra_conditions: Tuple[Condition, ...] = tuple(),
853
+ extra_conditions: tuple[Condition, ...] = tuple(),
839
854
  ) -> TradeRecord:
840
855
  if solver is None:
841
856
  solver = Solver({})
842
- take_offer_dict: Dict[Union[bytes32, int], int] = {}
843
- arbitrage: Dict[Optional[bytes32], int] = offer.arbitrage()
857
+ take_offer_dict: dict[Union[bytes32, int], int] = {}
858
+ arbitrage: dict[Optional[bytes32], int] = offer.arbitrage()
844
859
 
845
860
  for asset_id, amount in arbitrage.items():
846
861
  if asset_id is None:
@@ -852,7 +867,7 @@ class TradeManager:
852
867
  wallet = await self.wallet_state_manager.get_wallet_for_asset_id(asset_id.hex())
853
868
  if wallet is None and amount < 0:
854
869
  raise ValueError(f"Do not have a wallet for asset ID: {asset_id} to fulfill offer")
855
- elif wallet is None or wallet.type() in [WalletType.NFT, WalletType.DATA_LAYER]:
870
+ elif wallet is None or wallet.type() in {WalletType.NFT, WalletType.DATA_LAYER}:
856
871
  key = asset_id
857
872
  else:
858
873
  key = int(wallet.id())
@@ -878,7 +893,7 @@ class TradeManager:
878
893
  if not result[0] or result[1] is None:
879
894
  raise ValueError(result[2])
880
895
 
881
- success, take_offer, error = result
896
+ _success, take_offer, _error = result
882
897
 
883
898
  complete_offer, valid_spend_solver = await self.check_for_final_modifications(
884
899
  Offer.aggregate([offer, take_offer]), solver, inner_action_scope
@@ -890,7 +905,7 @@ class TradeManager:
890
905
  )
891
906
  await self.maybe_create_wallets_for_offer(complete_offer)
892
907
 
893
- tx_records: List[TransactionRecord] = await self.calculate_tx_records_for_offer(complete_offer, True)
908
+ tx_records: list[TransactionRecord] = await self.calculate_tx_records_for_offer(complete_offer, True)
894
909
 
895
910
  trade_record: TradeRecord = TradeRecord(
896
911
  confirmed_at_index=uint32(0),
@@ -917,12 +932,12 @@ class TradeManager:
917
932
 
918
933
  async def check_for_special_offer_making(
919
934
  self,
920
- offer_dict: Dict[Optional[bytes32], int],
921
- driver_dict: Dict[bytes32, PuzzleInfo],
935
+ offer_dict: dict[Optional[bytes32], int],
936
+ driver_dict: dict[bytes32, PuzzleInfo],
922
937
  action_scope: WalletActionScope,
923
938
  solver: Solver,
924
939
  fee: uint64 = uint64(0),
925
- extra_conditions: Tuple[Condition, ...] = tuple(),
940
+ extra_conditions: tuple[Condition, ...] = tuple(),
926
941
  ) -> Optional[Offer]:
927
942
  for puzzle_info in driver_dict.values():
928
943
  if (
@@ -974,7 +989,7 @@ class TradeManager:
974
989
  return True
975
990
  return False
976
991
 
977
- async def get_offer_summary(self, offer: Offer) -> Dict[str, Any]:
992
+ async def get_offer_summary(self, offer: Offer) -> dict[str, Any]:
978
993
  for puzzle_info in offer.driver_dict.values():
979
994
  if (
980
995
  puzzle_info.check_type(
@@ -999,18 +1014,18 @@ class TradeManager:
999
1014
  k: v
1000
1015
  for k, v in valid_times.to_json_dict().items()
1001
1016
  if k
1002
- not in (
1017
+ not in {
1003
1018
  "max_secs_after_created",
1004
1019
  "min_secs_since_created",
1005
1020
  "max_blocks_after_created",
1006
1021
  "min_blocks_since_created",
1007
- )
1022
+ }
1008
1023
  },
1009
1024
  }
1010
1025
 
1011
1026
  async def check_for_final_modifications(
1012
1027
  self, offer: Offer, solver: Solver, action_scope: WalletActionScope
1013
- ) -> Tuple[Offer, Solver]:
1028
+ ) -> tuple[Offer, Solver]:
1014
1029
  for puzzle_info in offer.driver_dict.values():
1015
1030
  if (
1016
1031
  puzzle_info.check_type(
@@ -1033,17 +1048,16 @@ class TradeManager:
1033
1048
  if WalletType(wallet.type()) == WalletType.VC:
1034
1049
  assert isinstance(wallet, VCWallet)
1035
1050
  return await wallet.add_vc_authorization(offer, solver, action_scope)
1036
- else:
1037
- raise ValueError("No VCs to approve CR-CATs with") # pragma: no cover
1051
+ raise ValueError("No VCs to approve CR-CATs with") # pragma: no cover
1038
1052
 
1039
1053
  return offer, Solver({})
1040
1054
 
1041
1055
  async def check_for_requested_payment_modifications(
1042
1056
  self,
1043
- requested_payments: Dict[Optional[bytes32], List[Payment]],
1044
- driver_dict: Dict[bytes32, PuzzleInfo],
1057
+ requested_payments: dict[Optional[bytes32], list[Payment]],
1058
+ driver_dict: dict[bytes32, PuzzleInfo],
1045
1059
  taking: bool,
1046
- ) -> Dict[Optional[bytes32], List[Payment]]:
1060
+ ) -> dict[Optional[bytes32], list[Payment]]:
1047
1061
  # This function exclusively deals with CR-CATs for now
1048
1062
  if not taking:
1049
1063
  for asset_id, puzzle_info in driver_dict.items():
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Any, Dict, List, Optional, Tuple, Type, TypeVar
4
+ from typing import Any, Optional, TypeVar
5
5
 
6
6
  from chia.types.blockchain_format.coin import Coin
7
7
  from chia.types.blockchain_format.sized_bytes import bytes32
@@ -28,12 +28,12 @@ class TradeRecordOld(Streamable):
28
28
  sent: uint32
29
29
  offer: bytes
30
30
  taken_offer: Optional[bytes]
31
- coins_of_interest: List[Coin]
31
+ coins_of_interest: list[Coin]
32
32
  trade_id: bytes32
33
33
  status: uint32 # TradeStatus, enum not streamable
34
- sent_to: List[Tuple[str, uint8, Optional[str]]] # MempoolSubmissionStatus.status enum not streamable
34
+ sent_to: list[tuple[str, uint8, Optional[str]]] # MempoolSubmissionStatus.status enum not streamable
35
35
 
36
- def to_json_dict_convenience(self) -> Dict[str, Any]:
36
+ def to_json_dict_convenience(self) -> dict[str, Any]:
37
37
  formatted = self.to_json_dict()
38
38
  formatted["status"] = TradeStatus(self.status).name
39
39
  offer_to_summarize: bytes = self.offer if self.taken_offer is None else self.taken_offer
@@ -51,7 +51,7 @@ class TradeRecordOld(Streamable):
51
51
 
52
52
  @classmethod
53
53
  def from_json_dict_convenience(
54
- cls: Type[_T_TradeRecord], record: Dict[str, Any], offer: str = ""
54
+ cls: type[_T_TradeRecord], record: dict[str, Any], offer: str = ""
55
55
  ) -> _T_TradeRecord:
56
56
  new_record = record.copy()
57
57
  new_record["status"] = TradeStatus[record["status"]].value