From bb9282a07934c0d4c389e6e10971f5e6f9f563b7 Mon Sep 17 00:00:00 2001 From: Czarek Nakamoto Date: Wed, 27 Mar 2024 14:33:07 +0100 Subject: [PATCH] coin control --- src/wallet/api/wallet.cpp | 5 +++-- src/wallet/api/wallet2_api.h | 3 +++ src/wallet/wallet2.cpp | 21 +++++++++++++++++++++ src/wallet/wallet2.h | 3 +++ src/wallet/api/coins.cpp | 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index 63ed26a11..ca83812f3 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -2016,13 +2016,14 @@ PendingTransaction *WalletImpl::createTransactionMultDest(const std::vectoradjust_mixin(mixin_count); if (amount) { + // (std::vector dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector& extra, uint32_t subaddr_account, std::set subaddr_indices, const unique_index_container& subtract_fee_from_outputs, const std::vector& preferred_input_list) transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */, adjusted_priority, - extra, subaddr_account, subaddr_indices); + extra, subaddr_account, subaddr_indices, {}, preferred_input_list); } else { transaction->m_pending_tx = m_wallet->create_transactions_all(0, info.address, info.is_subaddress, 1, fake_outs_count, 0 /* unlock_time */, adjusted_priority, - extra, subaddr_account, subaddr_indices); + extra, subaddr_account, subaddr_indices, preferred_input_list); } pendingTxPostProcess(transaction); diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h index c2fa3d95b..ece303c37 100644 --- a/src/wallet/api/wallet2_api.h +++ b/src/wallet/api/wallet2_api.h @@ -352,7 +352,9 @@ struct Coins virtual CoinsInfo * coin(int index) const = 0; virtual std::vector getAll() const = 0; virtual void refresh() = 0; + virtual void setFrozen(std::string public_key) = 0; virtual void setFrozen(int index) = 0; + virtual void thaw(std::string public_key) = 0; virtual void thaw(int index) = 0; virtual bool isTransferUnlocked(uint64_t unlockTime, uint64_t blockHeight) = 0; + virtual void setDescription(const std::string &public_key, const std::string &description) = 0; }; struct SubaddressRow { diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 00d9c133e..674126b87 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -2091,12 +2091,21 @@ bool wallet2::frozen(const multisig_tx_set& txs) const return false; } +void wallet2::freeze(const crypto::public_key &pk) +{ + freeze(get_transfer_details(pk)); +} //---------------------------------------------------------------------------------------------------- void wallet2::freeze(const crypto::key_image &ki) { freeze(get_transfer_details(ki)); } //---------------------------------------------------------------------------------------------------- +void wallet2::thaw(const crypto::public_key &pk) +{ + thaw(get_transfer_details(pk)); +} +//---------------------------------------------------------------------------------------------------- void wallet2::thaw(const crypto::key_image &ki) { thaw(get_transfer_details(ki)); @@ -2107,6 +2116,18 @@ bool wallet2::frozen(const crypto::key_image &ki) const return frozen(get_transfer_details(ki)); } //---------------------------------------------------------------------------------------------------- +size_t wallet2::get_transfer_details(const crypto::public_key &pk) const +{ + for (size_t idx = 0; idx < m_transfers.size(); ++idx) + { + const transfer_details &td = m_transfers[idx]; + if (td.get_public_key() == pk) { + return idx; + } + } + CHECK_AND_ASSERT_THROW_MES(false, "Public key not found"); +} +//---------------------------------------------------------------------------------------------------- size_t wallet2::get_transfer_details(const crypto::key_image &ki) const { for (size_t idx = 0; idx < m_transfers.size(); ++idx) diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 40997cdbb..fd6dd09e3 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -1562,6 +1562,7 @@ private: uint64_t get_num_rct_outputs(); size_t get_num_transfer_details() const { return m_transfers.size(); } const transfer_details &get_transfer_details(size_t idx) const; + size_t get_transfer_details(const crypto::public_key &pk) const; uint8_t get_current_hard_fork(); void get_hard_fork_info(uint8_t version, uint64_t &earliest_height); @@ -1792,7 +1793,9 @@ private: void freeze(size_t idx); void thaw(size_t idx); bool frozen(size_t idx) const; + void freeze(const crypto::public_key &pk); void freeze(const crypto::key_image &ki); + void thaw(const crypto::public_key &pk); void thaw(const crypto::key_image &ki); bool frozen(const crypto::key_image &ki) const; bool frozen(const transfer_details &td) const; diff --git a/src/wallet/api/coins.cpp b/src/wallet/api/coins.cpp index fe54b82cf..fdd1c3c7a 100644 --- a/src/wallet/api/coins.cpp +++ b/src/wallet/api/coins.cpp @@ -90,6 +90,26 @@ namespace Monero { } } + void CoinsImpl::setFrozen(std::string public_key) + { + crypto::public_key pk; + if (!epee::string_tools::hex_to_pod(public_key, pk)) + { + LOG_ERROR("Invalid public key: " << public_key); + return; + } + + try + { + m_wallet->m_wallet->freeze(pk); + refresh(); + } + catch (const std::exception& e) + { + LOG_ERROR("setFrozen: " << e.what()); + } + } + void CoinsImpl::setFrozen(int index) { try @@ -103,6 +123,27 @@ namespace Monero { } } + void CoinsImpl::thaw(std::string public_key) + { + crypto::public_key pk; + if (!epee::string_tools::hex_to_pod(public_key, pk)) + { + LOG_ERROR("Invalid public key: " << public_key); + return; + } + + try + { + m_wallet->m_wallet->thaw(pk); + refresh(); + } + catch (const std::exception& e) + { + LOG_ERROR("thaw: " << e.what()); + } + } + + +void CoinsImpl::setDescription(const std::string &public_key, const std::string &description) +{ + crypto::public_key pk; + if (!epee::string_tools::hex_to_pod(public_key, pk)) + { + LOG_ERROR("Invalid public key: " << public_key); + return; + } + + try + { + const size_t index = m_wallet->m_wallet->get_transfer_details(pk); + const tools::wallet2::transfer_details &td = m_wallet->m_wallet->get_transfer_details(index); + m_wallet->m_wallet->set_tx_note(td.m_txid, description); + refresh(); + } + catch (const std::exception& e) + { + LOG_ERROR("setDescription: " << e.what()); + } +} + void CoinsImpl::thaw(int index) { try diff --git a/src/wallet/api/coins.h b/src/wallet/api/coins.h index 3293d8ae9..eb8d54fa6 100644 --- a/src/wallet/api/coins.h +++ b/src/wallet/api/coins.h @@ -19,10 +19,14 @@ namespace Monero { void refresh() override; void setFrozen(int index) override; + void setFrozen(std::string public_key) override; void thaw(int index) override; + void thaw(std::string public_key) override; bool isTransferUnlocked(uint64_t unlockTime, uint64_t blockHeight) override; + void setDescription(const std::string &public_key, const std::string &description) override; + private: WalletImpl *m_wallet; std::vector m_rows;