diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index 91e93fb7a..e3edc7a1f 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -1360,6 +1360,75 @@ bool WalletImpl::importTransaction(const std::string &txid, std::vectorprintBlockchain(); +} +std::string WalletImpl::printTransfers() +{ + return m_wallet->printTransfers(); +} +std::string WalletImpl::printPayments() +{ + return m_wallet->printPayments(); +} +std::string WalletImpl::printUnconfirmedPayments() +{ + return m_wallet->printUnconfirmedPayments(); +} +std::string WalletImpl::printConfirmedTransferDetails() +{ + return m_wallet->printConfirmedTransferDetails(); +} +std::string WalletImpl::printUnconfirmedTransferDetails() +{ + return m_wallet->printUnconfirmedTransferDetails(); +} +std::string WalletImpl::printPubKeys() +{ + return m_wallet->printPubKeys(); +} +std::string WalletImpl::printTxNotes() +{ + return m_wallet->printTxNotes(); +} +std::string WalletImpl::printSubaddresses() +{ + return m_wallet->printSubaddresses(); +} +std::string WalletImpl::printSubaddressLabels() +{ + return m_wallet->printSubaddressLabels(); +} +std::string WalletImpl::printAdditionalTxKeys() +{ + return m_wallet->printAdditionalTxKeys(); +} +std::string WalletImpl::printAttributes() +{ + return m_wallet->printAttributes(); +} +std::string WalletImpl::printKeyImages() +{ + return m_wallet->printKeyImages(); +} +std::string WalletImpl::printAccountTags() +{ + return m_wallet->printAccountTags(); +} +std::string WalletImpl::printTxKeys() +{ + return m_wallet->printTxKeys(); +} +std::string WalletImpl::printAddressBook() +{ + return m_wallet->printAddressBook(); +} +std::string WalletImpl::printScannedPoolTxs() +{ + return m_wallet->printScannedPoolTxs(); +} + void WalletImpl::addSubaddressAccount(const std::string& label) { m_wallet->add_subaddress_account(label); diff --git a/src/wallet/api/wallet.h b/src/wallet/api/wallet.h index b59c9b907..92cfd1cb4 100644 --- a/src/wallet/api/wallet.h +++ b/src/wallet/api/wallet.h @@ -186,6 +186,24 @@ public: bool importOutputs(const std::string &filename) override; bool importTransaction(const std::string &txid, std::vector &o_indices, uint64_t height, uint8_t block_version, uint64_t ts, bool miner_tx, bool pool, bool double_spend_seen) override; + virtual std::string printBlockchain() override; + virtual std::string printTransfers() override; + virtual std::string printPayments() override; + virtual std::string printUnconfirmedPayments() override; + virtual std::string printConfirmedTransferDetails() override; + virtual std::string printUnconfirmedTransferDetails() override; + virtual std::string printPubKeys() override; + virtual std::string printTxNotes() override; + virtual std::string printSubaddresses() override; + virtual std::string printSubaddressLabels() override; + virtual std::string printAdditionalTxKeys() override; + virtual std::string printAttributes() override; + virtual std::string printKeyImages() override; + virtual std::string printAccountTags() override; + virtual std::string printTxKeys() override; + virtual std::string printAddressBook() override; + virtual std::string printScannedPoolTxs() override; + virtual void disposeTransaction(PendingTransaction * t) override; virtual uint64_t estimateTransactionFee(const std::vector> &destinations, PendingTransaction::Priority priority) const override; diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h index 5731264db..5cf8a0cbd 100644 --- a/src/wallet/api/wallet2_api.h +++ b/src/wallet/api/wallet2_api.h @@ -1064,6 +1064,24 @@ struct Wallet virtual bool importTransaction(const std::string &txid, std::vector &o_indices, uint64_t height, uint8_t block_version, uint64_t ts, bool miner_tx, bool pool, bool double_spend_seen) = 0; + virtual std::string printBlockchain() = 0; + virtual std::string printTransfers() = 0; + virtual std::string printPayments() = 0; + virtual std::string printUnconfirmedPayments() = 0; + virtual std::string printConfirmedTransferDetails() = 0; + virtual std::string printUnconfirmedTransferDetails() = 0; + virtual std::string printPubKeys() = 0; + virtual std::string printTxNotes() = 0; + virtual std::string printSubaddresses() = 0; + virtual std::string printSubaddressLabels() = 0; + virtual std::string printAdditionalTxKeys() = 0; + virtual std::string printAttributes() = 0; + virtual std::string printKeyImages() = 0; + virtual std::string printAccountTags() = 0; + virtual std::string printTxKeys() = 0; + virtual std::string printAddressBook() = 0; + virtual std::string printScannedPoolTxs() = 0; + virtual TransactionHistory * history() = 0; virtual AddressBook * addressBook() = 0; virtual Coins * coins() = 0; diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 419dbaffd..c95a4a7e9 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -5548,6 +5548,315 @@ void wallet2::write_watch_only_wallet(const std::string& wallet_name, const epee bool r = store_keys(new_keys_filename, password, true); THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, new_keys_filename); } + +std::string wallet2::printBlockchain() +{ + std::string blstr; + blstr += "offset: " + std::to_string(m_blockchain.offset()) + "\n"; + blstr += "genesis: " + string_tools::pod_to_hex(m_blockchain.genesis()) + "\n"; + + for (size_t i = m_blockchain.offset(); i < m_blockchain.size(); i++) { + blstr += std::to_string(i) + " : " + string_tools::pod_to_hex(m_blockchain[i]) + "\n"; + } + + return blstr; +} + +std::string wallet2::printTransfers() +{ + std::string str; + for (const auto &td : m_transfers) { + str += "block_height: " + std::to_string(td.m_block_height) + "\n"; + str += printTxPrefix(td.m_tx); + str += "txid: " + string_tools::pod_to_hex(td.m_txid) + "\n"; + str += "internal_output_index: " + std::to_string(td.m_internal_output_index) + "\n"; + str += "global_output_index: " + std::to_string(td.m_global_output_index) + "\n"; + str += "spent: " + std::to_string(td.m_spent) + "\n"; + str += "frozen: " + std::to_string(td.m_frozen) + "\n"; + str += "spent_height: " + std::to_string(td.m_spent_height) + "\n"; + str += "key_image: " + string_tools::pod_to_hex(td.m_key_image) + "\n"; + str += "mask: " + string_tools::pod_to_hex(td.m_mask) + "\n"; + str += "amount: " + std::to_string(td.m_amount) + "\n"; + str += "rct: " + std::to_string(td.m_rct) + "\n"; + str += "key_image_known: " + std::to_string(td.m_key_image_known) + "\n"; + str += "key_image_request: " + std::to_string(td.m_key_image_request) + "\n"; + str += "pk_index: " + std::to_string(td.m_pk_index) + "\n"; + str += "subaddr_index: " + std::to_string(td.m_subaddr_index.major) + "," + std::to_string(td.m_subaddr_index.minor) + "\n"; + str += "key_image_partial: " + std::to_string(td.m_key_image_partial) + "\n"; + str += "multisig_k:\n"; + for (const auto &el : td.m_multisig_k) { + str += " " + string_tools::pod_to_hex(el) + "\n"; + } + + str += "multisig_info:\n"; + for (const auto &el : td.m_multisig_info) { + str += " signer: " + string_tools::pod_to_hex(el.m_signer) + "\n"; + str += " LR:\n"; + for (const auto &em : el.m_LR) { + str += " L: " + string_tools::pod_to_hex(em.m_L) + "\n"; + str += " R: " + string_tools::pod_to_hex(em.m_R) + "\n"; + } + str += "\n"; + str += " partial_key_images:\n"; + for (const auto &em : el.m_partial_key_images) { + str += " " + string_tools::pod_to_hex(em) + "\n"; + } + str += "\n"; + } + + str += "uses:\n"; + for (const auto &el : td.m_uses) { + str += " " + std::to_string(el.first) + " : " + string_tools::pod_to_hex(el.second) + "\n"; + } + str += "\n"; + } + return str; +} + +std::string wallet2::printUnconfirmedPayments() +{ + std::string str; + for (const auto &el : m_unconfirmed_payments) { + auto ppd = el.second; + str += "double_spend_seen: " + std::to_string(ppd.m_double_spend_seen) + "\n"; + str += printPaymentDetails(ppd.m_pd); + str += "\n"; + } + return str; +} + +std::string wallet2::printConfirmedTransferDetails() +{ + std::string str; + for (const auto &el : m_confirmed_txs) { + auto ctd = el.second; + str += "amount_in: " + std::to_string(ctd.m_amount_in) + "\n"; + str += "amount_out: " + std::to_string(ctd.m_amount_out) + "\n"; + str += "change: " + std::to_string(ctd.m_change) + "\n"; + str += "block_height: " + std::to_string(ctd.m_block_height) + "\n"; + str += "dests:\n"; + for (const auto &em : ctd.m_dests) { + str += printTxDestinationEntry(em); + } + str += "payment_id: " + string_tools::pod_to_hex(ctd.m_payment_id) + "\n"; + str += "timestamp: " + std::to_string(ctd.m_timestamp) + "\n"; + str += "unlock_time: " + std::to_string(ctd.m_unlock_time) + "\n"; + str += "subaddr_account: " + std::to_string(ctd.m_subaddr_account) + "\n"; + str += "subaddr_indices: "; + for (auto em : ctd.m_subaddr_indices) { + str += std::to_string(em); + } + str += "\n\n"; + } + return str; +} + +std::string wallet2::printUnconfirmedTransferDetails() +{ + std::string str; + for (const auto &el : m_unconfirmed_txs) { + auto utd = el.second; + str += printTxPrefix(utd.m_tx); + str += "amount_in: " + std::to_string(utd.m_amount_in) + "\n"; + str += "amount_out: " + std::to_string(utd.m_amount_out) + "\n"; + str += "change: " + std::to_string(utd.m_change) + "\n"; + str += "sent_time: " + std::to_string(utd.m_sent_time) + "\n"; + str += "dests:\n"; + for (const auto &em : utd.m_dests) { + str += printTxDestinationEntry(em); + } + str += "payment_id: " + string_tools::pod_to_hex(utd.m_payment_id) + "\n"; + str += "timestamp: " + std::to_string(utd.m_timestamp) + "\n"; + str += "subaddr_account: " + std::to_string(utd.m_subaddr_account) + "\n"; + str += "subaddr_indices: "; + for (auto em : utd.m_subaddr_indices) { + str += std::to_string(em); + } + str += "\n\n"; + } + return str; +} + +std::string wallet2::printPayments() +{ + std::string str; + for (const auto &el : m_payments) { + str += printPaymentDetails(el.second) + "\n"; + } + return str; +} + +std::string wallet2::printPubKeys() +{ + std::string str; + vector> v; + for (const auto &el : m_pub_keys) { + v.push_back(el); + } + std::sort(v.begin(), v.end(), + [](std::pair a, std::pair b){return a.second < b.second;}); + for (const auto &el : v){ + str += string_tools::pod_to_hex(el.first) + " : " + boost::to_string(el.second) + "\n"; + } + return str; +} + +std::string wallet2::printTxNotes() +{ + std::string str; + for (std::pair el : m_tx_notes) { + str += string_tools::pod_to_hex(el.first) + " : " + el.second + "\n"; + } + return str; +} + +std::string wallet2::printSubaddresses() +{ + std::string str; + vector> v; + for (const auto &el : m_subaddresses) { + v.push_back(el); + } + std::sort(v.begin(), v.end(), [](std::pair a, std::pair b) { + if (a.second.major == b.second.major) { + return a.second.minor < b.second.minor; + } + return a.second.major < b.second.major; + }); + for (const auto &el : v) { + str += string_tools::pod_to_hex(el.first) + " : " + std::to_string(el.second.major) + "," + std::to_string(el.second.minor) + "\n"; + } + return str; +} + +std::string wallet2::printSubaddressLabels() +{ + std::string str; + for (size_t i = 0; i < m_subaddress_labels.size(); i++) { + for (size_t j = 0; j < m_subaddress_labels[i].size(); j++) { + str += std::to_string(i) + "," + std::to_string(j) + " : " + m_subaddress_labels[i][j] + "\n"; + } + } + return str; +} + +std::string wallet2::printAdditionalTxKeys() +{ + std::string str; + for (std::pair> el : m_additional_tx_keys) { + str += "Txid: " + string_tools::pod_to_hex(el.first) + " (" + std::to_string(el.second.size()) + ")\n"; + for (auto em : el.second) { + str += " " + string_tools::pod_to_hex(em) + "\n"; + } + } + return str; +} + +std::string wallet2::printAttributes() +{ + std::string str; + for (auto el : m_attributes) { + str += el.first + " : " + el.second + "\n"; + } + return str; +} + +std::string wallet2::printKeyImages() +{ + std::string str; + vector> v; + for (const auto &el : m_key_images) { + v.push_back(el); + } + std::sort(v.begin(), v.end(), [](std::pair a, std::pair b){return a.second < b.second;}); + for (const auto &el: v) { + str += string_tools::pod_to_hex(el.first) + " : " + boost::to_string(el.second) + "\n"; + } + return str; +} + +std::string wallet2::printAccountTags() +{ + std::string str; + for (size_t i = 0; i < m_account_tags.second.size(); i++) { + str += std::to_string(i) + " : " + m_account_tags.second[i] + "\n"; + } + return str; +} + +std::string wallet2::printTxKeys() +{ + std::string str; + for (std::pair el : m_tx_keys) { + str += string_tools::pod_to_hex(el.first) + " : " + string_tools::pod_to_hex(el.second) + "\n"; + } + return str; +} + +std::string wallet2::printAddressBook() +{ + std::string str; + for (auto el : m_address_book) { + str += "address: " + string_tools::pod_to_hex(el.m_address) + "\n"; + str += "payment_id: " + string_tools::pod_to_hex(el.m_payment_id) + "\n"; + str += "description: " + el.m_description + "\n"; + str += "is_subaddress: " + std::to_string(el.m_is_subaddress) + "\n"; + str += "has_payment_id: " + std::to_string(el.m_has_payment_id) + "\n"; + str += "\n"; + } + return str; +} + +std::string wallet2::printScannedPoolTxs() +{ + std::string str; + for (size_t i = 0; i < 2; i++) { + str += "scanned_pool_txs[" + std::to_string(i) + "]\n"; + for (auto el : m_scanned_pool_txs[i]) { + str += string_tools::pod_to_hex(el) + "\n"; + } + str += "\n"; + } + return str; +} + +std::string wallet2::printTxPrefix(const cryptonote::transaction_prefix &tx) +{ + std::string str; + str += "tx.version: " + std::to_string(tx.version) + "\n"; + str += "tx.unlock_time: " + std::to_string(tx.unlock_time) + "\n"; + return str; +} + +std::string wallet2::printPaymentDetails(const payment_details &pd) +{ + std::string str; + str += "tx_hash: " + string_tools::pod_to_hex(pd.m_tx_hash) + "\n"; + str += "amount: " + std::to_string(pd.m_amount) + "\n"; + str += "amounts: "; + for (auto em : pd.m_amounts) { + str += std::to_string(em); + } + str += "\n"; + str += "fee: " + std::to_string(pd.m_fee) + "\n"; + str += "block_height: " + std::to_string(pd.m_block_height) + "\n"; + str += "unlock_time: " + std::to_string(pd.m_unlock_time) + "\n"; + str += "timestamp: " + std::to_string(pd.m_timestamp) + "\n"; + str += "coinbase: " + std::to_string(pd.m_coinbase) + "\n"; + str += "subaddr_index: " + std::to_string(pd.m_subaddr_index.major) + "," + std::to_string(pd.m_subaddr_index.minor) + "\n"; + return str; +} + +std::string wallet2::printTxDestinationEntry(const cryptonote::tx_destination_entry &tx) +{ +std::string str; +str += " original: " + tx.original + "\n"; +str += " amount: " + std::to_string(tx.amount) + "\n"; +str += " addr: " + string_tools::pod_to_hex(tx.addr) + "\n"; +str += " is_subaddress: " + std::to_string(tx.is_subaddress) + "\n"; +str += " is_integrated: " + std::to_string(tx.is_integrated) + "\n"; +return str; +} //---------------------------------------------------------------------------------------------------- void wallet2::wallet_exists(const std::string& file_path, bool& keys_file_exists, bool& wallet_file_exists) { diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 6bb61c58c..f642679d4 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -1529,6 +1529,27 @@ private: uint64_t get_bytes_sent() const; uint64_t get_bytes_received() const; + std::string printBlockchain(); + std::string printTransfers(); + std::string printKeyImages(); + std::string printUnconfirmedTransferDetails(); + std::string printPayments(); + std::string printUnconfirmedPayments(); + std::string printConfirmedTransferDetails(); + std::string printPubKeys(); + std::string printTxNotes(); + std::string printSubaddresses(); + std::string printSubaddressLabels(); + std::string printAdditionalTxKeys(); + std::string printAttributes(); + std::string printAccountTags(); + std::string printTxKeys(); + std::string printAddressBook(); + std::string printScannedPoolTxs(); + std::string printTxPrefix(const cryptonote::transaction_prefix &tx); + std::string printPaymentDetails(const payment_details &pd); + std::string printTxDestinationEntry(const cryptonote::tx_destination_entry &tx); + // MMS ------------------------------------------------------------------------------------------------- mms::message_store& get_message_store() { return m_message_store; }; const mms::message_store& get_message_store() const { return m_message_store; };