mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Enforce TransferRate Maximum (RIPD-1201):
Sets a maximum TransferRate value of 100%. Squashes any
requested TransferRate over the limit to the max value.
This change requires an amendment ("fix1201") in rippled.
Adds test functionality for enabling an amendment mid-test.
Additionally, adds tests utilizing varying transfer rates both
with and without the amendment enabled.
This commit is contained in:
@@ -56,7 +56,8 @@ supportedAmendments ()
|
||||
{ "42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC fix1373" },
|
||||
{ "DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF EnforceInvariants" },
|
||||
{ "3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC FlowCross" },
|
||||
{ "CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E SortedDirectories" }
|
||||
{ "CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E SortedDirectories" },
|
||||
{ "B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD fix1201" }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -119,7 +119,13 @@ SetAccount::preflight (PreflightContext const& ctx)
|
||||
|
||||
if (uRate && (uRate < QUALITY_ONE))
|
||||
{
|
||||
JLOG(j.trace()) << "Malformed transaction: Bad transfer rate.";
|
||||
JLOG(j.trace()) << "Malformed transaction: Transfer rate too small.";
|
||||
return temBAD_TRANSFER_RATE;
|
||||
}
|
||||
|
||||
if (ctx.rules.enabled(fix1201) && (uRate > 2 * QUALITY_ONE))
|
||||
{
|
||||
JLOG(j.trace()) << "Malformed transaction: Transfer rate too large.";
|
||||
return temBAD_TRANSFER_RATE;
|
||||
}
|
||||
}
|
||||
@@ -453,7 +459,7 @@ SetAccount::doApply ()
|
||||
JLOG(j_.trace()) << "unset transfer rate";
|
||||
sle->makeFieldAbsent (sfTransferRate);
|
||||
}
|
||||
else if (uRate > QUALITY_ONE)
|
||||
else
|
||||
{
|
||||
JLOG(j_.trace()) << "set transfer rate";
|
||||
sle->setFieldU32 (sfTransferRate, uRate);
|
||||
|
||||
@@ -67,7 +67,8 @@ class FeatureCollections
|
||||
"CryptoConditionsSuite",
|
||||
"fix1373",
|
||||
"EnforceInvariants",
|
||||
"SortedDirectories"};
|
||||
"SortedDirectories",
|
||||
"fix1201"};
|
||||
|
||||
std::vector<uint256> features;
|
||||
boost::container::flat_map<uint256, std::size_t> featureToIndex;
|
||||
@@ -160,6 +161,7 @@ extern uint256 const featureCryptoConditionsSuite;
|
||||
extern uint256 const fix1373;
|
||||
extern uint256 const featureEnforceInvariants;
|
||||
extern uint256 const featureSortedDirectories;
|
||||
extern uint256 const fix1201;
|
||||
|
||||
} // ripple
|
||||
|
||||
|
||||
@@ -114,5 +114,6 @@ uint256 const featureCryptoConditionsSuite = *getRegisteredFeature("CryptoCondit
|
||||
uint256 const fix1373 = *getRegisteredFeature("fix1373");
|
||||
uint256 const featureEnforceInvariants = *getRegisteredFeature("EnforceInvariants");
|
||||
uint256 const featureSortedDirectories = *getRegisteredFeature("SortedDirectories");
|
||||
uint256 const fix1201 = *getRegisteredFeature("fix1201");
|
||||
|
||||
} // ripple
|
||||
|
||||
@@ -121,7 +121,7 @@ transResults()
|
||||
{ temBAD_SIGNATURE, { "temBAD_SIGNATURE", "Malformed: Bad signature." } },
|
||||
{ temBAD_SIGNER, { "temBAD_SIGNER", "Malformed: No signer may duplicate account or other signers." } },
|
||||
{ temBAD_SRC_ACCOUNT, { "temBAD_SRC_ACCOUNT", "Malformed: Bad source account." } },
|
||||
{ temBAD_TRANSFER_RATE, { "temBAD_TRANSFER_RATE", "Malformed: Transfer rate must be >= 1.0" } },
|
||||
{ temBAD_TRANSFER_RATE, { "temBAD_TRANSFER_RATE", "Malformed: Transfer rate must be >= 1.0 and <= 2.0" } },
|
||||
{ temBAD_WEIGHT, { "temBAD_WEIGHT", "Malformed: Weight must be a positive value." } },
|
||||
{ temDST_IS_SRC, { "temDST_IS_SRC", "Destination may not be source." } },
|
||||
{ temDST_NEEDED, { "temDST_NEEDED", "Destination not specified." } },
|
||||
|
||||
Reference in New Issue
Block a user