wallet2_api: support for sweeping all

This commit is contained in:
moneromooo-monero 2016-11-09 12:19:22 +00:00
parent 38727f7d2f
commit 1669621937
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
3 changed files with 33 additions and 11 deletions

View file

@ -540,15 +540,14 @@ int WalletImpl::autoRefreshInterval() const
// - unconfirmed_transfer_details; // - unconfirmed_transfer_details;
// - confirmed_transfer_details) // - confirmed_transfer_details)
PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const string &payment_id, uint64_t amount, uint32_t mixin_count, PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const string &payment_id, optional<uint64_t> amount, uint32_t mixin_count,
PendingTransaction::Priority priority) PendingTransaction::Priority priority)
{ {
clearStatus(); clearStatus();
// Pause refresh thread while creating transaction // Pause refresh thread while creating transaction
pauseRefresh(); pauseRefresh();
vector<cryptonote::tx_destination_entry> dsts; cryptonote::account_public_address addr;
cryptonote::tx_destination_entry de;
// indicates if dst_addr is integrated address (address + payment_id) // indicates if dst_addr is integrated address (address + payment_id)
bool has_payment_id; bool has_payment_id;
@ -561,7 +560,7 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const
PendingTransactionImpl * transaction = new PendingTransactionImpl(*this); PendingTransactionImpl * transaction = new PendingTransactionImpl(*this);
do { do {
if(!cryptonote::get_account_integrated_address_from_str(de.addr, has_payment_id, payment_id_short, m_wallet->testnet(), dst_addr)) { if(!cryptonote::get_account_integrated_address_from_str(addr, has_payment_id, payment_id_short, m_wallet->testnet(), dst_addr)) {
// TODO: copy-paste 'if treating as an address fails, try as url' from simplewallet.cpp:1982 // TODO: copy-paste 'if treating as an address fails, try as url' from simplewallet.cpp:1982
m_status = Status_Error; m_status = Status_Error;
m_errorString = "Invalid destination address"; m_errorString = "Invalid destination address";
@ -595,14 +594,23 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const
} }
} }
de.amount = amount;
dsts.push_back(de);
//std::vector<tools::wallet2::pending_tx> ptx_vector; //std::vector<tools::wallet2::pending_tx> ptx_vector;
try { try {
if (amount) {
vector<cryptonote::tx_destination_entry> dsts;
cryptonote::tx_destination_entry de;
de.addr = addr;
de.amount = *amount;
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 */,
static_cast<uint32_t>(priority), static_cast<uint32_t>(priority),
extra, m_trustedDaemon); extra, m_trustedDaemon);
} else {
transaction->m_pending_tx = m_wallet->create_transactions_all(addr, fake_outs_count, 0 /* unlock_time */,
static_cast<uint32_t>(priority),
extra, m_trustedDaemon);
}
} catch (const tools::error::daemon_busy&) { } catch (const tools::error::daemon_busy&) {
// TODO: make it translatable with "tr"? // TODO: make it translatable with "tr"?

View file

@ -89,7 +89,7 @@ public:
PendingTransaction * createTransaction(const std::string &dst_addr, const std::string &payment_id, PendingTransaction * createTransaction(const std::string &dst_addr, const std::string &payment_id,
uint64_t amount, uint32_t mixin_count, optional<uint64_t> amount, uint32_t mixin_count,
PendingTransaction::Priority priority = PendingTransaction::Priority_Low); PendingTransaction::Priority priority = PendingTransaction::Priority_Low);
virtual PendingTransaction * createSweepUnmixableTransaction(); virtual PendingTransaction * createSweepUnmixableTransaction();

View file

@ -41,6 +41,20 @@ namespace Bitmonero {
namespace Utils { namespace Utils {
bool isAddressLocal(const std::string &hostaddr); bool isAddressLocal(const std::string &hostaddr);
} }
template<typename T>
class optional {
public:
optional(): set(false) {}
optional(const T &t): t(t), set(true) {}
const T &operator*() const { return t; }
T &operator*() { return t; }
operator bool() const { return set; }
private:
T t;
bool set;
};
/** /**
* @brief Transaction-like interface for sending money * @brief Transaction-like interface for sending money
*/ */
@ -332,7 +346,7 @@ struct Wallet
*/ */
virtual PendingTransaction * createTransaction(const std::string &dst_addr, const std::string &payment_id, virtual PendingTransaction * createTransaction(const std::string &dst_addr, const std::string &payment_id,
uint64_t amount, uint32_t mixin_count, optional<uint64_t> amount, uint32_t mixin_count,
PendingTransaction::Priority = PendingTransaction::Priority_Low) = 0; PendingTransaction::Priority = PendingTransaction::Priority_Low) = 0;
/*! /*!