Compare commits

...

7 Commits

Author SHA1 Message Date
Wietse Wind
f2293ce440 Oops 2024-09-06 01:37:22 +02:00
Wietse Wind
f31a23017f clang-format 2024-09-06 00:59:52 +02:00
Wietse Wind
243a357b28 Merge branch 'merge/fbbea9e6e25795a8a6bd1bf64b780771933a9579' into merge/2.2.2-jobqueue 2024-09-06 00:46:56 +02:00
Wietse Wind
ce187dad18 Merge 7741483894 2024-09-06 00:45:59 +02:00
Wietse Wind
0a05243d80 Merge fbbea9e6e2 2024-09-05 12:53:07 +02:00
RichardAH
833df20fce Fix240819 (#350)
fix240918
---------

Co-authored-by: Denis Angell <dangell@transia.co>
2024-08-20 09:40:31 +10:00
Wietse Wind
5737c2b6e8 Workaround CentOS7 EOL 2024-08-18 01:50:44 +02:00
16 changed files with 235 additions and 40 deletions

View File

@@ -9,6 +9,15 @@ echo "-- GITHUB_RUN_NUMBER: $4"
umask 0000; umask 0000;
echo "Fixing CentOS 7 EOL"
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum clean all
yum-config-manager --disable centos-sclo-sclo
####
cd /io; cd /io;
mkdir src/certs; mkdir src/certs;
curl --silent -k https://raw.githubusercontent.com/RichardAH/rippled-release-builder/main/ca-bundle/certbundle.h -o src/certs/certbundle.h; curl --silent -k https://raw.githubusercontent.com/RichardAH/rippled-release-builder/main/ca-bundle/certbundle.h -o src/certs/certbundle.h;

View File

@@ -134,8 +134,12 @@ RCLConsensus::Adaptor::acquireLedger(LedgerHash const& hash)
acquiringLedger_ = hash; acquiringLedger_ = hash;
app_.getJobQueue().addJob( app_.getJobQueue().addJob(
jtADVANCE, "getConsensusLedger", [id = hash, &app = app_]() { jtADVANCE,
app.getInboundLedgers().acquire( "getConsensusLedger1",
[id = hash, &app = app_, this]() {
JLOG(j_.debug())
<< "JOB advanceLedger getConsensusLedger1 started";
app.getInboundLedgers().acquireAsync(
id, 0, InboundLedger::Reason::CONSENSUS); id, 0, InboundLedger::Reason::CONSENSUS);
}); });
} }

View File

