Files
monero_c/patches/wownero/0005-coin-control.patch
Czarek Nakamoto 90658235f6 update polyseed commit
change POLYSEED_COIN to wownero in the fork
update wownero patches
2024-04-22 09:33:21 +02:00

226 lines
8.3 KiB
Diff

From f2484ecd2a8255fab9613cce346ee3c24f4a6ba6 Mon Sep 17 00:00:00 2001
From: tobtoht <tob@featherwallet.org>
Date: Wed, 27 Mar 2024 16:31:36 +0100
Subject: [PATCH 5/9] coin control
---
src/wallet/api/coins.cpp | 62 ++++++++++++++++++++++++++++++++++++
src/wallet/api/coins.h | 4 +++
src/wallet/api/wallet.cpp | 4 +--
src/wallet/api/wallet2_api.h | 3 ++
src/wallet/wallet2.cpp | 22 +++++++++++++
src/wallet/wallet2.h | 4 +++
6 files changed, 97 insertions(+), 2 deletions(-)
diff --git a/src/wallet/api/coins.cpp b/src/wallet/api/coins.cpp
index fe54b82cf..5ce69b5b9 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,26 @@ 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::thaw(int index)
{
try
@@ -120,4 +160,26 @@ namespace Monero {
return m_wallet->m_wallet->is_transfer_unlocked(unlockTime, blockHeight);
}
+ 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());
+ }
+ }
+
} // namespace
diff --git a/src/wallet/api/coins.h b/src/wallet/api/coins.h
index 3293d8ae9..bcd8b517f 100644
--- a/src/wallet/api/coins.h
+++ b/src/wallet/api/coins.h
@@ -18,11 +18,15 @@ namespace Monero {
std::vector<CoinsInfo*> getAll() const override;
void refresh() override;
+ void setFrozen(std::string public_key) override;
void setFrozen(int index) override;
+ void thaw(std::string public_key) override;
void thaw(int index) 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<CoinsInfo*> m_rows;
diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp
index b5c346754..2dad8bc61 100644
--- a/src/wallet/api/wallet.cpp
+++ b/src/wallet/api/wallet.cpp
@@ -2018,11 +2018,11 @@ PendingTransaction *WalletImpl::createTransactionMultDest(const std::vector<stri
if (amount) {
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 5dcaeaaab..347e6d002 100644
--- a/src/wallet/api/wallet2_api.h
+++ b/src/wallet/api/wallet2_api.h
@@ -352,9 +352,12 @@ struct Coins
virtual CoinsInfo * coin(int index) const = 0;
virtual std::vector<CoinsInfo*> getAll() const = 0;
virtual void refresh() = 0;
+ virtual void setFrozen(std::string public_key) = 0;
virtual void setFrozen(int index) = 0;
virtual void thaw(int index) = 0;
+ virtual void thaw(std::string public_key) = 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 2a5f17a9f..2b3eaad2e 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -2094,11 +2094,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));
@@ -2109,6 +2119,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 294a2d1f6..d1e68baac 100644
--- a/src/wallet/wallet2.h
+++ b/src/wallet/wallet2.h
@@ -1563,6 +1563,8 @@ 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);
@@ -1793,7 +1795,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;
--
2.44.0