aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoss Nicoll <[email protected]>2021-08-05 22:21:53 +0100
committerGitHub <[email protected]>2021-08-05 22:21:53 +0100
commit5db95e5a5f48eb76601946ea670ee3b2a33e2a4b (patch)
tree601ebf9d1837710dffdb5ff9b96e8acd903a4a9a /src
parentMerge pull request #2415 from rnicoll/1.14.4-rbf-fee (diff)
parent[fees] Express policies in COIN instead of Koinu (diff)
downloaddiscoin-5db95e5a5f48eb76601946ea670ee3b2a33e2a4b.tar.xz
discoin-5db95e5a5f48eb76601946ea670ee3b2a33e2a4b.zip
Merge pull request #2348 from patricklodder/1.14-cfg-dust-limit
[fees] introduce configurable hard dust limit
Diffstat (limited to 'src')
-rw-r--r--src/init.cpp9
-rw-r--r--src/policy/policy.cpp1
-rw-r--r--src/policy/policy.h10
-rw-r--r--src/primitives/transaction.h4
-rw-r--r--src/wallet/test/wallet_tests.cpp14
5 files changed, 36 insertions, 2 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 22dc45929..dd1942133 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -475,6 +475,7 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-incrementalrelayfee=<amt>", strprintf("Fee rate (in %s/kB) used to define cost of relay, used for mempool limiting and BIP 125 replacement. (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_INCREMENTAL_RELAY_FEE)));
strUsage += HelpMessageOpt("-dustrelayfee=<amt>", strprintf("Fee rate (in %s/kB) used to defined dust, the value of an output such that it will cost about 1/3 of its value in fees at this fee rate to spend it. (default: %s)", CURRENCY_UNIT, FormatMoney(DUST_RELAY_TX_FEE)));
}
+ strUsage += HelpMessageOpt("-dustlimit=<amt>", strprintf(_("Amount under which a transaction output is considered dust, in %s (default: %s)"), CURRENCY_UNIT, FormatMoney(DEFAULT_DUST_LIMIT)));
strUsage += HelpMessageOpt("-bytespersigop", strprintf(_("Equivalent bytes per sigop in transactions for relay and mining (default: %u)"), DEFAULT_BYTES_PER_SIGOP));
strUsage += HelpMessageOpt("-datacarrier", strprintf(_("Relay and mine data carrier transactions (default: %u)"), DEFAULT_ACCEPT_DATACARRIER));
strUsage += HelpMessageOpt("-datacarriersize", strprintf(_("Maximum size of data in data carrier transactions we relay and mine (default: %u)"), MAX_OP_RETURN_RELAY));
@@ -1043,6 +1044,14 @@ bool AppInitParameterInteraction()
return InitError(strprintf("acceptnonstdtxn is not currently supported for %s chain", chainparams.NetworkIDString()));
nBytesPerSigOp = GetArg("-bytespersigop", nBytesPerSigOp);
+ if (IsArgSet("-dustlimit"))
+ {
+ CAmount n = nDustLimit;
+ if (!ParseMoney(GetArg("-dustlimit", ""), n))
+ return InitError(AmountErrMsg("dustlimit", GetArg("-dustlimit", "")));
+ nDustLimit = n;
+ }
+
#ifdef ENABLE_WALLET
if (!CWallet::ParameterInteraction())
return false;
diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp
index ec398f662..7b2b23964 100644
--- a/src/policy/policy.cpp
+++ b/src/policy/policy.cpp
@@ -209,6 +209,7 @@ bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
CFeeRate incrementalRelayFee = CFeeRate(DEFAULT_INCREMENTAL_RELAY_FEE);
CFeeRate dustRelayFee = CFeeRate(DUST_RELAY_TX_FEE);
unsigned int nBytesPerSigOp = DEFAULT_BYTES_PER_SIGOP;
+unsigned int nDustLimit = DEFAULT_DUST_LIMIT;
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost)
{
diff --git a/src/policy/policy.h b/src/policy/policy.h
index a7fc8b78e..5380f7b5b 100644
--- a/src/policy/policy.h
+++ b/src/policy/policy.h
@@ -45,7 +45,14 @@ static const unsigned int MAX_STANDARD_P2WSH_SCRIPT_SIZE = 3600;
* standard and should be done with care and ideally rarely. It makes sense to
* only increase the dust limit after prior releases were already not creating
* outputs below the new threshold */
-static const unsigned int DUST_RELAY_TX_FEE = 1000;
+static const unsigned int DUST_RELAY_TX_FEE = COIN / 100000;
+/**
+ * Dogecoin: Default dust limit that is evaluated when considering whether a
+ * transaction output is required to pay additional fee for relay and inclusion
+ * in blocks. Overridden by -dustlimit
+ */
+static const unsigned int DEFAULT_DUST_LIMIT = COIN / 1;
+
/**
* Standard script verification flags that standard transactions will comply
* with. However scripts violating these flags may still be present in valid
@@ -96,6 +103,7 @@ bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
extern CFeeRate incrementalRelayFee;
extern CFeeRate dustRelayFee;
extern unsigned int nBytesPerSigOp;
+extern unsigned int nDustLimit;
/** Compute the virtual transaction size (weight reinterpreted as bytes). */
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost);
diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h
index 16a92bf2e..0d0ceda54 100644
--- a/src/primitives/transaction.h
+++ b/src/primitives/transaction.h
@@ -15,6 +15,8 @@ static const int SERIALIZE_TRANSACTION_NO_WITNESS = 0x40000000;
static const int WITNESS_SCALE_FACTOR = 4;
+extern unsigned int nDustLimit;
+
/** An outpoint - a combination of a transaction hash and an index n into its vout */
class COutPoint
{
@@ -195,7 +197,7 @@ public:
*/
// Dogecoin: Anything below 1 DOGE is always dust
- return COIN;
+ return nDustLimit;
}
bool IsDust(const CFeeRate &minRelayTxFeeRate) const
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
index 4e84bb688..79a994bf6 100644
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -36,6 +36,8 @@ std::vector<std::unique_ptr<CWalletTx>> wtxn;
typedef set<pair<const CWalletTx*,unsigned int> > CoinSet;
+extern unsigned int nDustLimit;
+
BOOST_FIXTURE_TEST_SUITE(wallet_tests, WalletTestingSetup)
static const CWallet wallet;
@@ -524,6 +526,18 @@ BOOST_AUTO_TEST_CASE(GetMinimumFee_dust_test)
BOOST_CHECK_EQUAL(CWallet::GetMinimumFee(tx, 963, 0, pool), 2 * nMinTxFee);
BOOST_CHECK_EQUAL(CWallet::GetMinimumFee(tx, 1000, 0, pool), 2 * nMinTxFee);
BOOST_CHECK_EQUAL(CWallet::GetMinimumFee(tx, 1999, 0, pool), 3 * nMinTxFee);
+
+ // change the hard dust limit
+
+ nDustLimit = COIN / 10;
+
+ // Confirm dust penalty fees are not added
+
+ BOOST_CHECK_EQUAL(CWallet::GetMinimumFee(tx, 963, 0, pool), 1 * nMinTxFee);
+ BOOST_CHECK_EQUAL(CWallet::GetMinimumFee(tx, 1000, 0, pool), 1 * nMinTxFee);
+ BOOST_CHECK_EQUAL(CWallet::GetMinimumFee(tx, 1999, 0, pool), 2 * nMinTxFee);
+
+ nDustLimit = COIN;
}
BOOST_AUTO_TEST_SUITE_END()