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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/cmds/wallet_funcs.py CHANGED
@@ -6,9 +6,10 @@ import os
6
6
  import pathlib
7
7
  import sys
8
8
  import time
9
+ from collections.abc import Awaitable, Sequence
9
10
  from datetime import datetime, timezone
10
11
  from decimal import Decimal
11
- from typing import Any, Awaitable, Callable, Dict, List, Optional, Sequence, Tuple, Union
12
+ from typing import Any, Callable, Optional, Union
12
13
 
13
14
  from chia.cmds.cmds_util import (
14
15
  CMDTXConfigLoader,
@@ -20,7 +21,18 @@ from chia.cmds.cmds_util import (
20
21
  from chia.cmds.param_types import CliAddress, CliAmount
21
22
  from chia.cmds.peer_funcs import print_connections
22
23
  from chia.cmds.units import units
23
- from chia.rpc.wallet_request_types import CATSpendResponse, GetNotifications, SendTransactionResponse
24
+ from chia.rpc.wallet_request_types import (
25
+ CATSpendResponse,
26
+ GetNotifications,
27
+ SendTransactionResponse,
28
+ VCAddProofs,
29
+ VCGet,
30
+ VCGetList,
31
+ VCGetProofsForRoot,
32
+ VCMint,
33
+ VCRevoke,
34
+ VCSpend,
35
+ )
24
36
  from chia.rpc.wallet_rpc_client import WalletRpcClient
25
37
  from chia.types.blockchain_format.sized_bytes import bytes32
26
38
  from chia.util.bech32m import bech32_decode, decode_puzzle_hash, encode_puzzle_hash
@@ -44,7 +56,7 @@ from chia.wallet.util.wallet_types import WalletType
44
56
  from chia.wallet.vc_wallet.vc_store import VCProofs
45
57
  from chia.wallet.wallet_coin_store import GetCoinRecords
46
58
 
47
- CATNameResolver = Callable[[bytes32], Awaitable[Optional[Tuple[Optional[uint32], str]]]]
59
+ CATNameResolver = Callable[[bytes32], Awaitable[Optional[tuple[Optional[uint32], str]]]]
48
60
 
49
61
  transaction_type_descriptions = {
50
62
  TransactionType.INCOMING_TX: "received",
@@ -69,7 +81,7 @@ def print_transaction(
69
81
  name: str,
70
82
  address_prefix: str,
71
83
  mojo_per_unit: int,
72
- coin_record: Optional[Dict[str, Any]] = None,
84
+ coin_record: Optional[dict[str, Any]] = None,
73
85
  ) -> None:
74
86
  if verbose:
75
87
  print(tx)
@@ -124,7 +136,7 @@ async def get_wallet_type(wallet_id: int, wallet_client: WalletRpcClient) -> Wal
124
136
 
125
137
 
126
138
  async def get_unit_name_for_wallet_id(
127
- config: Dict[str, Any],
139
+ config: dict[str, Any],
128
140
  wallet_type: WalletType,
129
141
  wallet_id: int,
130
142
  wallet_client: WalletRpcClient,
@@ -145,9 +157,9 @@ async def get_unit_name_for_wallet_id(
145
157
 
146
158
 
147
159
  async def get_transaction(
148
- *, wallet_rpc_port: Optional[int], fingerprint: Optional[int], tx_id: str, verbose: int
160
+ *, root_path: pathlib.Path, wallet_rpc_port: Optional[int], fingerprint: Optional[int], tx_id: str, verbose: int
149
161
  ) -> None:
150
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, config):
162
+ async with get_wallet_client(root_path, wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, config):
151
163
  transaction_id = bytes32.from_hexstr(tx_id)
152
164
  address_prefix = selected_network_address_prefix(config)
153
165
  tx: TransactionRecord = await wallet_client.get_transaction(transaction_id=transaction_id)
@@ -176,6 +188,7 @@ async def get_transaction(
176
188
 
177
189
  async def get_transactions(
178
190
  *,
191
+ root_path: pathlib.Path,
179
192
  wallet_rpc_port: Optional[int],
180
193
  fp: Optional[int],
181
194
  wallet_id: int,
@@ -187,7 +200,7 @@ async def get_transactions(
187
200
  reverse: bool,
188
201
  clawback: bool,
189
202
  ) -> None:
190
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
203
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, config):
191
204
  if paginate is None:
192
205
  paginate = sys.stdout.isatty()
193
206
  type_filter = (
@@ -197,7 +210,7 @@ async def get_transactions(
197
210
  [TransactionType.INCOMING_CLAWBACK_RECEIVE, TransactionType.INCOMING_CLAWBACK_SEND]
198
211
  )
199
212
  )
200
- txs: List[TransactionRecord] = await wallet_client.get_transactions(
213
+ txs: list[TransactionRecord] = await wallet_client.get_transactions(
201
214
  wallet_id, start=offset, end=(offset + limit), sort_key=sort_key, reverse=reverse, type_filter=type_filter
202
215
  )
203
216
 
@@ -224,7 +237,7 @@ async def get_transactions(
224
237
  for j in range(0, num_per_screen):
225
238
  if i + j + skipped >= len(txs):
226
239
  break
227
- coin_record: Optional[Dict[str, Any]] = None
240
+ coin_record: Optional[dict[str, Any]] = None
228
241
  if txs[i + j + skipped].type in CLAWBACK_INCOMING_TRANSACTION_TYPES:
229
242
  coin_records = await wallet_client.get_coin_records(
230
243
  GetCoinRecords(coin_id_filter=HashFilter.include([txs[i + j + skipped].additions[0].name()]))
@@ -260,6 +273,7 @@ def check_unusual_transaction(amount: uint64, fee: uint64) -> bool:
260
273
 
261
274
  async def send(
262
275
  *,
276
+ root_path: pathlib.Path,
263
277
  wallet_rpc_port: Optional[int],
264
278
  fp: Optional[int],
265
279
  wallet_id: int,
@@ -275,8 +289,8 @@ async def send(
275
289
  clawback_time_lock: int,
276
290
  push: bool,
277
291
  condition_valid_times: ConditionValidTimes,
278
- ) -> List[TransactionRecord]:
279
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
292
+ ) -> list[TransactionRecord]:
293
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
280
294
  if memo is None:
281
295
  memos = None
282
296
  else:
@@ -365,35 +379,43 @@ async def send(
365
379
  return res.transactions # pragma: no cover
366
380
 
367
381
 
368
- async def get_address(wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id: int, new_address: bool) -> None:
369
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
382
+ async def get_address(
383
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id: int, new_address: bool
384
+ ) -> None:
385
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
370
386
  res = await wallet_client.get_next_address(wallet_id, new_address)
371
387
  print(res)
372
388
 
373
389
 
374
- async def delete_unconfirmed_transactions(wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id: int) -> None:
375
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, _):
390
+ async def delete_unconfirmed_transactions(
391
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id: int
392
+ ) -> None:
393
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, _):
376
394
  await wallet_client.delete_unconfirmed_transactions(wallet_id)
377
395
  print(f"Successfully deleted all unconfirmed transactions for wallet id {wallet_id} on key {fingerprint}")
378
396
 
379
397
 
380
- async def get_derivation_index(wallet_rpc_port: Optional[int], fp: Optional[int]) -> None:
381
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, _, _):
398
+ async def get_derivation_index(root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int]) -> None:
399
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
382
400
  res = await wallet_client.get_current_derivation_index()
383
401
  print(f"Last derivation index: {res}")
384
402
 
385
403
 
386
- async def update_derivation_index(wallet_rpc_port: Optional[int], fp: Optional[int], index: int) -> None:
387
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, _, _):
404
+ async def update_derivation_index(
405
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], index: int
406
+ ) -> None:
407
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
388
408
  print("Updating derivation index... This may take a while.")
389
409
  res = await wallet_client.extend_derivation_index(index)
390
410
  print(f"Updated derivation index: {res}")
391
411
  print("Your balances may take a while to update.")
392
412
 
393
413
 
394
- async def add_token(wallet_rpc_port: Optional[int], fp: Optional[int], asset_id: bytes32, token_name: str) -> None:
395
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, _):
396
- existing_info: Optional[Tuple[Optional[uint32], str]] = await wallet_client.cat_asset_id_to_name(asset_id)
414
+ async def add_token(
415
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], asset_id: bytes32, token_name: str
416
+ ) -> None:
417
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, _):
418
+ existing_info: Optional[tuple[Optional[uint32], str]] = await wallet_client.cat_asset_id_to_name(asset_id)
397
419
  if existing_info is None or existing_info[0] is None:
