diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2015-11-22 12:13:59 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2015-11-22 12:13:59 +0000 |
commit | b3d4d41e290c1a36ad39c85c2b5de284c0291297 (patch) | |
tree | 4dee04fd1d4d36ef5b74cd2b70a586eaa8ef73c6 /src/wallet | |
parent | wallet: use incoming blocks to keep track of payments too (diff) | |
download | monero-b3d4d41e290c1a36ad39c85c2b5de284c0291297.tar.xz |
wallet: improve show_transfers
More information is now saved and displayed
Diffstat (limited to 'src/wallet')
-rw-r--r-- | src/wallet/wallet2.cpp | 39 | ||||
-rw-r--r-- | src/wallet/wallet2.h | 31 |
2 files changed, 64 insertions, 6 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index f01373644..d4c55b3aa 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1225,12 +1225,14 @@ uint64_t wallet2::select_transfers(uint64_t needed_money, bool add_dust, uint64_ return found_money; } //---------------------------------------------------------------------------------------------------- -void wallet2::add_unconfirmed_tx(const cryptonote::transaction& tx, uint64_t change_amount) +void wallet2::add_unconfirmed_tx(const cryptonote::transaction& tx, const std::vector<cryptonote::tx_destination_entry> &dests, const crypto::hash &payment_id, uint64_t change_amount) { unconfirmed_transfer_details& utd = m_unconfirmed_txs[cryptonote::get_transaction_hash(tx)]; utd.m_change = change_amount; utd.m_sent_time = time(NULL); utd.m_tx = tx; + utd.m_dests = dests; + utd.m_payment_id = payment_id; } //---------------------------------------------------------------------------------------------------- @@ -1364,6 +1366,30 @@ std::string wallet2::address_from_txt_record(const std::string& s) return std::string(); } +crypto::hash wallet2::get_payment_id(const pending_tx &ptx) const +{ + std::vector<tx_extra_field> tx_extra_fields; + if(!parse_tx_extra(ptx.tx.extra, tx_extra_fields)) + return cryptonote::null_hash; + tx_extra_nonce extra_nonce; + crypto::hash payment_id = null_hash; + if (find_tx_extra_field_by_type(tx_extra_fields, extra_nonce)) + { + crypto::hash8 payment_id8 = null_hash8; + if(get_encrypted_payment_id_from_tx_extra_nonce(extra_nonce.nonce, payment_id8)) + { + if (decrypt_payment_id(payment_id8, ptx.dests[0].addr.m_view_public_key, ptx.tx_key)) + { + memcpy(payment_id.data, payment_id8.data, 8); + } + } + else if (!get_payment_id_from_tx_extra_nonce(extra_nonce.nonce, payment_id)) + { + payment_id = cryptonote::null_hash; + } + } + return payment_id; +} //---------------------------------------------------------------------------------------------------- // take a pending tx and actually send it to the daemon void wallet2::commit_tx(pending_tx& ptx) @@ -1380,7 +1406,14 @@ void wallet2::commit_tx(pending_tx& ptx) THROW_WALLET_EXCEPTION_IF(daemon_send_resp.status != CORE_RPC_STATUS_OK, error::tx_rejected, ptx.tx, daemon_send_resp.status); txid = get_transaction_hash(ptx.tx); - add_unconfirmed_tx(ptx.tx, ptx.change_dts.amount); + crypto::hash payment_id = cryptonote::null_hash; + std::vector<cryptonote::tx_destination_entry> dests; + if (store_tx_keys()) + { + payment_id = get_payment_id(ptx); + dests = ptx.dests; + } + add_unconfirmed_tx(ptx.tx, dests, payment_id, ptx.change_dts.amount); if (store_tx_keys()) m_tx_keys.insert(std::make_pair(txid, ptx.tx_key)); @@ -1658,6 +1691,7 @@ void wallet2::transfer_selected(const std::vector<cryptonote::tx_destination_ent ptx.change_dts = change_dts; ptx.selected_transfers = selected_transfers; ptx.tx_key = tx_key; + ptx.dests = dsts; } // Another implementation of transaction creation that is hopefully better @@ -2006,6 +2040,7 @@ void wallet2::transfer_dust(size_t num_outputs, uint64_t unlock_time, uint64_t n ptx.change_dts = change_dts; ptx.selected_transfers = selected_transfers; ptx.tx_key = tx_key; + ptx.dests = dsts; } //---------------------------------------------------------------------------------------------------- diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 70f34c91e..803312eea 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -107,6 +107,8 @@ namespace tools cryptonote::transaction m_tx; uint64_t m_change; time_t m_sent_time; + std::vector<cryptonote::tx_destination_entry> m_dests; + crypto::hash m_payment_id; }; struct confirmed_transfer_details @@ -115,9 +117,12 @@ namespace tools uint64_t m_amount_out; uint64_t m_change; uint64_t m_block_height; - confirmed_transfer_details(): m_amount_in(0), m_amount_out(0), m_change((uint64_t)-1), m_block_height(0) {} + std::vector<cryptonote::tx_destination_entry> m_dests; + crypto::hash m_payment_id; + + confirmed_transfer_details(): m_amount_in(0), m_amount_out(0), m_change((uint64_t)-1), m_block_height(0), m_payment_id(cryptonote::null_hash) {} confirmed_transfer_details(const unconfirmed_transfer_details &utd, uint64_t height): - m_amount_out(get_outs_money_amount(utd.m_tx)), m_change(utd.m_change), m_block_height(height) { get_inputs_money_amount(utd.m_tx, m_amount_in); } + m_amount_out(get_outs_money_amount(utd.m_tx)), m_change(utd.m_change), m_block_height(height), m_dests(utd.m_dests), m_payment_id(utd.m_payment_id) { get_inputs_money_amount(utd.m_tx, m_amount_in); } }; typedef std::vector<transfer_details> transfer_container; @@ -131,6 +136,7 @@ namespace tools std::list<transfer_container::iterator> selected_transfers; std::string key_images; crypto::secret_key tx_key; + std::vector<cryptonote::tx_destination_entry> dests; }; struct keys_file_data @@ -342,10 +348,11 @@ namespace tools bool prepare_file_names(const std::string& file_path); void process_unconfirmed(const cryptonote::transaction& tx, uint64_t height); void process_outgoing(const cryptonote::transaction& tx, uint64_t height, uint64_t spent, uint64_t received); - void add_unconfirmed_tx(const cryptonote::transaction& tx, uint64_t change_amount); + void add_unconfirmed_tx(const cryptonote::transaction& tx, const std::vector<cryptonote::tx_destination_entry> &dests, const crypto::hash &payment_id, uint64_t change_amount); void generate_genesis(cryptonote::block& b); void check_genesis(const crypto::hash& genesis_hash) const; //throws bool generate_chacha8_key_from_secret_keys(crypto::chacha8_key &key) const; + crypto::hash get_payment_id(const pending_tx &ptx) const; cryptonote::account_base m_account; std::string m_daemon_address; @@ -377,7 +384,7 @@ namespace tools uint32_t m_default_mixin; }; } -BOOST_CLASS_VERSION(tools::wallet2, 9) +BOOST_CLASS_VERSION(tools::wallet2, 10) namespace boost { @@ -400,6 +407,10 @@ namespace boost a & x.m_change; a & x.m_sent_time; a & x.m_tx; + if (ver < 9) + return; + a & x.m_dests; + a & x.m_payment_id; } template <class Archive> @@ -409,6 +420,10 @@ namespace boost a & x.m_amount_out; a & x.m_change; a & x.m_block_height; + if (ver < 9) + return; + a & x.m_dests; + a & x.m_payment_id; } template <class Archive> @@ -419,6 +434,13 @@ namespace boost a & x.m_block_height; a & x.m_unlock_time; } + + template <class Archive> + inline void serialize(Archive& a, cryptonote::tx_destination_entry& x, const boost::serialization::version_type ver) + { + a & x.amount; + a & x.addr; + } } } @@ -629,6 +651,7 @@ namespace tools ptx.change_dts = change_dts; ptx.selected_transfers = selected_transfers; ptx.tx_key = tx_key; + ptx.dests = dsts; } |