@@ -135,8 +135,10 @@ RCLValidationsAdaptor::acquire(LedgerHash const& hash)
Application* pApp = &app_; Application* pApp = &app_;
app_.getJobQueue().addJob( app_.getJobQueue().addJob(
jtADVANCE, "getConsensusLedger", [pApp, hash]() { jtADVANCE, "getConsensusLedger2", [pApp, hash, this]() {
pApp->getInboundLedgers().acquire( JLOG(j_.debug())
<< "JOB advanceLedger getConsensusLedger2 started";
pApp->getInboundLedgers().acquireAsync(
hash, 0, InboundLedger::Reason::CONSENSUS); hash, 0, InboundLedger::Reason::CONSENSUS);
}); });
return std::nullopt; return std::nullopt;
@@ -152,7 +154,9 @@ void
handleNewValidation( handleNewValidation(
Application& app, Application& app,
std::shared_ptr<STValidation> const& val, std::shared_ptr<STValidation> const& val,
std::string const& source) std::string const& source,
BypassAccept const bypassAccept,
std::optional<beast::Journal> j)
{ {
auto const& signingKey = val->getSignerPublic(); auto const& signingKey = val->getSignerPublic();
auto const& hash = val->getLedgerHash(); auto const& hash = val->getLedgerHash();
@@ -177,7 +181,23 @@ handleNewValidation(
if (outcome == ValStatus::current) if (outcome == ValStatus::current)
{ {
if (val->isTrusted()) if (val->isTrusted())
app.getLedgerMaster().checkAccept(hash, seq); {
// Was: app.getLedgerMaster().checkAccept(hash, seq);
// https://github.com/XRPLF/rippled/commit/fbbea9e6e25795a8a6bd1bf64b780771933a9579
if (bypassAccept == BypassAccept::yes)
{
assert(j.has_value());
if (j.has_value())
{
JLOG(j->trace()) << "Bypassing checkAccept for validation "
<< val->getLedgerHash();
}
}
else
{
app.getLedgerMaster().checkAccept(hash, seq);
}
}
return; return;
} }

View File

@@ -25,12 +25,16 @@
#include <ripple/protocol/Protocol.h> #include <ripple/protocol/Protocol.h>
#include <ripple/protocol/RippleLedgerHash.h> #include <ripple/protocol/RippleLedgerHash.h>
#include <ripple/protocol/STValidation.h> #include <ripple/protocol/STValidation.h>
#include <optional>
#include <set>
#include <vector> #include <vector>
namespace ripple { namespace ripple {
class Application; class Application;
enum class BypassAccept : bool { no = false, yes };
/** Wrapper over STValidation for generic Validation code /** Wrapper over STValidation for generic Validation code
Wraps an STValidation for compatibility with the generic validation code. Wraps an STValidation for compatibility with the generic validation code.
@@ -248,7 +252,9 @@ void
handleNewValidation( handleNewValidation(
Application& app, Application& app,
std::shared_ptr<STValidation> const& val, std::shared_ptr<STValidation> const& val,
std::string const& source); std::string const& source,
BypassAccept const bypassAccept = BypassAccept::no,
std::optional<beast::Journal> j = std::nullopt);
} // namespace ripple } // namespace ripple

View File

@@ -38,10 +38,21 @@ public:
virtual ~InboundLedgers() = default; virtual ~InboundLedgers() = default;
// VFALCO TODO Should this be called findOrAdd ? // VFALCO TODO Should this be called findOrAdd ?
// Callers should use this if they possibly need an authoritative
// response immediately.
// //
virtual std::shared_ptr<Ledger const> virtual std::shared_ptr<Ledger const>
acquire(uint256 const& hash, std::uint32_t seq, InboundLedger::Reason) = 0; acquire(uint256 const& hash, std::uint32_t seq, InboundLedger::Reason) = 0;
// Callers should use this if they are known to be executing on the Job
// Queue. TODO review whether all callers of acquire() can use this
// instead. Inbound ledger acquisition is asynchronous anyway.
virtual void
acquireAsync(
uint256 const& hash,
std::uint32_t seq,
InboundLedger::Reason reason) = 0;
virtual std::shared_ptr<InboundLedger> virtual std::shared_ptr<InboundLedger>
find(LedgerHash const& hash) = 0; find(LedgerHash const& hash) = 0;

View File

@@ -560,7 +560,7 @@ InboundLedger::trigger(std::shared_ptr<Peer> const& peer, TriggerReason reason)
return; return;
} }
if (auto stream = journal_.trace()) if (auto stream = journal_.debug())
{ {
if (peer) if (peer)
stream << "Trigger acquiring ledger " << hash_ << " from " << peer; stream << "Trigger acquiring ledger " << hash_ << " from " << peer;

View File

@@ -28,6 +28,7 @@
#include <ripple/core/JobQueue.h> #include <ripple/core/JobQueue.h>
#include <ripple/nodestore/DatabaseShard.h> #include <ripple/nodestore/DatabaseShard.h>
#include <ripple/protocol/jss.h> #include <ripple/protocol/jss.h>
#include <exception>
#include <memory> #include <memory>
#include <mutex> #include <mutex>
#include <vector> #include <vector>
@@ -141,6 +142,37 @@ public:
return inbound->getLedger(); return inbound->getLedger();
} }
void
acquireAsync(
uint256 const& hash,
std::uint32_t seq,
InboundLedger::Reason reason) override
{
std::unique_lock lock(acquiresMutex_);
try
{
if (pendingAcquires_.contains(hash))
return;
pendingAcquires_.insert(hash);
lock.unlock();
acquire(hash, seq, reason);
}
catch (std::exception const& e)
{
JLOG(j_.warn())
<< "Exception thrown for acquiring new inbound ledger " << hash
<< ": " << e.what();
}
catch (...)
{
JLOG(j_.warn())
<< "Unknown exception thrown for acquiring new inbound ledger "
<< hash;
}
lock.lock();
pendingAcquires_.erase(hash);
}
std::shared_ptr<InboundLedger> std::shared_ptr<InboundLedger>
find(uint256 const& hash) override find(uint256 const& hash) override
{ {
@@ -426,6 +458,9 @@ private:
beast::insight::Counter mCounter; beast::insight::Counter mCounter;
std::unique_ptr<PeerSetBuilder> mPeerSetBuilder; std::unique_ptr<PeerSetBuilder> mPeerSetBuilder;
std::set<uint256> pendingAcquires_;
std::mutex acquiresMutex_;
}; };
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View File

@@ -70,7 +70,9 @@
#include <boost/asio/ip/host_name.hpp> #include <boost/asio/ip/host_name.hpp>
#include <boost/asio/steady_timer.hpp> #include <boost/asio/steady_timer.hpp>
#include <exception>
#include <mutex> #include <mutex>
#include <set>
#include <string> #include <string>
#include <tuple> #include <tuple>
#include <unordered_map> #include <unordered_map>
@@ -776,6 +778,9 @@ private:
StateAccounting accounting_{}; StateAccounting accounting_{};
std::set<uint256> pendingValidations_;
std::mutex validationsMutex_;
private: private:
struct Stats struct Stats
{ {
@@ -1142,8 +1147,12 @@ NetworkOPsImp::submitTransaction(std::shared_ptr<STTx const> const& iTrans)
// Enforce Network bar for emitted txn // Enforce Network bar for emitted txn
if (view->rules().enabled(featureHooks) && hook::isEmittedTxn(*iTrans)) if (view->rules().enabled(featureHooks) && hook::isEmittedTxn(*iTrans))
{ {
JLOG(m_journal.warn()) // RH NOTE: Warning removed here due to ConsesusSet using this function
<< "Submitted transaction invalid: EmitDetails present."; // which continually triggers this bar. Doesn't seem dangerous, just
// annoying.
// JLOG(m_journal.warn())
// << "Submitted transaction invalid: EmitDetails present.";
return; return;
} }
@@ -1155,7 +1164,11 @@ NetworkOPsImp::submitTransaction(std::shared_ptr<STTx const> const& iTrans)
if ((flags & SF_BAD) != 0) if ((flags & SF_BAD) != 0)
{ {
JLOG(m_journal.warn()) << "Submitted transaction cached bad"; // RH NOTE: Warning removed here due to ConsesusSet using this function
// which continually triggers this bar. Doesn't seem dangerous, just
// annoying.
// JLOG(m_journal.warn()) << "Submitted transaction cached bad";
return; return;
} }
@@ -1783,7 +1796,8 @@ NetworkOPsImp::checkLastClosedLedger(
} }
JLOG(m_journal.warn()) << "We are not running on the consensus ledger"; JLOG(m_journal.warn()) << "We are not running on the consensus ledger";
JLOG(m_journal.info()) << "Our LCL: " << getJson({*ourClosed, {}}); JLOG(m_journal.info()) << "Our LCL: " << ourClosed->info().hash
<< getJson({*ourClosed, {}});
JLOG(m_journal.info()) << "Net LCL " << closedLedger; JLOG(m_journal.info()) << "Net LCL " << closedLedger;
if ((mMode == OperatingMode::TRACKING) || (mMode == OperatingMode::FULL)) if ((mMode == OperatingMode::TRACKING) || (mMode == OperatingMode::FULL))
@@ -2337,7 +2351,37 @@ NetworkOPsImp::recvValidation(
JLOG(m_journal.trace()) JLOG(m_journal.trace())
<< "recvValidation " << val->getLedgerHash() << " from " << source; << "recvValidation " << val->getLedgerHash() << " from " << source;
handleNewValidation(app_, val, source); // handleNewValidation(app_, val, source);
// https://github.com/XRPLF/rippled/commit/fbbea9e6e25795a8a6bd1bf64b780771933a9579
std::unique_lock lock(validationsMutex_);
BypassAccept bypassAccept = BypassAccept::no;
try
{
if (pendingValidations_.contains(val->getLedgerHash()))
bypassAccept = BypassAccept::yes;
else
pendingValidations_.insert(val->getLedgerHash());
lock.unlock();
handleNewValidation(app_, val, source, bypassAccept, m_journal);
}
catch (std::exception const& e)
{
JLOG(m_journal.warn())
<< "Exception thrown for handling new validation "
<< val->getLedgerHash() << ": " << e.what();
}
catch (...)
{
JLOG(m_journal.warn())
<< "Unknown exception thrown for handling new validation "
<< val->getLedgerHash();
}
if (bypassAccept == BypassAccept::no)
{
lock.lock();
pendingValidations_.erase(val->getLedgerHash());
lock.unlock();
}
pubValidation(val); pubValidation(val);

View File

@@ -173,6 +173,11 @@ updateLedgerDBs(
auto const sParentHash{to_string(ledger->info().parentHash)}; auto const sParentHash{to_string(ledger->info().parentHash)};
auto const sDrops{to_string(ledger->info().drops)}; auto const sDrops{to_string(ledger->info().drops)};
auto const closingTime{
ledger->info().closeTime.time_since_epoch().count()};
auto const prevClosingTime{
ledger->info().parentCloseTime.time_since_epoch().count()};
auto const closeTimeRes{ledger->info().closeTimeResolution.count()};
auto const sAccountHash{to_string(ledger->info().accountHash)}; auto const sAccountHash{to_string(ledger->info().accountHash)};
auto const sTxHash{to_string(ledger->info().txHash)}; auto const sTxHash{to_string(ledger->info().txHash)};
@@ -188,11 +193,8 @@ updateLedgerDBs(
":closingTime, :prevClosingTime, :closeTimeRes," ":closingTime, :prevClosingTime, :closeTimeRes,"
":closeFlags, :accountSetHash, :transSetHash);", ":closeFlags, :accountSetHash, :transSetHash);",
soci::use(sHash), soci::use(ledgerSeq), soci::use(sParentHash), soci::use(sHash), soci::use(ledgerSeq), soci::use(sParentHash),
soci::use(sDrops), soci::use(sDrops), soci::use(closingTime),
soci::use(ledger->info().closeTime.time_since_epoch().count()), soci::use(prevClosingTime), soci::use(closeTimeRes),
soci::use(
ledger->info().parentCloseTime.time_since_epoch().count()),
soci::use(ledger->info().closeTimeResolution.count()),
soci::use(ledger->info().closeFlags), soci::use(sAccountHash), soci::use(ledger->info().closeFlags), soci::use(sAccountHash),
soci::use(sTxHash); soci::use(sTxHash);

View File

@@ -205,19 +205,20 @@ insertPeerReservation(
PublicKey const& nodeId, PublicKey const& nodeId,
std::string const& description) std::string const& description)
{ {
auto const sNodeId = toBase58(TokenType::NodePublic, nodeId);
session << "INSERT INTO PeerReservations (PublicKey, Description) " session << "INSERT INTO PeerReservations (PublicKey, Description) "
"VALUES (:nodeId, :desc) " "VALUES (:nodeId, :desc) "
"ON CONFLICT (PublicKey) DO UPDATE SET " "ON CONFLICT (PublicKey) DO UPDATE SET "
"Description=excluded.Description", "Description=excluded.Description",
soci::use(toBase58(TokenType::NodePublic, nodeId)), soci::use(sNodeId), soci::use(description);
soci::use(description);
} }
void void
deletePeerReservation(soci::session& session, PublicKey const& nodeId) deletePeerReservation(soci::session& session, PublicKey const& nodeId)
{ {
auto const sNodeId = toBase58(TokenType::NodePublic, nodeId);
session << "DELETE FROM PeerReservations WHERE PublicKey = :nodeId", session << "DELETE FROM PeerReservations WHERE PublicKey = :nodeId",
soci::use(toBase58(TokenType::NodePublic, nodeId)); soci::use(sNodeId);
} }
bool bool

View File

@@ -1921,6 +1921,12 @@ Transactor::operator()()
STObject const meta = metaRaw.getAsObject(); STObject const meta = metaRaw.getAsObject();
uint32_t lgrCur = view().seq(); uint32_t lgrCur = view().seq();
bool const has240819 = view().rules().enabled(fix240819);
auto const& sfRewardFields =
*(ripple::SField::knownCodeToField.at(917511 - has240819));
// iterate all affected balances // iterate all affected balances
for (auto const& node : meta.getFieldArray(sfAffectedNodes)) for (auto const& node : meta.getFieldArray(sfAffectedNodes))
{ {
@@ -1932,7 +1938,7 @@ Transactor::operator()()
if (nodeType != ltACCOUNT_ROOT || metaType == sfDeletedNode) if (nodeType != ltACCOUNT_ROOT || metaType == sfDeletedNode)
continue; continue;
if (!node.isFieldPresent(sfFinalFields) || if (!node.isFieldPresent(sfRewardFields) ||
!node.isFieldPresent(sfLedgerIndex)) !node.isFieldPresent(sfLedgerIndex))
continue; continue;
@@ -1948,7 +1954,7 @@ Transactor::operator()()
continue; continue;
STObject& finalFields = (const_cast<STObject&>(node)) STObject& finalFields = (const_cast<STObject&>(node))
.getField(sfFinalFields) .getField(sfRewardFields)
.downcast<STObject>(); .downcast<STObject>();
if (!finalFields.isFieldPresent(sfBalance)) if (!finalFields.isFieldPresent(sfBalance))

View File

@@ -74,7 +74,7 @@ namespace detail {
// Feature.cpp. Because it's only used to reserve storage, and determine how // Feature.cpp. Because it's only used to reserve storage, and determine how
// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
// the actual number of amendments. A LogicError on startup will verify this. // the actual number of amendments. A LogicError on startup will verify this.
static constexpr std::size_t numFeatures = 70; static constexpr std::size_t numFeatures = 71;
/** Amendments that this server supports and the default voting behavior. /** Amendments that this server supports and the default voting behavior.
Whether they are enabled depends on the Rules defined in the validated Whether they are enabled depends on the Rules defined in the validated
@@ -358,6 +358,7 @@ extern uint256 const fixXahauV2;
extern uint256 const featureRemit; extern uint256 const featureRemit;
extern uint256 const featureZeroB2M; extern uint256 const featureZeroB2M;
extern uint256 const fixNSDelete; extern uint256 const fixNSDelete;
extern uint256 const fix240819;
} // namespace ripple } // namespace ripple

View File

@@ -464,6 +464,7 @@ REGISTER_FIX (fixXahauV2, Supported::yes, VoteBehavior::De
REGISTER_FEATURE(Remit, Supported::yes, VoteBehavior::DefaultNo); REGISTER_FEATURE(Remit, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FEATURE(ZeroB2M, Supported::yes, VoteBehavior::DefaultNo); REGISTER_FEATURE(ZeroB2M, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FIX (fixNSDelete, Supported::yes, VoteBehavior::DefaultNo); REGISTER_FIX (fixNSDelete, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FIX (fix240819, Supported::yes, VoteBehavior::DefaultYes);
// The following amendments are obsolete, but must remain supported // The following amendments are obsolete, but must remain supported
// because they could potentially get enabled. // because they could potentially get enabled.

View File

@@ -256,6 +256,8 @@ BaseWSPeer<Handler, Impl>::close(
return post(strand_, [self = impl().shared_from_this(), reason] { return post(strand_, [self = impl().shared_from_this(), reason] {
self->close(reason); self->close(reason);
}); });
if (do_close_)
return;
do_close_ = true; do_close_ = true;
if (wq_.empty()) if (wq_.empty())
{ {

View File

@@ -106,6 +106,14 @@ public:
return {}; return {};
} }
virtual void
acquireAsync(
uint256 const& hash,
std::uint32_t seq,
InboundLedger::Reason reason) override
{
}
virtual std::shared_ptr<InboundLedger> virtual std::shared_ptr<InboundLedger>
find(LedgerHash const& hash) override find(LedgerHash const& hash) override
{ {

View File

@@ -3968,8 +3968,8 @@ struct XahauGenesis_test : public beast::unit_test::suite
using namespace std::chrono_literals; using namespace std::chrono_literals;
testcase("test claim reward valid without unl report"); testcase("test claim reward valid without unl report");
Env env{ Env env{*this, envconfig(), features - featureXahauGenesis};
*this, envconfig(), supported_amendments() - featureXahauGenesis}; bool const has240819 = env.current()->rules().enabled(fix240819);
double const rateDrops = 0.00333333333 * 1'000'000; double const rateDrops = 0.00333333333 * 1'000'000;
STAmount const feesXRP = XRP(1); STAmount const feesXRP = XRP(1);
@@ -4050,7 +4050,12 @@ struct XahauGenesis_test : public beast::unit_test::suite
// validate account fields // validate account fields
STAmount const postUser = preUser + netReward; STAmount const postUser = preUser + netReward;
BEAST_EXPECT(expectAccountFields( BEAST_EXPECT(expectAccountFields(
env, user, preLedger, preLedger + 1, postUser, preTime)); env,
user,
preLedger,
preLedger + 1,
has240819 ? (preUser - feesXRP) : postUser,
preTime));
env(claimReward(user, env.master), fee(feesXRP), ter(tecHOOK_REJECTED)); env(claimReward(user, env.master), fee(feesXRP), ter(tecHOOK_REJECTED));
env.close(); env.close();
@@ -4095,7 +4100,12 @@ struct XahauGenesis_test : public beast::unit_test::suite
// validate account fields // validate account fields
STAmount const postUser1 = preUser1 + netReward1; STAmount const postUser1 = preUser1 + netReward1;
BEAST_EXPECT(expectAccountFields( BEAST_EXPECT(expectAccountFields(
env, user, preLedger1, preLedger1 + 1, postUser1, preTime1)); env,
user,
preLedger1,
preLedger1 + 1,
has240819 ? (preUser1 - feesXRP) : postUser1,
preTime1));
} }
void void
@@ -4219,8 +4229,14 @@ struct XahauGenesis_test : public beast::unit_test::suite
// validate account fields // validate account fields
STAmount const postUser = preUser + netReward; STAmount const postUser = preUser + netReward;
bool const has240819 = env.current()->rules().enabled(fix240819);
BEAST_EXPECT(expectAccountFields( BEAST_EXPECT(expectAccountFields(
env, user, preLedger, preLedger + 1, postUser, preTime)); env,
user,
preLedger,
preLedger + 1,
has240819 ? (preUser - feesXRP) : postUser,
preTime));
} }
void void
@@ -4352,10 +4368,15 @@ struct XahauGenesis_test : public beast::unit_test::suite
// validate account fields // validate account fields
STAmount const postAlice = preAlice + netReward + l1Reward; STAmount const postAlice = preAlice + netReward + l1Reward;
bool const boolResult = withXahauV1 ? true : false; bool const boolResult = withXahauV1 ? true : false;
bool const has240819 = env.current()->rules().enabled(fix240819);
BEAST_EXPECT( BEAST_EXPECT(
expectAccountFields( expectAccountFields(
env, alice, preLedger, preLedger + 1, postAlice, preTime) == env,
boolResult); alice,
preLedger,
preLedger + 1,
has240819 ? (preAlice - feesXRP) : postAlice,
preTime) == boolResult);
} }
} }
@@ -4367,6 +4388,7 @@ struct XahauGenesis_test : public beast::unit_test::suite
testcase("test claim reward optin optout"); testcase("test claim reward optin optout");
Env env{*this, envconfig(), features - featureXahauGenesis}; Env env{*this, envconfig(), features - featureXahauGenesis};
bool const has240819 = env.current()->rules().enabled(fix240819);
double const rateDrops = 0.00333333333 * 1'000'000; double const rateDrops = 0.00333333333 * 1'000'000;
STAmount const feesXRP = XRP(1); STAmount const feesXRP = XRP(1);
@@ -4436,7 +4458,12 @@ struct XahauGenesis_test : public beast::unit_test::suite
// validate account fields // validate account fields
STAmount const postUser = preUser + netReward; STAmount const postUser = preUser + netReward;
BEAST_EXPECT(expectAccountFields( BEAST_EXPECT(expectAccountFields(
env, user, preLedger, preLedger + 1, postUser, preTime)); env,
user,
preLedger,
preLedger + 1,
has240819 ? (preUser - feesXRP) : postUser,
preTime));
// opt out of claim rewards // opt out of claim rewards
env(claimReward(user, std::nullopt, 1), fee(feesXRP), ter(tesSUCCESS)); env(claimReward(user, std::nullopt, 1), fee(feesXRP), ter(tesSUCCESS));
@@ -4461,7 +4488,7 @@ struct XahauGenesis_test : public beast::unit_test::suite
user, user,
preLedger1, preLedger1,
preLedger1 + 1, preLedger1 + 1,
env.balance(user), has240819 ? (env.balance(user) + feesXRP) : env.balance(user),
preTime1)); preTime1));
} }
@@ -4543,8 +4570,14 @@ struct XahauGenesis_test : public beast::unit_test::suite
// validate account fields // validate account fields
STAmount const postUser = preUser + netReward; STAmount const postUser = preUser + netReward;
bool const has240819 = env.current()->rules().enabled(fix240819);
BEAST_EXPECT(expectAccountFields( BEAST_EXPECT(expectAccountFields(
env, user, preLedger, preLedger + 1, postUser, preTime)); env,
user,
preLedger,
has240819 ? preLedger : preLedger + 1,
has240819 ? (preUser - feesXRP) : postUser,
preTime));
} }
void void
@@ -4618,8 +4651,14 @@ struct XahauGenesis_test : public beast::unit_test::suite
// validate account fields // validate account fields
STAmount const postUser = preUser + netReward; STAmount const postUser = preUser + netReward;
bool const has240819 = env.current()->rules().enabled(fix240819);
BEAST_EXPECT(expectAccountFields( BEAST_EXPECT(expectAccountFields(
env, user, preLedger, preLedger + 1, postUser, preTime)); env,
user,
preLedger,
preLedger + 1,
has240819 ? (preUser - feesXRP) : postUser,
preTime));
} }
void void
@@ -4824,13 +4863,13 @@ struct XahauGenesis_test : public beast::unit_test::suite
Env env{ Env env{
*this, *this,
makeGenesisConfig( makeGenesisConfig(
supported_amendments() - featureXahauGenesis, features - featureXahauGenesis,
21337, 21337,
"10", "10",
"1000000", "1000000",
"200000", "200000",
0), 0),
supported_amendments() - featureXahauGenesis}; features - featureXahauGenesis};
STAmount const feesXRP = XRP(1); STAmount const feesXRP = XRP(1);
@@ -4890,8 +4929,7 @@ struct XahauGenesis_test : public beast::unit_test::suite
using namespace std::chrono_literals; using namespace std::chrono_literals;
testcase("test compound interest over 12 claims"); testcase("test compound interest over 12 claims");
Env env{ Env env{*this, envconfig(), features - featureXahauGenesis};
*this, envconfig(), supported_amendments() - featureXahauGenesis};
double const rateDrops = 0.00333333333 * 1'000'000; double const rateDrops = 0.00333333333 * 1'000'000;
STAmount const feesXRP = XRP(1); STAmount const feesXRP = XRP(1);
@@ -4965,8 +5003,14 @@ struct XahauGenesis_test : public beast::unit_test::suite
// validate account fields // validate account fields
STAmount const postUser = preUser + netReward; STAmount const postUser = preUser + netReward;
bool const has240819 = env.current()->rules().enabled(fix240819);
BEAST_EXPECT(expectAccountFields( BEAST_EXPECT(expectAccountFields(
env, user, preLedger, preLedger + 1, postUser, preTime)); env,
user,
preLedger,
preLedger + 1,
has240819 ? (preUser - feesXRP) : postUser,
preTime));
} }
STAmount const endBal = env.balance(user); STAmount const endBal = env.balance(user);
@@ -5012,6 +5056,7 @@ struct XahauGenesis_test : public beast::unit_test::suite
using namespace test::jtx; using namespace test::jtx;
auto const sa = supported_amendments(); auto const sa = supported_amendments();
testGovernHookWithFeats(sa); testGovernHookWithFeats(sa);
testRewardHookWithFeats(sa - fix240819);
testRewardHookWithFeats(sa); testRewardHookWithFeats(sa);
} }
}; };