core, wallet: remember original text version of destination address
This commit is contained in:
parent
a9b1c04acf
commit
b7441c4a32
|
@ -73,17 +73,22 @@ namespace cryptonote
|
||||||
|
|
||||||
struct tx_destination_entry
|
struct tx_destination_entry
|
||||||
{
|
{
|
||||||
|
std::string original;
|
||||||
uint64_t amount; //money
|
uint64_t amount; //money
|
||||||
account_public_address addr; //destination address
|
account_public_address addr; //destination address
|
||||||
bool is_subaddress;
|
bool is_subaddress;
|
||||||
|
bool is_integrated;
|
||||||
|
|
||||||
tx_destination_entry() : amount(0), addr(AUTO_VAL_INIT(addr)), is_subaddress(false) { }
|
tx_destination_entry() : amount(0), addr(AUTO_VAL_INIT(addr)), is_subaddress(false), is_integrated(false) { }
|
||||||
tx_destination_entry(uint64_t a, const account_public_address &ad, bool is_subaddress) : amount(a), addr(ad), is_subaddress(is_subaddress) { }
|
tx_destination_entry(uint64_t a, const account_public_address &ad, bool is_subaddress) : amount(a), addr(ad), is_subaddress(is_subaddress), is_integrated(false) { }
|
||||||
|
tx_destination_entry(const std::string &o, uint64_t a, const account_public_address &ad, bool is_subaddress) : original(o), amount(a), addr(ad), is_subaddress(is_subaddress), is_integrated(false) { }
|
||||||
|
|
||||||
BEGIN_SERIALIZE_OBJECT()
|
BEGIN_SERIALIZE_OBJECT()
|
||||||
|
FIELD(original)
|
||||||
VARINT_FIELD(amount)
|
VARINT_FIELD(amount)
|
||||||
FIELD(addr)
|
FIELD(addr)
|
||||||
FIELD(is_subaddress)
|
FIELD(is_subaddress)
|
||||||
|
FIELD(is_integrated)
|
||||||
END_SERIALIZE()
|
END_SERIALIZE()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -102,7 +107,7 @@ namespace cryptonote
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_CLASS_VERSION(cryptonote::tx_source_entry, 1)
|
BOOST_CLASS_VERSION(cryptonote::tx_source_entry, 1)
|
||||||
BOOST_CLASS_VERSION(cryptonote::tx_destination_entry, 1)
|
BOOST_CLASS_VERSION(cryptonote::tx_destination_entry, 2)
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
|
@ -132,6 +137,13 @@ namespace boost
|
||||||
if (ver < 1)
|
if (ver < 1)
|
||||||
return;
|
return;
|
||||||
a & x.is_subaddress;
|
a & x.is_subaddress;
|
||||||
|
if (ver < 2)
|
||||||
|
{
|
||||||
|
x.is_integrated = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
a & x.original;
|
||||||
|
a & x.is_integrated;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5394,6 +5394,7 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
|
||||||
info.has_payment_id = true;
|
info.has_payment_id = true;
|
||||||
}
|
}
|
||||||
de.amount = amount;
|
de.amount = amount;
|
||||||
|
de.original = local_args[i];
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
else if (i + 1 < local_args.size())
|
else if (i + 1 < local_args.size())
|
||||||
|
@ -5406,6 +5407,7 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
|
||||||
", " << tr("expected number from 0 to ") << print_money(std::numeric_limits<uint64_t>::max());
|
", " << tr("expected number from 0 to ") << print_money(std::numeric_limits<uint64_t>::max());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
de.original = local_args[i];
|
||||||
i += 2;
|
i += 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -5424,6 +5426,7 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
|
||||||
}
|
}
|
||||||
de.addr = info.address;
|
de.addr = info.address;
|
||||||
de.is_subaddress = info.is_subaddress;
|
de.is_subaddress = info.is_subaddress;
|
||||||
|
de.is_integrated = info.has_payment_id;
|
||||||
num_subaddresses += info.is_subaddress;
|
num_subaddresses += info.is_subaddress;
|
||||||
|
|
||||||
if (info.has_payment_id || !payment_id_uri.empty())
|
if (info.has_payment_id || !payment_id_uri.empty())
|
||||||
|
|
|
@ -1407,9 +1407,11 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const
|
||||||
if (amount) {
|
if (amount) {
|
||||||
vector<cryptonote::tx_destination_entry> dsts;
|
vector<cryptonote::tx_destination_entry> dsts;
|
||||||
cryptonote::tx_destination_entry de;
|
cryptonote::tx_destination_entry de;
|
||||||
|
de.original = dst_addr;
|
||||||
de.addr = info.address;
|
de.addr = info.address;
|
||||||
de.amount = *amount;
|
de.amount = *amount;
|
||||||
de.is_subaddress = info.is_subaddress;
|
de.is_subaddress = info.is_subaddress;
|
||||||
|
de.is_integrated = info.has_payment_id;
|
||||||
dsts.push_back(de);
|
dsts.push_back(de);
|
||||||
transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */,
|
transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */,
|
||||||
adjusted_priority,
|
adjusted_priority,
|
||||||
|
|
|
@ -8732,15 +8732,16 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
|
||||||
|
|
||||||
TX() : weight(0), needed_fee(0) {}
|
TX() : weight(0), needed_fee(0) {}
|
||||||
|
|
||||||
void add(const account_public_address &addr, bool is_subaddress, uint64_t amount, unsigned int original_output_index, bool merge_destinations) {
|
void add(const cryptonote::tx_destination_entry &de, uint64_t amount, unsigned int original_output_index, bool merge_destinations) {
|
||||||
if (merge_destinations)
|
if (merge_destinations)
|
||||||
{
|
{
|
||||||
std::vector<cryptonote::tx_destination_entry>::iterator i;
|
std::vector<cryptonote::tx_destination_entry>::iterator i;
|
||||||
i = std::find_if(dsts.begin(), dsts.end(), [&](const cryptonote::tx_destination_entry &d) { return !memcmp (&d.addr, &addr, sizeof(addr)); });
|
i = std::find_if(dsts.begin(), dsts.end(), [&](const cryptonote::tx_destination_entry &d) { return !memcmp (&d.addr, &de.addr, sizeof(de.addr)); });
|
||||||
if (i == dsts.end())
|
if (i == dsts.end())
|
||||||
{
|
{
|
||||||
dsts.push_back(tx_destination_entry(0,addr,is_subaddress));
|
dsts.push_back(de);
|
||||||
i = dsts.end() - 1;
|
i = dsts.end() - 1;
|
||||||
|
i->amount = 0;
|
||||||
}
|
}
|
||||||
i->amount += amount;
|
i->amount += amount;
|
||||||
}
|
}
|
||||||
|
@ -8749,8 +8750,11 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
|
||||||
THROW_WALLET_EXCEPTION_IF(original_output_index > dsts.size(), error::wallet_internal_error,
|
THROW_WALLET_EXCEPTION_IF(original_output_index > dsts.size(), error::wallet_internal_error,
|
||||||
std::string("original_output_index too large: ") + std::to_string(original_output_index) + " > " + std::to_string(dsts.size()));
|
std::string("original_output_index too large: ") + std::to_string(original_output_index) + " > " + std::to_string(dsts.size()));
|
||||||
if (original_output_index == dsts.size())
|
if (original_output_index == dsts.size())
|
||||||
dsts.push_back(tx_destination_entry(0,addr,is_subaddress));
|
{
|
||||||
THROW_WALLET_EXCEPTION_IF(memcmp(&dsts[original_output_index].addr, &addr, sizeof(addr)), error::wallet_internal_error, "Mismatched destination address");
|
dsts.push_back(de);
|
||||||
|
dsts.back().amount = 0;
|
||||||
|
}
|
||||||
|
THROW_WALLET_EXCEPTION_IF(memcmp(&dsts[original_output_index].addr, &de.addr, sizeof(de.addr)), error::wallet_internal_error, "Mismatched destination address");
|
||||||
dsts[original_output_index].amount += amount;
|
dsts[original_output_index].amount += amount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9018,7 +9022,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
|
||||||
// we can fully pay that destination
|
// we can fully pay that destination
|
||||||
LOG_PRINT_L2("We can fully pay " << get_account_address_as_str(m_nettype, dsts[0].is_subaddress, dsts[0].addr) <<
|
LOG_PRINT_L2("We can fully pay " << get_account_address_as_str(m_nettype, dsts[0].is_subaddress, dsts[0].addr) <<
|
||||||
" for " << print_money(dsts[0].amount));
|
" for " << print_money(dsts[0].amount));
|
||||||
tx.add(dsts[0].addr, dsts[0].is_subaddress, dsts[0].amount, original_output_index, m_merge_destinations);
|
tx.add(dsts[0], dsts[0].amount, original_output_index, m_merge_destinations);
|
||||||
available_amount -= dsts[0].amount;
|
available_amount -= dsts[0].amount;
|
||||||
dsts[0].amount = 0;
|
dsts[0].amount = 0;
|
||||||
pop_index(dsts, 0);
|
pop_index(dsts, 0);
|
||||||
|
@ -9029,7 +9033,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
|
||||||
// we can partially fill that destination
|
// we can partially fill that destination
|
||||||
LOG_PRINT_L2("We can partially pay " << get_account_address_as_str(m_nettype, dsts[0].is_subaddress, dsts[0].addr) <<
|
LOG_PRINT_L2("We can partially pay " << get_account_address_as_str(m_nettype, dsts[0].is_subaddress, dsts[0].addr) <<
|
||||||
" for " << print_money(available_amount) << "/" << print_money(dsts[0].amount));
|
" for " << print_money(available_amount) << "/" << print_money(dsts[0].amount));
|
||||||
tx.add(dsts[0].addr, dsts[0].is_subaddress, available_amount, original_output_index, m_merge_destinations);
|
tx.add(dsts[0], available_amount, original_output_index, m_merge_destinations);
|
||||||
dsts[0].amount -= available_amount;
|
dsts[0].amount -= available_amount;
|
||||||
available_amount = 0;
|
available_amount = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -644,9 +644,11 @@ namespace tools
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
de.original = it->address;
|
||||||
de.addr = info.address;
|
de.addr = info.address;
|
||||||
de.is_subaddress = info.is_subaddress;
|
de.is_subaddress = info.is_subaddress;
|
||||||
de.amount = it->amount;
|
de.amount = it->amount;
|
||||||
|
de.is_integrated = info.has_payment_id;
|
||||||
dsts.push_back(de);
|
dsts.push_back(de);
|
||||||
|
|
||||||
if (info.has_payment_id)
|
if (info.has_payment_id)
|
||||||
|
|
Loading…
Reference in New Issue