diff --git a/src/config.h b/src/config.h --- a/src/config.h +++ b/src/config.h @@ -5,6 +5,8 @@ #ifndef BITCOIN_CONFIG_H #define BITCOIN_CONFIG_H +#include "amount.h" + #include #include @@ -23,6 +25,9 @@ virtual const CChainParams &GetChainParams() const = 0; virtual void SetCashAddrEncoding(bool) = 0; virtual bool UseCashAddrEncoding() const = 0; + + virtual void SetExcessUTXOCharge(Amount amt) = 0; + virtual Amount GetExcessUTXOCharge() const = 0; }; class GlobalConfig final : public Config { @@ -36,8 +41,12 @@ void SetCashAddrEncoding(bool) override; bool UseCashAddrEncoding() const override; + void SetExcessUTXOCharge(Amount) override; + Amount GetExcessUTXOCharge() const override; + private: bool useCashAddr; + Amount excessUTXOCharge; }; // Dummy for subclassing in unittests @@ -51,11 +60,15 @@ return false; } uint8_t GetBlockPriorityPercentage() const override { return 0; } + + void SetChainParams(std::string net); const CChainParams &GetChainParams() const override { return *chainParams; } + void SetCashAddrEncoding(bool) override {} bool UseCashAddrEncoding() const override { return false; } - void SetChainParams(std::string net); + void SetExcessUTXOCharge(Amount amt) override {} + Amount GetExcessUTXOCharge() const override { return 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 @@ -63,3 +63,11 @@ void DummyConfig::SetChainParams(std::string net) { chainParams = CreateChainParams(net); } + +void GlobalConfig::SetExcessUTXOCharge(Amount fee) { + excessUTXOCharge = fee; +} + +Amount GlobalConfig::GetExcessUTXOCharge() const { + return excessUTXOCharge; +} diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -759,6 +759,11 @@ "block download (default: %u)", DEFAULT_MAX_TIP_AGE)); } + strUsage += HelpMessageOpt( + "-excessutxocharge=", + strprintf(_("Fees (in %s/kB) to charge per utxo created for" + "relaying, and mining (default: %s)"), + CURRENCY_UNIT, FormatMoney(DEFAULT_UTXO_FEE))); strUsage += HelpMessageOpt( "-minrelaytxfee=", strprintf( @@ -1548,6 +1553,18 @@ nConnectTimeout = gArgs.GetArg("-timeout", DEFAULT_CONNECT_TIMEOUT); if (nConnectTimeout <= 0) nConnectTimeout = DEFAULT_CONNECT_TIMEOUT; + // Obtain the amount to charge excess UTXO + if (gArgs.IsArgSet("-excessutxocharge")) { + Amount n(0); + auto parsed = ParseMoney(gArgs.GetArg("-excessutxocharge", ""), n); + if (!parsed || Amount(0) > n) + return InitError(AmountErrMsg( + "excessutxocharge", gArgs.GetArg("-excessutxocharge", ""))); + config.SetExcessUTXOCharge(n); + } else { + config.SetExcessUTXOCharge(DEFAULT_UTXO_FEE); + } + // Fee-per-kilobyte amount considered the same as "free". If you are mining, // be careful setting this: if you set it to zero then a transaction spammer // can cheaply fill blocks using 1-satoshi-fee transactions. It should be diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -522,7 +522,11 @@ " ],\n" " \"relayfee\": x.xxxxxxxx, (numeric) minimum " "relay fee for non-free transactions in " + - CURRENCY_UNIT + "/kB\n" + CURRENCY_UNIT + + "/kB\n" + " \"excessutxocharge\": x.xxxxxxxx, (numeric) minimum " + "charge for excess utxos in " + + CURRENCY_UNIT + "\n" " \"incrementalfee\": x.xxxxxxxx, " "(numeric) minimum fee increment for mempool " "limiting or BIP 125 replacement in " + @@ -565,6 +569,8 @@ obj.push_back(Pair("networks", GetNetworksInfo())); obj.push_back( Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK()))); + obj.push_back(Pair("excessutxocharge", + ValueFromAmount(config.GetExcessUTXOCharge()))); obj.push_back(Pair("incrementalfee", ValueFromAmount(::incrementalRelayFee.GetFeePerK()))); UniValue localAddresses(UniValue::VARR); diff --git a/src/validation.h b/src/validation.h --- a/src/validation.h +++ b/src/validation.h @@ -57,6 +57,8 @@ static const bool DEFAULT_WHITELISTFORCERELAY = true; /** Default for -minrelaytxfee, minimum relay fee for transactions */ static const Amount DEFAULT_MIN_RELAY_TX_FEE(1000); +/** Default for -excessutxocharge for transactions transactions */ +static const Amount DEFAULT_UTXO_FEE(0); //! -maxtxfee default static const Amount DEFAULT_TRANSACTION_MAXFEE(COIN / 10); //! Discourage users to set fees higher than this amount (in satoshis) per kB