66
77#include " addresstablemodel.h"
88#include " guiconstants.h"
9+ #include " guiutil.h"
910#include " paymentserver.h"
1011#include " recentrequeststablemodel.h"
1112#include " transactiontablemodel.h"
@@ -192,8 +193,9 @@ bool WalletModel::validateAddress(const QString &address)
192193WalletModel::SendCoinsReturn WalletModel::prepareTransaction (WalletModelTransaction &transaction, const CCoinControl *coinControl)
193194{
194195 CAmount total = 0 ;
196+ bool fSubtractFeeFromAmount = false ;
195197 QList<SendCoinsRecipient> recipients = transaction.getRecipients ();
196- std::vector<std::pair<CScript, CAmount> > vecSend;
198+ std::vector<CRecipient > vecSend;
197199
198200 if (recipients.empty ())
199201 {
@@ -206,6 +208,9 @@ WalletModel::SendCoinsReturn WalletModel::prepareTransaction(WalletModelTransact
206208 // Pre-check input data for validity
207209 foreach (const SendCoinsRecipient &rcp, recipients)
208210 {
211+ if (rcp.fSubtractFeeFromAmount )
212+ fSubtractFeeFromAmount = true ;
213+
209214 if (rcp.paymentRequest .IsInitialized ())
210215 { // PaymentRequest...
211216 CAmount subtotal = 0 ;
@@ -217,7 +222,9 @@ WalletModel::SendCoinsReturn WalletModel::prepareTransaction(WalletModelTransact
217222 subtotal += out.amount ();
218223 const unsigned char * scriptStr = (const unsigned char *)out.script ().data ();
219224 CScript scriptPubKey (scriptStr, scriptStr+out.script ().size ());
220- vecSend.push_back (std::pair<CScript, CAmount>(scriptPubKey, out.amount ()));
225+ CAmount nAmount = out.amount ();
226+ CRecipient recipient = {scriptPubKey, nAmount, rcp.fSubtractFeeFromAmount };
227+ vecSend.push_back (recipient);
221228 }
222229 if (subtotal <= 0 )
223230 {
@@ -239,7 +246,8 @@ WalletModel::SendCoinsReturn WalletModel::prepareTransaction(WalletModelTransact
239246 ++nAddresses;
240247
241248 CScript scriptPubKey = GetScriptForDestination (CBitcoinAddress (rcp.address .toStdString ()).Get ());
242- vecSend.push_back (std::pair<CScript, CAmount>(scriptPubKey, rcp.amount ));
249+ CRecipient recipient = {scriptPubKey, rcp.amount , rcp.fSubtractFeeFromAmount };
250+ vecSend.push_back (recipient);
243251
244252 total += rcp.amount ;
245253 }
@@ -260,17 +268,21 @@ WalletModel::SendCoinsReturn WalletModel::prepareTransaction(WalletModelTransact
260268 LOCK2 (cs_main, wallet->cs_wallet );
261269
262270 transaction.newPossibleKeyChange (wallet);
271+
263272 CAmount nFeeRequired = 0 ;
273+ int nChangePosRet = -1 ;
264274 std::string strFailReason;
265275
266276 CWalletTx *newTx = transaction.getTransaction ();
267277 CReserveKey *keyChange = transaction.getPossibleKeyChange ();
268- bool fCreated = wallet->CreateTransaction (vecSend, *newTx, *keyChange, nFeeRequired, strFailReason, coinControl);
278+ bool fCreated = wallet->CreateTransaction (vecSend, *newTx, *keyChange, nFeeRequired, nChangePosRet, strFailReason, coinControl);
269279 transaction.setTransactionFee (nFeeRequired);
280+ if (fSubtractFeeFromAmount && fCreated )
281+ transaction.reassignAmounts (nChangePosRet);
270282
271283 if (!fCreated )
272284 {
273- if ((total + nFeeRequired) > nBalance)
285+ if (! fSubtractFeeFromAmount && (total + nFeeRequired) > nBalance)
274286 {
275287 return SendCoinsReturn (AmountWithFeeExceedsBalance);
276288 }
0 commit comments