diff --git a/src/config.h b/src/config.h --- a/src/config.h +++ b/src/config.h @@ -28,6 +28,9 @@ virtual void SetExcessUTXOCharge(Amount amt) = 0; virtual Amount GetExcessUTXOCharge() const = 0; + + virtual void SetMinFeePerKB(CFeeRate amt) = 0; + virtual CFeeRate GetMinFeePerKB() const = 0; }; class GlobalConfig final : public Config { @@ -44,9 +47,16 @@ void SetExcessUTXOCharge(Amount) override; Amount GetExcessUTXOCharge() const override; + void SetMinFeePerKB(CFeeRate amt) override; + CFeeRate GetMinFeePerKB() const override; + private: bool useCashAddr; Amount excessUTXOCharge; + +private: + bool useCashAddr; + CFeeRate feePerKB; }; // Dummy for subclassing in unittests @@ -70,6 +80,9 @@ void SetExcessUTXOCharge(Amount amt) override {} Amount GetExcessUTXOCharge() const override { return Amount(0); } + void SetMinFeePerKB(CFeeRate amt) override{}; + CFeeRate GetMinFeePerKB() const override { return CFeeRate(Amount(0)); } + private: std::unique_ptr chainParams; }; diff --git a/src/config.cpp b/src/config.cpp --- a/src/config.cpp +++ b/src/config.cpp @@ -70,4 +70,7 @@ Amount GlobalConfig::GetExcessUTXOCharge() const { return excessUTXOCharge; -} + + void GlobalConfig::SetMinFeePerKB(CFeeRate fee) { feePerKB = fee; } + + CFeeRate GlobalConfig::GetMinFeePerKB() const { return feePerKB; } diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -1583,13 +1583,9 @@ return InitError(AmountErrMsg("minrelaytxfee", gArgs.GetArg("-minrelaytxfee", ""))); // High fee check is done afterward in CWallet::ParameterInteraction() - ::minRelayTxFee = CFeeRate(n); - } else if (incrementalRelayFee > ::minRelayTxFee) { - // Allow only setting incrementalRelayFee to control both - ::minRelayTxFee = incrementalRelayFee; - LogPrintf( - "Increasing minrelaytxfee to %s to match incrementalrelayfee\n", - ::minRelayTxFee.ToString()); + config.SetMinFeePerKB(CFeeRate(n)); + } else { + config.SetMinFeePerKB(CFeeRate(DEFAULT_MIN_RELAY_TX_FEE)); } // Sanity check argument for min fee for including tx in block diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3799,8 +3799,8 @@ // If we don't allow free transactions, then we always have a fee // filter of at least minRelayTxFee if (gArgs.GetArg("-limitfreerelay", DEFAULT_LIMITFREERELAY) <= 0) { - filterToSend = - std::max(filterToSend, ::minRelayTxFee.GetFeePerK()); + filterToSend = std::max(filterToSend, + config.GetMinFeePerKB().GetFeePerK()); } if (filterToSend != pto->lastSentFeeFilter) { diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -126,8 +126,8 @@ } obj.push_back(Pair("paytxfee", ValueFromAmount(payTxFee.GetFeePerK()))); #endif - obj.push_back( - Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK()))); + obj.push_back(Pair("relayfee", + ValueFromAmount(config.GetMinFeePerKB().GetFeePerK()))); obj.push_back(Pair("errors", GetWarnings("statusbar"))); return obj; } diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -567,8 +567,8 @@ (int)g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL))); } obj.push_back(Pair("networks", GetNetworksInfo())); - obj.push_back( - Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK()))); + obj.push_back(Pair("relayfee", + ValueFromAmount(config.GetMinFeePerKB().GetFeePerK()))); obj.push_back(Pair("excessutxocharge", ValueFromAmount(config.GetExcessUTXOCharge()))); obj.push_back(Pair("incrementalfee", diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -81,7 +81,6 @@ uint256 hashAssumeValid; arith_uint256 nMinimumChainWork; -CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE); Amount maxTxFee = DEFAULT_TRANSACTION_MAXFEE; CTxMemPool mempool; @@ -910,6 +909,7 @@ strprintf("%d", nSigOpsCount)); } + CFeeRate minRelayTxFee = config.GetMinFeePerKB(); Amount mempoolRejectFee = pool.GetMinFee( gArgs.GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * @@ -922,7 +922,7 @@ } if (gArgs.GetBoolArg("-relaypriority", DEFAULT_RELAYPRIORITY) && - nModifiedFees < ::minRelayTxFee.GetFee(nSize) && + nModifiedFees < minRelayTxFee.GetFee(nSize) && !AllowFree(entry.GetPriority(chainActive.Height() + 1))) { // Require that free transactions have sufficient priority to be // mined in the next block. @@ -934,7 +934,7 @@ // This mitigates 'penny-flooding' -- sending thousands of free // transactions just to be annoying or make others' transactions take // longer to confirm. - if (fLimitFree && nModifiedFees < ::minRelayTxFee.GetFee(nSize)) { + if (fLimitFree && nModifiedFees < minRelayTxFee.GetFee(nSize)) { static CCriticalSection csFreeLimiter; static double dFreeCount; static int64_t nLastTime; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2946,7 +2946,8 @@ // If we made it here and we aren't even able to meet the relay fee // on the next pass, give up because we must be at the maximum // allowed fee. - if (nFeeNeeded < ::minRelayTxFee.GetFee(nBytes)) { + Amount minFee = GetConfig().GetMinFeePerKB().GetFee(nBytes); + if (nFeeNeeded < minFee) { strFailReason = _("Transaction too large for fee policy"); return false; }