398
420
  response = await wallet_client.create_wallet_for_existing_cat(asset_id)
399
421
  wallet_id = response["wallet_id"]
@@ -407,6 +429,7 @@ async def add_token(wallet_rpc_port: Optional[int], fp: Optional[int], asset_id:
407
429
 
408
430
  async def make_offer(
409
431
  *,
432
+ root_path: pathlib.Path,
410
433
  wallet_rpc_port: Optional[int],
411
434
  fp: Optional[int],
412
435
  fee: uint64,
@@ -416,15 +439,15 @@ async def make_offer(
416
439
  reuse_puzhash: Optional[bool],
417
440
  condition_valid_times: ConditionValidTimes,
418
441
  ) -> None:
419
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
442
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
420
443
  if offers == [] or requests == []:
421
444
  print("Not creating offer: Must be offering and requesting at least one asset")
422
445
  else:
423
- offer_dict: Dict[Union[uint32, str], int] = {}
424
- driver_dict: Dict[str, Any] = {}
425
- printable_dict: Dict[str, Tuple[str, int, int]] = {} # Dict[asset_name, Tuple[amount, unit, multiplier]]
426
- royalty_asset_dict: Dict[Any, Tuple[Any, uint16]] = {}
427
- fungible_asset_dict: Dict[Any, uint64] = {}
446
+ offer_dict: dict[Union[uint32, str], int] = {}
447
+ driver_dict: dict[str, Any] = {}
448
+ printable_dict: dict[str, tuple[str, int, int]] = {} # dict[asset_name, tuple[amount, unit, multiplier]]
449
+ royalty_asset_dict: dict[Any, tuple[Any, uint16]] = {}
450
+ fungible_asset_dict: dict[Any, uint64] = {}
428
451
  for item in [*offers, *requests]:
429
452
  name, amount = tuple(item.split(":")[0:2])
430
453
  try:
@@ -516,10 +539,10 @@ async def make_offer(
516
539
  print(f"Including Fees: {Decimal(fee) / units['chia']} XCH, {fee} mojos")
517
540
 
518
541
  if royalty_asset_dict != {}:
519
- royalty_summary: Dict[Any, List[Dict[str, Any]]] = await wallet_client.nft_calculate_royalties(
542
+ royalty_summary: dict[Any, list[dict[str, Any]]] = await wallet_client.nft_calculate_royalties(
520
543
  royalty_asset_dict, fungible_asset_dict
521
544
  )
522
- total_amounts_requested: Dict[Any, int] = {}
545
+ total_amounts_requested: dict[Any, int] = {}
523
546
  print()
524
547
  print("Royalties Summary:")
525
548
  for nft_id, summaries in royalty_summary.items():
@@ -574,7 +597,7 @@ def timestamp_to_time(timestamp: int) -> str:
574
597
 
575
598
 
576
599
  async def print_offer_summary(
577
- cat_name_resolver: CATNameResolver, sum_dict: Dict[str, int], has_fee: bool = False, network_xch: str = "XCH"
600
+ cat_name_resolver: CATNameResolver, sum_dict: dict[str, int], has_fee: bool = False, network_xch: str = "XCH"
578
601
  ) -> None:
579
602
  for asset_id, amount in sum_dict.items():
580
603
  description: str = ""
@@ -625,7 +648,7 @@ async def print_trade_record(record: TradeRecord, wallet_client: WalletRpcClient
625
648
  print("Summary:")
626
649
  offer = Offer.from_bytes(record.offer)
627
650
  offered, requested, _, _ = offer.summary()
628
- outbound_balances: Dict[str, int] = offer.get_pending_amounts()
651
+ outbound_balances: dict[str, int] = offer.get_pending_amounts()
629
652
  fees: Decimal = Decimal(offer.fees())
630
653
  cat_name_resolver = wallet_client.cat_asset_id_to_name
631
654
  print(" OFFERED:")
@@ -637,11 +660,11 @@ async def print_trade_record(record: TradeRecord, wallet_client: WalletRpcClient
637
660
  print(f"Included Fees: {fees / units['chia']} XCH, {fees} mojos")
638
661
  print("Timelock information:")
639
662
  if record.valid_times.min_time is not None:
640
- print(" - Not valid until " f"{format_timestamp_with_timezone(record.valid_times.min_time)}")
663
+ print(f" - Not valid until {format_timestamp_with_timezone(record.valid_times.min_time)}")
641
664
  if record.valid_times.min_height is not None:
642
665
  print(f" - Not valid until height {record.valid_times.min_height}")
643
666
  if record.valid_times.max_time is not None:
644
- print(" - Expires at " f"{format_timestamp_with_timezone(record.valid_times.max_time)} " "(+/- 10 min)")
667
+ print(f" - Expires at {format_timestamp_with_timezone(record.valid_times.max_time)} (+/- 10 min)")
645
668
  if record.valid_times.max_height is not None:
646
669
  print(f" - Expires at height {record.valid_times.max_height} (wait ~10 blocks after to be reorg safe)")
647
670
  print("---------------")
@@ -649,6 +672,7 @@ async def print_trade_record(record: TradeRecord, wallet_client: WalletRpcClient
649
672
 
650
673
  async def get_offers(
651
674
  *,
675
+ root_path: pathlib.Path,
652
676
  wallet_rpc_port: Optional[int],
653
677
  fp: Optional[int],
654
678
  offer_id: Optional[bytes32],
@@ -658,10 +682,11 @@ async def get_offers(
658
682
  include_completed: bool = False,
659
683
  summaries: bool = False,
660
684
  reverse: bool = False,
685
+ sort_by_relevance: bool = True,
661
686
  ) -> None:
662
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
687
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
663
688
  file_contents: bool = (filepath is not None) or summaries
664
- records: List[TradeRecord] = []
689
+ records: list[TradeRecord] = []
665
690
  if offer_id is None:
666
691
  batch_size: int = 10
667
692
  start: int = 0
@@ -669,9 +694,10 @@ async def get_offers(
669
694
 
670
695
  # Traverse offers page by page
671
696
  while True:
672
- new_records: List[TradeRecord] = await wallet_client.get_all_offers(
697
+ new_records: list[TradeRecord] = await wallet_client.get_all_offers(
673
698
  start,
674
699
  end,
700
+ sort_key="RELEVANCE" if sort_by_relevance else "CONFIRMED_AT_HEIGHT",
675
701
  reverse=reverse,
676
702
  file_contents=file_contents,
677
703
  exclude_my_offers=exclude_my_offers,
@@ -698,6 +724,7 @@ async def get_offers(
698
724
 
699
725
 
700
726
  async def take_offer(
727
+ root_path: pathlib.Path,
701
728
  wallet_rpc_port: Optional[int],
702
729
  fp: Optional[int],
703
730
  fee: uint64,
@@ -705,8 +732,8 @@ async def take_offer(
705
732
  examine_only: bool,
706
733
  push: bool,
707
734
  condition_valid_times: ConditionValidTimes,
708
- ) -> List[TransactionRecord]:
709
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
735
+ ) -> list[TransactionRecord]:
736
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
710
737
  if os.path.exists(file):
711
738
  filepath = pathlib.Path(file)
712
739
  with open(filepath) as ffile:
@@ -732,7 +759,7 @@ async def take_offer(
732
759
 
733
760
  print()
734
761
 
735
- royalty_asset_dict: Dict[Any, Tuple[Any, uint16]] = {}
762
+ royalty_asset_dict: dict[Any, tuple[Any, uint16]] = {}
736
763
  for royalty_asset_id in nft_coin_ids_supporting_royalties_from_offer(offer):
737
764
  if royalty_asset_id.hex() in offered:
738
765
  percentage, address = await get_nft_royalty_percentage_and_address(royalty_asset_id, wallet_client)
@@ -742,7 +769,7 @@ async def take_offer(
742
769
  )
743
770
 
744
771
  if royalty_asset_dict != {}:
745
- fungible_asset_dict: Dict[Any, uint64] = {}
772
+ fungible_asset_dict: dict[Any, uint64] = {}
746
773
  for fungible_asset_id in fungible_assets_from_offer(offer):
747
774
  fungible_asset_id_str = fungible_asset_id.hex() if fungible_asset_id is not None else "xch"
748
775
  if fungible_asset_id_str in requested:
@@ -756,10 +783,10 @@ async def take_offer(
756
783
  fungible_asset_dict[nft_royalty_currency] = uint64(requested[fungible_asset_id_str])
757
784
 
758
785
  if fungible_asset_dict != {}:
759
- royalty_summary: Dict[Any, List[Dict[str, Any]]] = await wallet_client.nft_calculate_royalties(
786
+ royalty_summary: dict[Any, list[dict[str, Any]]] = await wallet_client.nft_calculate_royalties(
760
787
  royalty_asset_dict, fungible_asset_dict
761
788
  )
762
- total_amounts_requested: Dict[Any, int] = {}
789
+ total_amounts_requested: dict[Any, int] = {}
763
790
  print("Royalties Summary:")
764
791
  for nft_id, summaries in royalty_summary.items():
765
792
  print(f" - For {nft_id}:")
@@ -803,6 +830,7 @@ async def take_offer(
803
830
 
804
831
 
805
832
  async def cancel_offer(
833
+ root_path: pathlib.Path,
806
834
  wallet_rpc_port: Optional[int],
807
835
  fp: Optional[int],
808
836
  fee: uint64,
@@ -810,8 +838,8 @@ async def cancel_offer(
810
838
  secure: bool,
811
839
  push: bool,
812
840
  condition_valid_times: ConditionValidTimes,
813
- ) -> List[TransactionRecord]:
814
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
841
+ ) -> list[TransactionRecord]:
842
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
815
843
  trade_record = await wallet_client.get_offer(offer_id, file_contents=True)
816
844
  await print_trade_record(trade_record, wallet_client, summaries=True)
817
845
 
@@ -832,10 +860,10 @@ async def cancel_offer(
832
860
  return res.transactions
833
861
 
834
862
 
835
- def wallet_coin_unit(typ: WalletType, address_prefix: str) -> Tuple[str, int]:
863
+ def wallet_coin_unit(typ: WalletType, address_prefix: str) -> tuple[str, int]:
836
864
  if typ in {WalletType.CAT, WalletType.CRCAT}:
837
865
  return "", units["cat"]
838
- if typ in [WalletType.STANDARD_WALLET, WalletType.POOLING_WALLET, WalletType.MULTI_SIG]:
866
+ if typ in {WalletType.STANDARD_WALLET, WalletType.POOLING_WALLET, WalletType.MULTI_SIG}:
839
867
  return address_prefix, units["chia"]
840
868
  return "", units["mojo"]
841
869
 
@@ -852,24 +880,23 @@ def print_balance(amount: int, scale: int, address_prefix: str, *, decimal_only:
852
880
 
853
881
 
854
882
  async def print_balances(
855
- wallet_rpc_port: Optional[int], fp: Optional[int], wallet_type: Optional[WalletType] = None
883
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], wallet_type: Optional[WalletType] = None
856
884
  ) -> None:
857
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
885
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
858
886
  summaries_response = await wallet_client.get_wallets(wallet_type)
859
887
  address_prefix = selected_network_address_prefix(config)
860
888
 
861
- is_synced: bool = await wallet_client.get_synced()
862
- is_syncing: bool = await wallet_client.get_sync_status()
889
+ sync_response = await wallet_client.get_sync_status()
863
890
 
864
- print(f"Wallet height: {await wallet_client.get_height_info()}")
865
- if is_syncing:
891
+ print(f"Wallet height: {(await wallet_client.get_height_info()).height}")
892
+ if sync_response.syncing:
866
893
  print("Sync status: Syncing...")
867
- elif is_synced:
894
+ elif sync_response.synced:
868
895
  print("Sync status: Synced")
869
896
  else:
870
897
  print("Sync status: Not synced")
871
898
 
872
- if not is_syncing and is_synced:
899
+ if not sync_response.syncing and sync_response.synced:
873
900
  if len(summaries_response) == 0:
874
901
  type_hint = " " if wallet_type is None else f" from type {wallet_type.name} "
875
902
  print(f"\nNo wallets{type_hint}available for fingerprint: {fingerprint}")
@@ -926,11 +953,12 @@ async def print_balances(
926
953
 
927
954
  print(" ")
928
955
  trusted_peers: dict[str, str] = config["wallet"].get("trusted_peers", {})
929
- trusted_cidrs: List[str] = config["wallet"].get("trusted_cidrs", [])
956
+ trusted_cidrs: list[str] = config["wallet"].get("trusted_cidrs", [])
930
957
  await print_connections(wallet_client, trusted_peers, trusted_cidrs)
931
958
 
932
959
 
933
960
  async def create_did_wallet(
961
+ root_path: pathlib.Path,
934
962
  wallet_rpc_port: Optional[int],
935
963
  fp: Optional[int],
936
964
  fee: uint64,
@@ -938,8 +966,8 @@ async def create_did_wallet(
938
966
  amount: int,
939
967
  push: bool,
940
968
  condition_valid_times: ConditionValidTimes,
941
- ) -> List[TransactionRecord]:
942
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
969
+ ) -> list[TransactionRecord]:
970
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
943
971
  try:
944
972
  response = await wallet_client.create_new_did_wallet(
945
973
  amount,
@@ -959,8 +987,10 @@ async def create_did_wallet(
959
987
  return []
960
988
 
961
989
 
962
- async def did_set_wallet_name(wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id: int, name: str) -> None:
963
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
990
+ async def did_set_wallet_name(
991
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id: int, name: str
992
+ ) -> None:
993
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
964
994
  try:
965
995
  await wallet_client.did_set_wallet_name(wallet_id, name)
966
996
  print(f"Successfully set a new name for DID wallet with id {wallet_id}: {name}")
@@ -968,8 +998,10 @@ async def did_set_wallet_name(wallet_rpc_port: Optional[int], fp: Optional[int],
968
998
  print(f"Failed to set DID wallet name: {e}")
969
999
 
970
1000
 
971
- async def get_did(wallet_rpc_port: Optional[int], fp: Optional[int], did_wallet_id: int) -> None:
972
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1001
+ async def get_did(
1002
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], did_wallet_id: int
1003
+ ) -> None:
1004
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
973
1005
  try:
974
1006
  response = await wallet_client.get_did_id(did_wallet_id)
975
1007
  my_did = response["my_did"]
@@ -980,8 +1012,10 @@ async def get_did(wallet_rpc_port: Optional[int], fp: Optional[int], did_wallet_
980
1012
  print(f"Failed to get DID: {e}")
981
1013
 
982
1014
 
983
- async def get_did_info(wallet_rpc_port: Optional[int], fp: Optional[int], coin_id: str, latest: bool) -> None:
984
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1015
+ async def get_did_info(
1016
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], coin_id: str, latest: bool
1017
+ ) -> None:
1018
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
985
1019
  did_padding_length = 23
986
1020
  try:
987
1021
  response = await wallet_client.get_did_info(coin_id, latest)
@@ -1002,6 +1036,7 @@ async def get_did_info(wallet_rpc_port: Optional[int], fp: Optional[int], coin_i
1002
1036
 
1003
1037
 
1004
1038
  async def update_did_metadata(
1039
+ root_path: pathlib.Path,
1005
1040
  wallet_rpc_port: Optional[int],
1006
1041
  fp: Optional[int],
1007
1042
  did_wallet_id: int,
@@ -1009,8 +1044,8 @@ async def update_did_metadata(
1009
1044
  reuse_puzhash: bool,
1010
1045
  push: bool,
1011
1046
  condition_valid_times: ConditionValidTimes,
1012
- ) -> List[TransactionRecord]:
1013
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1047
+ ) -> list[TransactionRecord]:
1048
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1014
1049
  try:
1015
1050
  response = await wallet_client.update_did_metadata(
1016
1051
  did_wallet_id,
@@ -1033,15 +1068,16 @@ async def update_did_metadata(
1033
1068
 
1034
1069
 
1035
1070
  async def did_message_spend(
1071
+ root_path: pathlib.Path,
1036
1072
  wallet_rpc_port: Optional[int],
1037
1073
  fp: Optional[int],
1038
1074
  did_wallet_id: int,
1039
- puzzle_announcements: List[str],
1040
- coin_announcements: List[str],
1075
+ puzzle_announcements: list[str],
1076
+ coin_announcements: list[str],
1041
1077
  push: bool,
1042
1078
  condition_valid_times: ConditionValidTimes,
1043
- ) -> List[TransactionRecord]:
1044
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1079
+ ) -> list[TransactionRecord]:
1080
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1045
1081
  try:
1046
1082
  response = await wallet_client.did_message_spend(
1047
1083
  did_wallet_id,
@@ -1061,6 +1097,7 @@ async def did_message_spend(
1061
1097
 
1062
1098
 
1063
1099
  async def transfer_did(
1100
+ root_path: pathlib.Path,
1064
1101
  wallet_rpc_port: Optional[int],
1065
1102
  fp: Optional[int],
1066
1103
  did_wallet_id: int,
@@ -1070,9 +1107,8 @@ async def transfer_did(
1070
1107
  reuse_puzhash: Optional[bool],
1071
1108
  push: bool,
1072
1109
  condition_valid_times: ConditionValidTimes,
1073
- ) -> List[TransactionRecord]:
1074
-
1075
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1110
+ ) -> list[TransactionRecord]:
1111
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1076
1112
  try:
1077
1113
  target_address = target_cli_address.original_address
1078
1114
  response = await wallet_client.did_transfer_did(
@@ -1098,6 +1134,7 @@ async def transfer_did(
1098
1134
 
1099
1135
  async def find_lost_did(
1100
1136
  *,
1137
+ root_path: pathlib.Path,
1101
1138
  wallet_rpc_port: Optional[int],
1102
1139
  fp: Optional[int],
1103
1140
  coin_id: str,
@@ -1105,7 +1142,7 @@ async def find_lost_did(
1105
1142
  recovery_list_hash: Optional[str],
1106
1143
  num_verification: Optional[int],
1107
1144
  ) -> None:
1108
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1145
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
1109
1146
  try:
1110
1147
  response = await wallet_client.find_lost_did(
1111
1148
  coin_id,
@@ -1122,9 +1159,13 @@ async def find_lost_did(
1122
1159
 
1123
1160
 
1124
1161
  async def create_nft_wallet(
1125
- wallet_rpc_port: Optional[int], fp: Optional[int], did_id: Optional[CliAddress] = None, name: Optional[str] = None
1162
+ root_path: pathlib.Path,
1163
+ wallet_rpc_port: Optional[int],
1164
+ fp: Optional[int],
1165
+ did_id: Optional[CliAddress] = None,
1166
+ name: Optional[str] = None,
1126
1167
  ) -> None:
1127
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1168
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, _):
1128
1169
  try:
1129
1170
  response = await wallet_client.create_new_nft_wallet(did_id.original_address if did_id else None, name)
1130
1171
  wallet_id = response["wallet_id"]
@@ -1135,6 +1176,7 @@ async def create_nft_wallet(
1135
1176
 
1136
1177
  async def mint_nft(
1137
1178
  *,
1179
+ root_path: pathlib.Path,
1138
1180
  wallet_rpc_port: Optional[int],
1139
1181
  fp: Optional[int],
1140
1182
  wallet_id: int,
@@ -1142,11 +1184,11 @@ async def mint_nft(
1142
1184
  target_cli_address: Optional[CliAddress],
1143
1185
  no_did_ownership: bool,
1144
1186
  hash: str,
1145
- uris: List[str],
1187
+ uris: list[str],
1146
1188
  metadata_hash: Optional[str],
1147
- metadata_uris: List[str],
1189
+ metadata_uris: list[str],
1148
1190
  license_hash: Optional[str],
1149
- license_uris: List[str],
1191
+ license_uris: list[str],
1150
1192
  edition_total: Optional[int],
1151
1193
  edition_number: Optional[int],
1152
1194
  fee: uint64,
@@ -1154,8 +1196,8 @@ async def mint_nft(
1154
1196
  reuse_puzhash: Optional[bool],
1155
1197
  push: bool,
1156
1198
  condition_valid_times: ConditionValidTimes,
1157
- ) -> List[TransactionRecord]:
1158
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1199
+ ) -> list[TransactionRecord]:
1200
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1159
1201
  royalty_address = royalty_cli_address.validate_address_type(AddressType.XCH) if royalty_cli_address else None
1160
1202
  target_address = target_cli_address.validate_address_type(AddressType.XCH) if target_cli_address else None
1161
1203
  try:
@@ -1205,6 +1247,7 @@ async def mint_nft(
1205
1247
 
1206
1248
  async def add_uri_to_nft(
1207
1249
  *,
1250
+ root_path: pathlib.Path,
1208
1251
  wallet_rpc_port: Optional[int],
1209
1252
  fp: Optional[int],
1210
1253
  wallet_id: int,
@@ -1216,8 +1259,8 @@ async def add_uri_to_nft(
1216
1259
  reuse_puzhash: Optional[bool],
1217
1260
  push: bool,
1218
1261
  condition_valid_times: ConditionValidTimes,
1219
- ) -> List[TransactionRecord]:
1220
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1262
+ ) -> list[TransactionRecord]:
1263
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1221
1264
  try:
1222
1265
  if len([x for x in (uri, metadata_uri, license_uri) if x is not None]) > 1:
1223
1266
  raise ValueError("You must provide only one of the URI flags")
@@ -1255,6 +1298,7 @@ async def add_uri_to_nft(
1255
1298
 
1256
1299
  async def transfer_nft(
1257
1300
  *,
1301
+ root_path: pathlib.Path,
1258
1302
  wallet_rpc_port: Optional[int],
1259
1303
  fp: Optional[int],
1260
1304
  wallet_id: int,
@@ -1264,8 +1308,8 @@ async def transfer_nft(
1264
1308
  reuse_puzhash: Optional[bool],
1265
1309
  push: bool,
1266
1310
  condition_valid_times: ConditionValidTimes,
1267
- ) -> List[TransactionRecord]:
1268
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1311
+ ) -> list[TransactionRecord]:
1312
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1269
1313
  try:
1270
1314
  target_address = target_cli_address.validate_address_type(AddressType.XCH)
1271
1315
  response = await wallet_client.transfer_nft(
@@ -1289,7 +1333,7 @@ async def transfer_nft(
1289
1333
  return []
1290
1334
 
1291
1335
 
1292
- def print_nft_info(nft: NFTInfo, *, config: Dict[str, Any]) -> None:
1336
+ def print_nft_info(nft: NFTInfo, *, config: dict[str, Any]) -> None:
1293
1337
  indent: str = " "
1294
1338
  owner_did = None if nft.owner_did is None else encode_puzzle_hash(nft.owner_did, AddressType.DID.hrp(config))
1295
1339
  minter_did = None if nft.minter_did is None else encode_puzzle_hash(nft.minter_did, AddressType.DID.hrp(config))
@@ -1327,9 +1371,14 @@ def print_nft_info(nft: NFTInfo, *, config: Dict[str, Any]) -> None:
1327
1371
 
1328
1372
 
1329
1373
  async def list_nfts(
1330
- wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id: int, num: int, start_index: int
1374
+ root_path: pathlib.Path,
1375
+ wallet_rpc_port: Optional[int],
1376
+ fp: Optional[int],
1377
+ wallet_id: int,
1378
+ num: int,
1379
+ start_index: int,
1331
1380
  ) -> None:
1332
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1381
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1333
1382
  try:
1334
1383
  response = await wallet_client.list_nfts(wallet_id, num, start_index)
1335
1384
  nft_list = response["nft_list"]
@@ -1345,6 +1394,7 @@ async def list_nfts(
1345
1394
 
1346
1395
  async def set_nft_did(
1347
1396
  *,
1397
+ root_path: pathlib.Path,
1348
1398
  wallet_rpc_port: Optional[int],
1349
1399
  fp: Optional[int],
1350
1400
  wallet_id: int,
@@ -1354,8 +1404,8 @@ async def set_nft_did(
1354
1404
  reuse_puzhash: Optional[bool],
1355
1405
  push: bool,
1356
1406
  condition_valid_times: ConditionValidTimes,
1357
- ) -> List[TransactionRecord]:
1358
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1407
+ ) -> list[TransactionRecord]:
1408
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1359
1409
  try:
1360
1410
  response = await wallet_client.set_nft_did(
1361
1411
  wallet_id,
@@ -1376,8 +1426,10 @@ async def set_nft_did(
1376
1426
  return []
1377
1427
 
1378
1428
 
1379
- async def get_nft_info(wallet_rpc_port: Optional[int], fp: Optional[int], nft_coin_id: str) -> None:
1380
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1429
+ async def get_nft_info(
1430
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], nft_coin_id: str
1431
+ ) -> None:
1432
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, config):
1381
1433
  try:
1382
1434
  response = await wallet_client.get_nft_info(nft_coin_id)
1383
1435
  nft_info = NFTInfo.from_json_dict(response["nft_info"])
@@ -1388,7 +1440,7 @@ async def get_nft_info(wallet_rpc_port: Optional[int], fp: Optional[int], nft_co
1388
1440
 
1389
1441
  async def get_nft_royalty_percentage_and_address(
1390
1442
  nft_coin_id: bytes32, wallet_client: WalletRpcClient
1391
- ) -> Tuple[uint16, bytes32]:
1443
+ ) -> tuple[uint16, bytes32]:
1392
1444
  info = NFTInfo.from_json_dict((await wallet_client.get_nft_info(nft_coin_id.hex()))["nft_info"])
1393
1445
  assert info.royalty_puzzle_hash is not None
1394
1446
  percentage = uint16(info.royalty_percentage) if info.royalty_percentage is not None else 0
@@ -1396,11 +1448,11 @@ async def get_nft_royalty_percentage_and_address(
1396
1448
 
1397
1449
 
1398
1450
  def calculate_nft_royalty_amount(
1399
- offered: Dict[str, Any], requested: Dict[str, Any], nft_coin_id: bytes32, nft_royalty_percentage: int
1400
- ) -> Tuple[str, int, int]:
1451
+ offered: dict[str, Any], requested: dict[str, Any], nft_coin_id: bytes32, nft_royalty_percentage: int
1452
+ ) -> tuple[str, int, int]:
1401
1453
  nft_asset_id = nft_coin_id.hex()
1402
- amount_dict: Dict[str, Any] = requested if nft_asset_id in offered else offered
1403
- amounts: List[Tuple[str, int]] = list(amount_dict.items())
1454
+ amount_dict: dict[str, Any] = requested if nft_asset_id in offered else offered
1455
+ amounts: list[tuple[str, int]] = list(amount_dict.items())
1404
1456
 
1405
1457
  if len(amounts) != 1 or not isinstance(amounts[0][1], int):
1406
1458
  raise ValueError("Royalty enabled NFTs only support offering/requesting one NFT for one currency")
@@ -1411,7 +1463,7 @@ def calculate_nft_royalty_amount(
1411
1463
  return royalty_asset_id, royalty_amount, total_amount_requested
1412
1464
 
1413
1465
 
1414
- def driver_dict_asset_is_nft_supporting_royalties(driver_dict: Dict[bytes32, PuzzleInfo], asset_id: bytes32) -> bool:
1466
+ def driver_dict_asset_is_nft_supporting_royalties(driver_dict: dict[bytes32, PuzzleInfo], asset_id: bytes32) -> bool:
1415
1467
  asset_dict: PuzzleInfo = driver_dict[asset_id]
1416
1468
  return asset_dict.check_type(
1417
1469
  [
@@ -1422,7 +1474,7 @@ def driver_dict_asset_is_nft_supporting_royalties(driver_dict: Dict[bytes32, Puz
1422
1474
  )
1423
1475
 
1424
1476
 
1425
- def driver_dict_asset_is_fungible(driver_dict: Dict[bytes32, PuzzleInfo], asset_id: bytes32) -> bool:
1477
+ def driver_dict_asset_is_fungible(driver_dict: dict[bytes32, PuzzleInfo], asset_id: bytes32) -> bool:
1426
1478
  asset_dict: PuzzleInfo = driver_dict[asset_id]
1427
1479
  return not asset_dict.check_type(
1428
1480
  [
@@ -1431,19 +1483,20 @@ def driver_dict_asset_is_fungible(driver_dict: Dict[bytes32, PuzzleInfo], asset_
1431
1483
  )
1432
1484
 
1433
1485
 
1434
- def nft_coin_ids_supporting_royalties_from_offer(offer: Offer) -> List[bytes32]:
1486
+ def nft_coin_ids_supporting_royalties_from_offer(offer: Offer) -> list[bytes32]:
1435
1487
  return [
1436
1488
  key for key in offer.driver_dict.keys() if driver_dict_asset_is_nft_supporting_royalties(offer.driver_dict, key)
1437
1489
  ]
1438
1490
 
1439
1491
 
1440
- def fungible_assets_from_offer(offer: Offer) -> List[Optional[bytes32]]:
1492
+ def fungible_assets_from_offer(offer: Offer) -> list[Optional[bytes32]]:
1441
1493
  return [
1442
1494
  asset for asset in offer.arbitrage() if asset is None or driver_dict_asset_is_fungible(offer.driver_dict, asset)
1443
1495
  ]
1444
1496
 
1445
1497
 
1446
1498
  async def send_notification(
1499
+ root_path: pathlib.Path,
1447
1500
  wallet_rpc_port: Optional[int],
1448
1501
  fp: Optional[int],
1449
1502
  fee: uint64,
@@ -1452,8 +1505,8 @@ async def send_notification(
1452
1505
  cli_amount: CliAmount,
1453
1506
  push: bool,
1454
1507
  condition_valid_times: ConditionValidTimes,
1455
- ) -> List[TransactionRecord]:
1456
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1508
+ ) -> list[TransactionRecord]:
1509
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, _):
1457
1510
  amount: uint64 = cli_amount.convert_amount(units["chia"])
1458
1511
 
1459
1512
  tx = await wallet_client.send_notification(
@@ -1472,13 +1525,14 @@ async def send_notification(
1472
1525
 
1473
1526
 
1474
1527
  async def get_notifications(
1528
+ root_path: pathlib.Path,
1475
1529
  wallet_rpc_port: Optional[int],
1476
1530
  fp: Optional[int],
1477
1531
  ids: Optional[Sequence[bytes32]],
1478
1532
  start: Optional[int],
1479
1533
  end: Optional[int],
1480
1534
  ) -> None:
1481
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1535
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
1482
1536
  if ids is not None:
1483
1537
  ids = None if len(ids) == 0 else list(ids)
1484
1538
  response = await wallet_client.get_notifications(
@@ -1492,9 +1546,9 @@ async def get_notifications(
1492
1546
 
1493
1547
 
1494
1548
  async def delete_notifications(
1495
- wallet_rpc_port: Optional[int], fp: Optional[int], ids: Sequence[bytes32], delete_all: bool
1549
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], ids: Sequence[bytes32], delete_all: bool
1496
1550
  ) -> None:
1497
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1551
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
1498
1552
  if delete_all:
1499
1553
  print(f"Success: {await wallet_client.delete_notifications()}")
1500
1554
  else:
@@ -1503,6 +1557,7 @@ async def delete_notifications(
1503
1557
 
1504
1558
  async def sign_message(
1505
1559
  *,
1560
+ root_path: pathlib.Path,
1506
1561
  wallet_rpc_port: Optional[int],
1507
1562
  fp: Optional[int],
1508
1563
  addr_type: AddressType,
@@ -1511,7 +1566,7 @@ async def sign_message(
1511
1566
  did_id: Optional[CliAddress] = None,
1512
1567
  nft_id: Optional[CliAddress] = None,
1513
1568
  ) -> None:
1514
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1569
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
1515
1570
  if addr_type == AddressType.XCH:
1516
1571
  if address is None:
1517
1572
  print("Address is required for XCH address type.")
@@ -1541,6 +1596,7 @@ async def sign_message(
1541
1596
 
1542
1597
  async def spend_clawback(
1543
1598
  *,
1599
+ root_path: pathlib.Path,
1544
1600
  wallet_rpc_port: Optional[int],
1545
1601
  fp: Optional[int],
1546
1602
  fee: uint64,
@@ -1548,8 +1604,8 @@ async def spend_clawback(
1548
1604
  force: bool = False,
1549
1605
  push: bool,
1550
1606
  condition_valid_times: ConditionValidTimes,
1551
- ) -> List[TransactionRecord]:
1552
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, _, _):
1607
+ ) -> list[TransactionRecord]:
1608
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
1553
1609
  tx_ids = []
1554
1610
  for tid in tx_ids_str.split(","):
1555
1611
  tx_ids.append(bytes32.from_hexstr(tid))
@@ -1571,6 +1627,7 @@ async def spend_clawback(
1571
1627
 
1572
1628
 
1573
1629
  async def mint_vc(
1630
+ root_path: pathlib.Path,
1574
1631
  wallet_rpc_port: Optional[int],
1575
1632
  fp: Optional[int],
1576
1633
  did: CliAddress,
@@ -1578,14 +1635,16 @@ async def mint_vc(
1578
1635
  target_address: Optional[CliAddress],
1579
1636
  push: bool,
1580
1637
  condition_valid_times: ConditionValidTimes,
1581
- ) -> List[TransactionRecord]:
1582
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1638
+ ) -> list[TransactionRecord]:
1639
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1583
1640
  res = await wallet_client.vc_mint(
1584
- did.validate_address_type_get_ph(AddressType.DID),
1641
+ VCMint(
1642
+ did_id=did.validate_address_type(AddressType.DID),
1643
+ target_address=target_address.validate_address_type(AddressType.XCH) if target_address else None,
1644
+ fee=fee,
1645
+ push=push,
1646
+ ),
1585
1647
  CMDTXConfigLoader().to_tx_config(units["chia"], config, fingerprint),
1586
- target_address.validate_address_type_get_ph(AddressType.XCH) if target_address else None,
1587
- fee,
1588
- push=push,
1589
1648
  timelock_info=condition_valid_times,
1590
1649
  )
1591
1650
 
@@ -1604,16 +1663,18 @@ async def mint_vc(
1604
1663
  return res.transactions
1605
1664
 
1606
1665
 
1607
- async def get_vcs(wallet_rpc_port: Optional[int], fp: Optional[int], start: int, count: int) -> None:
1608
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1609
- vc_records, proofs = await wallet_client.vc_get_list(start, count)
1666
+ async def get_vcs(
1667
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], start: int, count: int
1668
+ ) -> None:
1669
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, config):
1670
+ get_list_response = await wallet_client.vc_get_list(VCGetList(uint32(start), uint32(count)))
1610
1671
  print("Proofs:")
1611
- for hash, proof_dict in proofs.items():
1672
+ for hash, proof_dict in get_list_response.proof_dict.items():
1612
1673
  if proof_dict is not None:
1613
1674
  print(f"- {hash}")
1614
1675
  for proof in proof_dict:
1615
1676
  print(f" - {proof}")
1616
- for record in vc_records:
1677
+ for record in get_list_response.vc_records:
1617
1678
  print("")
1618
1679
  print(f"Launcher ID: {record.vc.launcher_id.hex()}")
1619
1680
  print(f"Coin ID: {record.vc.coin.name().hex()}")
@@ -1629,6 +1690,7 @@ async def get_vcs(wallet_rpc_port: Optional[int], fp: Optional[int], start: int,
1629
1690
 
1630
1691
  async def spend_vc(
1631
1692
  *,
1693
+ root_path: pathlib.Path,
1632
1694
  wallet_rpc_port: Optional[int],
1633
1695
  fp: Optional[int],
1634
1696
  vc_id: bytes32,
@@ -1638,18 +1700,20 @@ async def spend_vc(
1638
1700
  reuse_puzhash: bool,
1639
1701
  push: bool,
1640
1702
  condition_valid_times: ConditionValidTimes,
1641
- ) -> List[TransactionRecord]:
1642
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1703
+ ) -> list[TransactionRecord]:
1704
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1643
1705
  txs = (
1644
1706
  await wallet_client.vc_spend(
1645
- vc_id,
1646
- new_puzhash=new_puzhash,
1647
- new_proof_hash=bytes32.from_hexstr(new_proof_hash),
1648
- fee=fee,
1707
+ VCSpend(
1708
+ vc_id=vc_id,
1709
+ new_puzhash=new_puzhash,
1710
+ new_proof_hash=bytes32.from_hexstr(new_proof_hash),
1711
+ fee=fee,
1712
+ push=push,
1713
+ ),
1649
1714
  tx_config=CMDTXConfigLoader(
1650
1715
  reuse_puzhash=reuse_puzhash,
1651
1716
  ).to_tx_config(units["chia"], config, fingerprint),
1652
- push=push,
1653
1717
  timelock_info=condition_valid_times,
1654
1718
  )
1655
1719
  ).transactions
@@ -1670,32 +1734,39 @@ async def spend_vc(
1670
1734
 
1671
1735
 
1672
1736
  async def add_proof_reveal(
1673
- wallet_rpc_port: Optional[int], fp: Optional[int], proofs: Sequence[str], root_only: bool
1737
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], proofs: Sequence[str], root_only: bool
1674
1738
  ) -> None:
1675
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1739
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
1676
1740
  if len(proofs) == 0:
1677
1741
  print("Must specify at least one proof")
1678
1742
  return
1679
1743
 
1680
- proof_dict: Dict[str, str] = {proof: "1" for proof in proofs}
1744
+ proof_dict: dict[str, str] = {proof: "1" for proof in proofs}
1681
1745
  if root_only:
1682
1746
  print(f"Proof Hash: {VCProofs(proof_dict).root()}")
1683
1747
  return
1684
1748
  else:
1685
- await wallet_client.vc_add_proofs(proof_dict)
1749
+ await wallet_client.vc_add_proofs(VCAddProofs.from_json_dict({"proofs": proof_dict}))
1686
1750
  print("Proofs added to DB successfully!")
1687
1751
  return
1688
1752
 
1689
1753
 
1690
- async def get_proofs_for_root(wallet_rpc_port: Optional[int], fp: Optional[int], proof_hash: str) -> None:
1691
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1692
- proof_dict: Dict[str, str] = await wallet_client.vc_get_proofs_for_root(bytes32.from_hexstr(proof_hash))
1754
+ async def get_proofs_for_root(
1755
+ root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], proof_hash: str
1756
+ ) -> None:
1757
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
1758
+ proof_dict: dict[str, str] = (
1759
+ (await wallet_client.vc_get_proofs_for_root(VCGetProofsForRoot(bytes32.from_hexstr(proof_hash))))
1760
+ .to_vc_proofs()
1761
+ .key_value_pairs
1762
+ )
1693
1763
  print("Proofs:")
1694
1764
  for proof in proof_dict:
1695
1765
  print(f" - {proof}")
1696
1766
 
1697
1767
 
1698
1768
  async def revoke_vc(
1769
+ root_path: pathlib.Path,
1699
1770
  wallet_rpc_port: Optional[int],
1700
1771
  fp: Optional[int],
1701
1772
  parent_coin_id: Optional[bytes32],
@@ -1704,13 +1775,13 @@ async def revoke_vc(
1704
1775
  reuse_puzhash: bool,
1705
1776
  push: bool,
1706
1777
  condition_valid_times: ConditionValidTimes,
1707
- ) -> List[TransactionRecord]:
1708
- async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1778
+ ) -> list[TransactionRecord]:
1779
+ async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
1709
1780
  if parent_coin_id is None:
1710
1781
  if vc_id is None:
1711
1782
  print("Must specify either --parent-coin-id or --vc-id")
1712
1783
  return []
1713
- record = await wallet_client.vc_get(vc_id)
1784
+ record = (await wallet_client.vc_get(VCGet(vc_id))).vc_record
1714
1785
  if record is None:
1715
1786
  print(f"Cannot find a VC with ID {vc_id.hex()}")
1716
1787
  return []
@@ -1719,12 +1790,14 @@ async def revoke_vc(
1719
1790
  parent_id = parent_coin_id
1720
1791
  txs = (
1721
1792
  await wallet_client.vc_revoke(
1722
- parent_id,
1723
- fee=fee,
1793
+ VCRevoke(
1794
+ vc_parent_id=parent_id,
1795
+ fee=fee,
1796
+ push=push,
1797
+ ),
1724
1798
  tx_config=CMDTXConfigLoader(
1725
1799
  reuse_puzhash=reuse_puzhash,
1726
1800
  ).to_tx_config(units["chia"], config, fingerprint),
1727
- push=push,
1728
1801
  timelock_info=condition_valid_times,
1729
1802
  )
1730
1803
  ).transactions
@@ -1745,6 +1818,7 @@ async def revoke_vc(
1745
1818
 
1746
1819
 
1747
1820
  async def approve_r_cats(
1821
+ root_path: pathlib.Path,
1748
1822
  wallet_rpc_port: Optional[int],
1749
1823
  fingerprint: int,
1750
1824
  wallet_id: uint32,
@@ -1755,8 +1829,8 @@ async def approve_r_cats(
1755
1829
  reuse: bool,
1756
1830
  push: bool,
1757
1831
  condition_valid_times: ConditionValidTimes,
1758
- ) -> List[TransactionRecord]:
1759
- async with get_wallet_client(wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, config):
1832
+ ) -> list[TransactionRecord]:
1833
+ async with get_wallet_client(root_path, wallet_rpc_port, fingerprint) as (wallet_client, fingerprint, config):
1760
1834
  if wallet_client is None:
1761
1835
  return
1762
1836
  txs = await wallet_client.crcat_approve_pending(