aboutsummaryrefslogtreecommitdiff
path: root/src/wallet
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2016-11-23 20:10:34 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2016-11-23 20:27:22 +0000
commit92dea04929e8a9c737707f1e4ab3cb62d60bfeb4 (patch)
treec7a20759f658c5a8472886897cce6fb49cb6b304 /src/wallet
parentMerge pull request #1346 (diff)
downloadmonero-92dea04929e8a9c737707f1e4ab3cb62d60bfeb4.tar.xz
wallet2: fix wrong change being recorded for cold signed txes
Diffstat (limited to 'src/wallet')
-rw-r--r--src/wallet/wallet2.cpp6
-rw-r--r--src/wallet/wallet2.h8
2 files changed, 11 insertions, 3 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 15a134257..2233bbaf4 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -2730,7 +2730,7 @@ void wallet2::add_unconfirmed_tx(const cryptonote::transaction& tx, uint64_t amo
utd.m_amount_out = 0;
for (const auto &d: dests)
utd.m_amount_out += d.amount;
- utd.m_amount_out += change_amount;
+ utd.m_amount_out += change_amount; // dests does not contain change
utd.m_change = change_amount;
utd.m_sent_time = time(NULL);
utd.m_tx = (const cryptonote::transaction_prefix&)tx;
@@ -3057,7 +3057,7 @@ bool wallet2::sign_tx(const std::string &unsigned_filename, const std::string &s
ptx.change_dts = sd.change_dts;
ptx.selected_transfers = sd.selected_transfers;
ptx.tx_key = rct::rct2sk(rct::identity()); // don't send it back to the untrusted view wallet
- ptx.dests = sd.splitted_dsts;
+ ptx.dests = sd.dests;
ptx.construction_data = sd;
txs.push_back(ptx);
@@ -3656,6 +3656,7 @@ void wallet2::transfer_selected(const std::vector<cryptonote::tx_destination_ent
ptx.construction_data.extra = tx.extra;
ptx.construction_data.unlock_time = unlock_time;
ptx.construction_data.use_rct = false;
+ ptx.construction_data.dests = dsts;
}
void wallet2::transfer_selected_rct(std::vector<cryptonote::tx_destination_entry> dsts, const std::list<size_t> selected_transfers, size_t fake_outputs_count,
@@ -3776,6 +3777,7 @@ void wallet2::transfer_selected_rct(std::vector<cryptonote::tx_destination_entry
ptx.construction_data.extra = tx.extra;
ptx.construction_data.unlock_time = unlock_time;
ptx.construction_data.use_rct = true;
+ ptx.construction_data.dests = dsts;
}
static size_t estimate_rct_tx_size(int n_inputs, int mixin, int n_outputs)
diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h
index 6168873d5..9e36828c1 100644
--- a/src/wallet/wallet2.h
+++ b/src/wallet/wallet2.h
@@ -191,11 +191,12 @@ namespace tools
{
std::vector<cryptonote::tx_source_entry> sources;
cryptonote::tx_destination_entry change_dts;
- std::vector<cryptonote::tx_destination_entry> splitted_dsts;
+ std::vector<cryptonote::tx_destination_entry> splitted_dsts; // split, includes change
std::list<size_t> selected_transfers;
std::vector<uint8_t> extra;
uint64_t unlock_time;
bool use_rct;
+ std::vector<cryptonote::tx_destination_entry> dests; // original setup, does not include change
BEGIN_SERIALIZE_OBJECT()
FIELD(sources)
@@ -205,12 +206,16 @@ namespace tools
FIELD(extra)
VARINT_FIELD(unlock_time)
FIELD(use_rct)
+ FIELD(dests)
END_SERIALIZE()
};
typedef std::vector<transfer_details> transfer_container;
typedef std::unordered_multimap<crypto::hash, payment_details> payment_container;
+ // The convention for destinations is:
+ // dests does not include change
+ // splitted_dsts (in construction_data) does
struct pending_tx
{
cryptonote::transaction tx;
@@ -1047,6 +1052,7 @@ namespace tools
ptx.construction_data.extra = tx.extra;
ptx.construction_data.unlock_time = unlock_time;
ptx.construction_data.use_rct = false;
+ ptx.construction_data.dests = dsts;
}