From 87cd247eb51cf40eda47ad1301df89a437350eb1 Mon Sep 17 00:00:00 2001 From: sowle Date: Wed, 9 Jul 2025 19:10:33 +0300 Subject: [PATCH] wallet: clear_utxo_cold_sig_reservation() made available only for watch-only wallets --- src/wallet/wallet2.cpp | 1 + tests/core_tests/wallet_rpc_tests.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 50f96fdc..59d24d61 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -7963,6 +7963,7 @@ void wallet2::restore_key_images_in_wo_wallet(const std::wstring& filename, cons //---------------------------------------------------------------------------------------------------- void wallet2::clear_utxo_cold_sig_reservation(std::vector& affected_transfer_ids) { + WLT_THROW_IF_FALSE_WALLET_CMN_ERR_EX(m_watch_only, "clear_utxo_cold_sig_reservation can only be used in watch-only wallet"); affected_transfer_ids.clear(); for(auto& [tid, td] : m_transfers) diff --git a/tests/core_tests/wallet_rpc_tests.cpp b/tests/core_tests/wallet_rpc_tests.cpp index 004c1bf6..7d3739e4 100644 --- a/tests/core_tests/wallet_rpc_tests.cpp +++ b/tests/core_tests/wallet_rpc_tests.cpp @@ -1234,13 +1234,11 @@ bool make_cold_signing_transaction(tools::wallet_rpc_server& rpc_wo, tools::wall r = invoke_text_json_for_rpc(rpc_wo, "transfer", req_transfer, res_transfer); CHECK_AND_ASSERT_MES(r, false, "RPC 'transfer' failed"); - // skip this reservation just for fun + // (optional step) skip this reservation just for fun and then create a transaction once again tools::wallet_public::COMMAND_CLEAR_UTXO_COLD_SIG_RESERVATION::request req_clear_csr{}; tools::wallet_public::COMMAND_CLEAR_UTXO_COLD_SIG_RESERVATION::response res_clear_csr{}; invoke_text_json_for_rpc(rpc_wo, "clear_utxo_cold_sig_reservation", req_clear_csr, res_clear_csr); CHECK_AND_ASSERT_MES(res_clear_csr.affected_outputs.size() > 0, false, "no outputs were affected after clear_utxo_cold_sig_reservation"); - - // watch only creates a transaction once again res_transfer = tools::wallet_public::COMMAND_RPC_TRANSFER::response{}; r = invoke_text_json_for_rpc(rpc_wo, "transfer", req_transfer, res_transfer); CHECK_AND_ASSERT_MES(r, false, "RPC 'transfer' failed"); @@ -1252,8 +1250,11 @@ bool make_cold_signing_transaction(tools::wallet_rpc_server& rpc_wo, tools::wall r = invoke_text_json_for_rpc(rpc, "sign_transfer", req_sign, res_sign); CHECK_AND_ASSERT_MES(r, false, "RPC 'sign_transfer' failed"); + // (optional step) make sure clear_utxo_cold_sig_reservation cannot be called in a full keys wallet + r = !invoke_text_json_for_rpc(rpc, "clear_utxo_cold_sig_reservation", req_clear_csr, res_clear_csr); + CHECK_AND_ASSERT_MES(r, false, "clear_utxo_cold_sig_reservation called in full key wallet"); - // watch only wallet submits it + // watch only wallet submits signed transaction tools::wallet_public::COMMAND_SUBMIT_TRANSFER::request req_submit{}; req_submit.tx_signed_hex = res_sign.tx_signed_hex; tools::wallet_public::COMMAND_SUBMIT_TRANSFER::response res_submit{};