@@ -26,6 +26,7 @@ using namespace std;
26
26
* Settings
27
27
*/
28
28
CFeeRate payTxFee (DEFAULT_TRANSACTION_FEE);
29
+ CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
29
30
unsigned int nTxConfirmTarget = 1 ;
30
31
bool bSpendZeroConfChange = true ;
31
32
bool fSendFreeTransactions = false ;
@@ -1525,27 +1526,32 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend,
1525
1526
}
1526
1527
dPriority = wtxNew.ComputePriority (dPriority, nBytes);
1527
1528
1528
- CAmount nFeeNeeded = GetMinimumFee (nBytes, nTxConfirmTarget, mempool);
1529
+ // Can we complete this as a free transaction?
1530
+ if (fSendFreeTransactions && nBytes <= MAX_FREE_TRANSACTION_CREATE_SIZE)
1531
+ {
1532
+ // Not enough fee: enough priority?
1533
+ double dPriorityNeeded = mempool.estimatePriority (nTxConfirmTarget);
1534
+ // Not enough mempool history to estimate: use hard-coded AllowFree.
1535
+ if (dPriorityNeeded <= 0 && AllowFree (dPriority))
1536
+ break ;
1537
+
1538
+ // Small enough, and priority high enough, to send for free
1539
+ if (dPriorityNeeded > 0 && dPriority >= dPriorityNeeded)
1540
+ break ;
1541
+ }
1529
1542
1530
- if (nFeeRet >= nFeeNeeded)
1531
- break ; // Done, enough fee included.
1543
+ CAmount nFeeNeeded = GetMinimumFee (nBytes, nTxConfirmTarget, mempool);
1532
1544
1533
- // Too big to send for free? Include more fee and try again:
1534
- if (!fSendFreeTransactions || nBytes > MAX_FREE_TRANSACTION_CREATE_SIZE)
1545
+ // If we made it here and we aren't even able to meet the relay fee on the next pass, give up
1546
+ // because we must be at the maximum allowed fee.
1547
+ if (nFeeNeeded < ::minRelayTxFee.GetFee (nBytes))
1535
1548
{
1536
- nFeeRet = nFeeNeeded ;
1537
- continue ;
1549
+ strFailReason = _ ( " Transaction too large for fee policy " ) ;
1550
+ return false ;
1538
1551
}
1539
1552
1540
- // Not enough fee: enough priority?
1541
- double dPriorityNeeded = mempool.estimatePriority (nTxConfirmTarget);
1542
- // Not enough mempool history to estimate: use hard-coded AllowFree.
1543
- if (dPriorityNeeded <= 0 && AllowFree (dPriority))
1544
- break ;
1545
-
1546
- // Small enough, and priority high enough, to send for free
1547
- if (dPriorityNeeded > 0 && dPriority >= dPriorityNeeded)
1548
- break ;
1553
+ if (nFeeRet >= nFeeNeeded)
1554
+ break ; // Done, enough fee included.
1549
1555
1550
1556
// Include more fee and try again.
1551
1557
nFeeRet = nFeeNeeded;
@@ -1617,9 +1623,6 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, unsigned int nConfirmTarge
1617
1623
{
1618
1624
// payTxFee is user-set "I want to pay this much"
1619
1625
CAmount nFeeNeeded = payTxFee.GetFee (nTxBytes);
1620
- // prevent user from paying a non-sense fee (like 1 satoshi): 0 < fee < minRelayFee
1621
- if (nFeeNeeded > 0 && nFeeNeeded < ::minRelayTxFee.GetFee (nTxBytes))
1622
- nFeeNeeded = ::minRelayTxFee.GetFee (nTxBytes);
1623
1626
// user selected total at least (default=true)
1624
1627
if (fPayAtLeastCustomFee && nFeeNeeded > 0 && nFeeNeeded < payTxFee.GetFeePerK ())
1625
1628
nFeeNeeded = payTxFee.GetFeePerK ();
@@ -1630,6 +1633,12 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, unsigned int nConfirmTarge
1630
1633
// back to a hard-coded fee
1631
1634
if (nFeeNeeded == 0 )
1632
1635
nFeeNeeded = minTxFee.GetFee (nTxBytes);
1636
+ // prevent user from paying a non-sense fee (like 1 satoshi): 0 < fee < minRelayFee
1637
+ if (nFeeNeeded < ::minRelayTxFee.GetFee (nTxBytes))
1638
+ nFeeNeeded = ::minRelayTxFee.GetFee (nTxBytes);
1639
+ // But always obey the maximum
1640
+ if (nFeeNeeded > maxTxFee)
1641
+ nFeeNeeded = maxTxFee;
1633
1642
return nFeeNeeded;
1634
1643
}
1635
1644
0 commit comments