Merge remote-tracking branch 'xrplf/develop' into sponsor

This commit is contained in:
tequ
2026-04-08 11:47:16 +09:00
741 changed files with 7547 additions and 6324 deletions

View File

@@ -127,7 +127,7 @@ class Invariants_test : public beast::unit_test::suite
OpenView ov{*env.current()};
test::StreamSink sink{beast::severities::kWarning};
beast::Journal jlog{sink};
beast::Journal const jlog{sink};
ApplyContext ac{env.app(), ov, tx, tesSUCCESS, env.current()->fees().base, tapNONE, jlog};
BEAST_EXPECT(precheck(A1, A2, ac));
@@ -913,7 +913,7 @@ class Invariants_test : public beast::unit_test::suite
auto sleNew = std::make_shared<SLE>(keylet::escrow(A1, (*sle)[sfSequence] + 2));
Issue const usd{Currency(0x5553440000000000), AccountID(0x4985601)};
STAmount amt(usd, -1);
STAmount const amt(usd, -1);
sleNew->setFieldAmount(sfAmount, amt);
ac.view().insert(sleNew);
return true;
@@ -930,7 +930,7 @@ class Invariants_test : public beast::unit_test::suite
auto sleNew = std::make_shared<SLE>(keylet::escrow(A1, (*sle)[sfSequence] + 2));
Issue const bad{badCurrency(), AccountID(0x4985601)};
STAmount amt(bad, 1);
STAmount const amt(bad, 1);
sleNew->setFieldAmount(sfAmount, amt);
ac.view().insert(sleNew);
return true;
@@ -947,7 +947,7 @@ class Invariants_test : public beast::unit_test::suite
auto sleNew = std::make_shared<SLE>(keylet::escrow(A1, (*sle)[sfSequence] + 2));
MPTIssue const mpt{MPTIssue{makeMptID(1, AccountID(0x4985601))}};
STAmount amt(mpt, -1);
STAmount const amt(mpt, -1);
sleNew->setFieldAmount(sfAmount, amt);
ac.view().insert(sleNew);
return true;
@@ -1094,8 +1094,7 @@ class Invariants_test : public beast::unit_test::suite
auto const sleNew = std::make_shared<SLE>(acctKeylet);
sleNew->setFieldU32(sfSequence, 0);
sleNew->setFieldH256(sfAMMID, uint256(1));
sleNew->setFieldU32(
sfFlags, lsfDisableMaster | lsfDefaultRipple | lsfDefaultRipple);
sleNew->setFieldU32(sfFlags, lsfDisableMaster | lsfDefaultRipple);
ac.view().insert(sleNew);
return true;
},
@@ -1321,8 +1320,8 @@ class Invariants_test : public beast::unit_test::suite
using namespace test::jtx;
bool const fixPDEnabled = features[fixPermissionedDomainInvariant];
std::initializer_list<TER> badTers = {tecINVARIANT_FAILED, tecINVARIANT_FAILED};
std::initializer_list<TER> failTers = {tecINVARIANT_FAILED, tefINVARIANT_FAILED};
std::initializer_list<TER> const badTers = {tecINVARIANT_FAILED, tecINVARIANT_FAILED};
std::initializer_list<TER> const failTers = {tecINVARIANT_FAILED, tefINVARIANT_FAILED};
testcase << "PermissionedDomain" + std::string(fixPDEnabled ? " fix" : "");
@@ -1406,7 +1405,7 @@ class Invariants_test : public beast::unit_test::suite
// update PD with empty rules
{
STArray credentials(sfAcceptedCredentials, 2);
STArray const credentials(sfAcceptedCredentials, 2);
slePd->setFieldArray(sfAcceptedCredentials, credentials);
ac.view().update(slePd);
}
@@ -1506,15 +1505,16 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttPERMISSIONED_DOMAIN_SET, [](STObject&) {}},
fixPDEnabled ? failTers : badTers);
std::initializer_list<TER> goodTers = {tesSUCCESS, tesSUCCESS};
std::initializer_list<TER> const goodTers = {tesSUCCESS, tesSUCCESS};
std::vector<std::string> badMoreThan1{
std::vector<std::string> const badMoreThan1{
{"transaction affected more than 1 permissioned domain entry."}};
std::vector<std::string> emptyV;
std::vector<std::string> badNoDomains{{"no domain objects affected by"}};
std::vector<std::string> badNotDeleted{{"domain object modified, but not deleted by "}};
std::vector<std::string> badDeleted{{"domain object deleted by"}};
std::vector<std::string> badTx{
std::vector<std::string> const emptyV;
std::vector<std::string> const badNoDomains{{"no domain objects affected by"}};
std::vector<std::string> const badNotDeleted{
{"domain object modified, but not deleted by "}};
std::vector<std::string> const badDeleted{{"domain object deleted by"}};
std::vector<std::string> const badTx{
{"domain object(s) affected by an unauthorized transaction."}};
{
@@ -1664,11 +1664,11 @@ class Invariants_test : public beast::unit_test::suite
using namespace jtx;
AccountID pseudoAccountID;
Preclose createPseudo = [&, this](Account const& a, Account const& b, Env& env) {
Preclose const createPseudo = [&, this](Account const& a, Account const& b, Env& env) {
PrettyAsset const xrpAsset{xrpIssue(), 1'000'000};
// Create vault
Vault vault{env};
Vault const vault{env};
auto [tx, vKeylet] = vault.create({.owner = a, .asset = xrpAsset});
env(tx);
env.close();
@@ -1809,7 +1809,7 @@ class Invariants_test : public beast::unit_test::suite
std::uint32_t const seq = env.seq(A1);
env(pdomain::setTx(A1, credentials));
uint256 key = pdomain::getNewDomain(env.meta());
uint256 const key = pdomain::getNewDomain(env.meta());
// std::cout << "PD, acc: " << A1.id() << ", seq: " << seq << ", k: " <<
// key << std::endl;
@@ -2027,7 +2027,7 @@ class Invariants_test : public beast::unit_test::suite
// Create vault
uint256 vaultID;
Vault vault{env};
Vault const vault{env};
auto [tx, vKeylet] = vault.create({.owner = a, .asset = asset});
env(tx);
BEAST_EXPECT(env.le(vKeylet));
@@ -2052,7 +2052,7 @@ class Invariants_test : public beast::unit_test::suite
// Initialize with a placeholder value because there's no default ctor
Keylet loanBrokerKeylet = keylet::amendments();
Preclose createLoanBroker = [&, this](Account const& a, Account const& b, Env& env) {
Preclose const createLoanBroker = [&, this](Account const& a, Account const& b, Env& env) {
PrettyAsset const xrpAsset{xrpIssue(), 1'000'000};
loanBrokerKeylet = this->createLoanBroker(a, env, xrpAsset);
@@ -2131,40 +2131,40 @@ class Invariants_test : public beast::unit_test::suite
{
// Initialize with a placeholder value because there's no default
// ctor
Keylet loanBrokerKeylet = keylet::amendments();
Preclose createLoanBroker = [&, this](
Account const& alice, Account const& issuer, Env& env) {
PrettyAsset const asset = [&]() {
switch (assetType)
{
case Asset::IOU: {
PrettyAsset const iouAsset = issuer["IOU"];
env(trust(alice, iouAsset(1000)));
env(pay(issuer, alice, iouAsset(1000)));
env.close();
return iouAsset;
}
case Asset::MPT: {
MPTTester mptt{env, issuer, mptInitNoFund};
mptt.create(
{.flags = tfMPTCanClawback | tfMPTCanTransfer | tfMPTCanLock});
PrettyAsset const mptAsset = mptt.issuanceID();
mptt.authorize({.account = alice});
env(pay(issuer, alice, mptAsset(1000)));
env.close();
return mptAsset;
}
case Asset::XRP:
default:
return PrettyAsset{xrpIssue(), 1'000'000};
auto const setupAsset =
[&](Account const& alice, Account const& issuer, Env& env) -> PrettyAsset {
switch (assetType)
{
case Asset::IOU: {
PrettyAsset const iouAsset = issuer["IOU"];
env(trust(alice, iouAsset(1000)));
env(pay(issuer, alice, iouAsset(1000)));
env.close();
return iouAsset;
}
}();
loanBrokerKeylet = this->createLoanBroker(alice, env, asset);
return BEAST_EXPECT(env.le(loanBrokerKeylet));
case Asset::MPT: {
MPTTester mptt{env, issuer, mptInitNoFund};
mptt.create({.flags = tfMPTCanClawback | tfMPTCanTransfer | tfMPTCanLock});
PrettyAsset const mptAsset = mptt.issuanceID();
mptt.authorize({.account = alice});
env(pay(issuer, alice, mptAsset(1000)));
env.close();
return mptAsset;
}
case Asset::XRP:
default:
return PrettyAsset{xrpIssue(), 1'000'000};
}
};
Keylet loanBrokerKeylet = keylet::amendments();
Preclose const createLoanBroker =
[&, this](Account const& alice, Account const& issuer, Env& env) {
auto const asset = setupAsset(alice, issuer, env);
loanBrokerKeylet = this->createLoanBroker(alice, env, asset);
return BEAST_EXPECT(env.le(loanBrokerKeylet));
};
// Ensure the test scenarios are set up completely. The test cases
// will need to recompute any of these values it needs for itself
// rather than trying to return a bunch of items
@@ -2334,6 +2334,56 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttLOAN_BROKER_SET, [](STObject& tx) {}},
{tecINVARIANT_FAILED, tefINVARIANT_FAILED},
createLoanBroker);
// Test: cover available less than pseudo-account asset balance
{
Keylet brokerKeylet = keylet::amendments();
Preclose const createBrokerWithCover =
[&, this](Account const& alice, Account const& issuer, Env& env) {
auto const asset = setupAsset(alice, issuer, env);
brokerKeylet = this->createLoanBroker(alice, env, asset);
if (!BEAST_EXPECT(env.le(brokerKeylet)))
return false;
env(loanBroker::coverDeposit(alice, brokerKeylet.key, asset(10)));
env.close();
return BEAST_EXPECT(env.le(brokerKeylet));
};
doInvariantCheck(
{{"Loan Broker cover available is less than pseudo-account asset balance"}},
[&](Account const&, Account const&, ApplyContext& ac) {
auto sle = ac.view().peek(brokerKeylet);
if (!BEAST_EXPECT(sle))
return false;
// Pseudo-account holds 10 units, set cover to 5
sle->at(sfCoverAvailable) = Number(5);
ac.view().update(sle);
return true;
},
XRPAmount{},
STTx{ttLOAN_BROKER_SET, [](STObject& tx) {}},
{tecINVARIANT_FAILED, tefINVARIANT_FAILED},
createBrokerWithCover);
}
// Test: cover available greater than pseudo-account asset balance
// (requires fixSecurity3_1_3)
doInvariantCheck(
{{"Loan Broker cover available is greater than pseudo-account asset balance"}},
[&](Account const&, Account const&, ApplyContext& ac) {
auto sle = ac.view().peek(loanBrokerKeylet);
if (!BEAST_EXPECT(sle))
return false;
// Pseudo-account has no cover deposited; set cover
// higher than any incidental balance
sle->at(sfCoverAvailable) = Number(1'000'000);
ac.view().update(sle);
return true;
},
XRPAmount{},
STTx{ttLOAN_BROKER_SET, [](STObject& tx) {}},
{tecINVARIANT_FAILED, tefINVARIANT_FAILED},
createLoanBroker);
}
}
@@ -2478,7 +2528,7 @@ class Invariants_test : public beast::unit_test::suite
Account A4{"A4"};
auto const precloseXrp = [&](Account const& A1, Account const& A2, Env& env) -> bool {
env.fund(XRP(1000), A3, A4);
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
env(vault.deposit({.depositor = A1, .id = keylet.key, .amount = XRP(10)}));
@@ -2502,7 +2552,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_DELETE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2522,7 +2572,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttPAYMENT, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2542,7 +2592,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttPAYMENT, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2578,7 +2628,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_SET, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2607,7 +2657,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_DELETE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
{
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
@@ -2653,7 +2703,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_DELETE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2679,7 +2729,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_DELETE, [](STObject&) {}},
{tecINVARIANT_FAILED, tefINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
env(vault.deposit({.depositor = A1, .id = keylet.key, .amount = XRP(10)}));
@@ -2715,7 +2765,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_CREATE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2728,7 +2778,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_DEPOSIT, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2741,7 +2791,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_WITHDRAW, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2754,7 +2804,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_CLAWBACK, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2767,7 +2817,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_DELETE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2793,7 +2843,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_SET, [](STObject&) {}},
{tecINVARIANT_FAILED, tefINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, _] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -2815,7 +2865,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_WITHDRAW, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
env(vault.deposit({.depositor = A1, .id = keylet.key, .amount = XRP(10)}));
@@ -3055,7 +3105,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_CREATE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -3081,7 +3131,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_CREATE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -3108,7 +3158,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_CREATE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -3136,7 +3186,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_CREATE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -3160,7 +3210,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_CREATE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -3188,7 +3238,7 @@ class Invariants_test : public beast::unit_test::suite
STTx{ttVAULT_CREATE, [](STObject&) {}},
{tecINVARIANT_FAILED, tecINVARIANT_FAILED},
[&](Account const& A1, Account const& A2, Env& env) {
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = xrpIssue()});
env(tx);
return true;
@@ -3743,7 +3793,7 @@ class Invariants_test : public beast::unit_test::suite
}
auto const mptID = makeMptID(env.seq(A3) - 1, A3);
Asset asset = MPTIssue(mptID);
Asset const asset = MPTIssue(mptID);
// Authorize A1 A2 A4
{
Json::Value jv;
@@ -3766,7 +3816,7 @@ class Invariants_test : public beast::unit_test::suite
env.close();
}
Vault vault{env};
Vault const vault{env};
auto [tx, keylet] = vault.create({.owner = A1, .asset = asset});
env(tx);
env(vault.deposit({.depositor = A1, .id = keylet.key, .amount = asset(10)}));