diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -39,7 +39,6 @@ namespace interfaces { class Handler; -class PendingWalletTx; struct WalletAddress; struct WalletBalances; struct WalletTx; @@ -151,12 +150,17 @@ virtual void listLockedCoins(std::vector &outputs) = 0; //! Create transaction. - virtual std::unique_ptr + virtual CTransactionRef createTransaction(const std::vector &recipients, const CCoinControl &coin_control, bool sign, int &change_pos, Amount &fee, std::string &fail_reason) = 0; + //! Commit transaction. + virtual bool commitTransaction(CTransactionRef tx, WalletValueMap value_map, + WalletOrderForm order_form, + std::string &reject_reason) = 0; + //! Return whether transaction can be abandoned. virtual bool transactionCanBeAbandoned(const TxId &txid) = 0; @@ -283,20 +287,6 @@ handleCanGetAddressesChanged(CanGetAddressesChangedFn fn) = 0; }; -//! Tracking object returned by CreateTransaction and passed to -//! CommitTransaction. -class PendingWalletTx { -public: - virtual ~PendingWalletTx() {} - - //! Get transaction data. - virtual const CTransaction &get() = 0; - - //! Send pending transaction and commit to wallet. - virtual bool commit(WalletValueMap value_map, WalletOrderForm order_form, - std::string &reject_reason) = 0; -}; - //! Information about one wallet address. struct WalletAddress { CTxDestination dest; diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -26,29 +26,6 @@ namespace interfaces { namespace { - class PendingWalletTxImpl : public PendingWalletTx { - public: - explicit PendingWalletTxImpl(CWallet &wallet) : m_wallet(wallet) {} - - const CTransaction &get() override { return *m_tx; } - - bool commit(WalletValueMap value_map, WalletOrderForm order_form, - std::string &reject_reason) override { - auto locked_chain = m_wallet.chain().lock(); - LOCK(m_wallet.cs_wallet); - CValidationState state; - if (!m_wallet.CommitTransaction(m_tx, std::move(value_map), - std::move(order_form), state)) { - reject_reason = state.GetRejectReason(); - return false; - } - return true; - } - - CTransactionRef m_tx; - CWallet &m_wallet; - }; - //! Construct wallet tx struct. static WalletTx MakeWalletTx(interfaces::Chain::Lock &locked_chain, CWallet &wallet, const CWalletTx &wtx) { @@ -236,20 +213,34 @@ LOCK(m_wallet->cs_wallet); return m_wallet->ListLockedCoins(outputs); } - std::unique_ptr + CTransactionRef createTransaction(const std::vector &recipients, const CCoinControl &coin_control, bool sign, int &change_pos, Amount &fee, std::string &fail_reason) override { auto locked_chain = m_wallet->chain().lock(); LOCK(m_wallet->cs_wallet); - auto pending = std::make_unique(*m_wallet); - if (!m_wallet->CreateTransaction(*locked_chain, recipients, - pending->m_tx, fee, change_pos, - fail_reason, coin_control, sign)) { + CTransactionRef tx; + if (!m_wallet->CreateTransaction(*locked_chain, recipients, tx, fee, + change_pos, fail_reason, + coin_control, sign)) { return {}; } - return pending; + return tx; + } + bool commitTransaction(CTransactionRef tx, WalletValueMap value_map, + WalletOrderForm order_form, + std::string &reject_reason) override { + auto locked_chain = m_wallet->chain().lock(); + LOCK(m_wallet->cs_wallet); + CValidationState state; + if (!m_wallet->CommitTransaction(std::move(tx), + std::move(value_map), + std::move(order_form), state)) { + reject_reason = state.GetRejectReason(); + return false; + } + return true; } bool transactionCanBeAbandoned(const TxId &txid) override { return m_wallet->TransactionCanBeAbandoned(txid); diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -413,7 +413,7 @@ accept(); CoinControlDialog::coinControl()->UnSelectAll(); coinControlUpdateLabels(); - Q_EMIT coinsSent(currentTransaction.getWtx()->get().GetId()); + Q_EMIT coinsSent(currentTransaction.getWtx()->GetId()); } fNewRecipientAllowed = true; } diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -257,14 +257,14 @@ auto &newTx = transaction.getWtx(); std::string rejectReason; - if (!newTx->commit({} /* mapValue */, std::move(vOrderForm), - rejectReason)) { + if (!wallet().commitTransaction(newTx, {} /* mapValue */, + std::move(vOrderForm), rejectReason)) { return SendCoinsReturn(TransactionCommitFailed, QString::fromStdString(rejectReason)); } CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); - ssTx << newTx->get(); + ssTx << *newTx; transaction_array.append(&(ssTx[0]), ssTx.size()); // Add addresses / update labels that we've sent to the address book, and diff --git a/src/qt/walletmodeltransaction.h b/src/qt/walletmodeltransaction.h --- a/src/qt/walletmodeltransaction.h +++ b/src/qt/walletmodeltransaction.h @@ -15,7 +15,6 @@ namespace interfaces { class Node; -class PendingWalletTx; } // namespace interfaces /** Data model for a walletmodel transaction. */ @@ -26,7 +25,7 @@ QList getRecipients() const; - std::unique_ptr &getWtx(); + CTransactionRef &getWtx(); unsigned int getTransactionSize(); void setTransactionFee(const Amount newFee); @@ -39,7 +38,7 @@ private: QList recipients; - std::unique_ptr wtx; + CTransactionRef wtx; Amount fee; }; diff --git a/src/qt/walletmodeltransaction.cpp b/src/qt/walletmodeltransaction.cpp --- a/src/qt/walletmodeltransaction.cpp +++ b/src/qt/walletmodeltransaction.cpp @@ -18,12 +18,12 @@ return recipients; } -std::unique_ptr &WalletModelTransaction::getWtx() { +CTransactionRef &WalletModelTransaction::getWtx() { return wtx; } unsigned int WalletModelTransaction::getTransactionSize() { - return wtx ? wtx->get().GetTotalSize() : 0; + return wtx ? wtx->GetTotalSize() : 0; } Amount WalletModelTransaction::getTransactionFee() const { @@ -35,7 +35,7 @@ } void WalletModelTransaction::reassignAmounts(int nChangePosRet) { - const CTransaction *walletTransaction = &wtx->get(); + const CTransaction *walletTransaction = wtx.get(); int i = 0; for (SendCoinsRecipient &rcp : recipients) { #ifdef ENABLE_BIP70