|
22 | 22 | #include <psbt.h> |
23 | 23 | #include <util/translation.h> |
24 | 24 | #include <wallet/coincontrol.h> |
| 25 | +#include <wallet/util_spend.h> |
25 | 26 | #include <wallet/wallet.h> // for CRecipient |
26 | 27 |
|
27 | 28 | #include <stdint.h> |
@@ -153,6 +154,8 @@ bool WalletModel::validateAddress(const QString& address) const |
153 | 154 |
|
154 | 155 | WalletModel::SendCoinsReturn WalletModel::prepareTransaction(WalletModelTransaction &transaction, const CCoinControl& coinControl) |
155 | 156 | { |
| 157 | + transaction.getWtx() = nullptr; // reset tx output |
| 158 | + |
156 | 159 | CAmount total = 0; |
157 | 160 | bool fSubtractFeeFromAmount = false; |
158 | 161 | QList<SendCoinsRecipient> recipients = transaction.getRecipients(); |
@@ -204,22 +207,20 @@ WalletModel::SendCoinsReturn WalletModel::prepareTransaction(WalletModelTransact |
204 | 207 | } |
205 | 208 |
|
206 | 209 | try { |
207 | | - CAmount nFeeRequired = 0; |
208 | | - int nChangePosRet = -1; |
209 | | - |
210 | 210 | auto& newTx = transaction.getWtx(); |
211 | | - const auto& res = m_wallet->createTransaction(vecSend, coinControl, /*sign=*/!wallet().privateKeysDisabled(), nChangePosRet, nFeeRequired); |
212 | | - newTx = res ? *res : nullptr; |
213 | | - transaction.setTransactionFee(nFeeRequired); |
214 | | - if (fSubtractFeeFromAmount && newTx) |
215 | | - transaction.reassignAmounts(nChangePosRet); |
216 | | - |
217 | | - if (!newTx) { |
| 211 | + const auto& res = m_wallet->createTransaction(vecSend, coinControl, /*sign=*/!wallet().privateKeysDisabled(), /*change_pos=*/std::nullopt); |
| 212 | + if (!res) { |
218 | 213 | Q_EMIT message(tr("Send Coins"), QString::fromStdString(util::ErrorString(res).translated), |
219 | | - CClientUIInterface::MSG_ERROR); |
| 214 | + CClientUIInterface::MSG_ERROR); |
220 | 215 | return TransactionCreationFailed; |
221 | 216 | } |
222 | 217 |
|
| 218 | + newTx = res->tx; |
| 219 | + CAmount nFeeRequired = res->fee; |
| 220 | + transaction.setTransactionFee(nFeeRequired); |
| 221 | + if (fSubtractFeeFromAmount && newTx) |
| 222 | + transaction.reassignAmounts(res->change_pos ? int(*res->change_pos) : -1); |
| 223 | + |
223 | 224 | // Reject absurdly high fee. (This can never happen because the |
224 | 225 | // wallet never creates transactions with fee greater than |
225 | 226 | // m_default_max_tx_fee. This merely a belt-and-suspenders check). |
|
0 commit comments