Merge branch 'develop' into gregtatcam/mpt/mpt-invariants-gate-update

This commit is contained in:
Gregory Tsipenyuk
2026-08-11 18:45:07 -04:00
304 changed files with 10080 additions and 3794 deletions

View File

@@ -42,6 +42,7 @@
#include <xrpl/protocol/STLedgerEntry.h>
#include <xrpl/protocol/STObject.h>
#include <xrpl/protocol/STTx.h>
#include <xrpl/protocol/SeqProxy.h>
#include <xrpl/protocol/SystemParameters.h>
#include <xrpl/protocol/TER.h>
#include <xrpl/protocol/TxFlags.h>
@@ -450,16 +451,10 @@ class Invariants_test : public beast::unit_test::Suite
XRPAmount{},
STTx{ttACCOUNT_DELETE, [](STObject& tx) {}});
for (auto const& keyletInfo : kDirectAccountKeylets)
for (auto const& [keyletfunc, type, includeInTests] : kDirectAccountKeylets)
{
// TODO: Use structured binding once LLVM 16 is the minimum
// supported version. See also:
// https://github.com/llvm/llvm-project/issues/48582
// https://github.com/llvm/llvm-project/commit/127bf44385424891eb04cff8e52d3f157fc2cb7c
if (!keyletInfo.includeInTests)
if (!includeInTests)
continue;
auto const& keyletfunc = keyletInfo.function;
auto const& type = keyletInfo.expectedLEName;
using namespace std::string_literals;
@@ -647,8 +642,8 @@ class Invariants_test : public beast::unit_test::Suite
// make a dummy escrow ledger entry, then change the type to an
// unsupported value so that the valid type invariant check
// will fail.
auto const sleNew =
std::make_shared<SLE>(keylet::escrow(a1, (*sle)[sfSequence] + 2));
auto const sleNew = std::make_shared<SLE>(
keylet::escrow(a1, SeqProxy::rawSequence((*sle)[sfSequence] + 2)));
// We don't use ltNICKNAME directly since it's marked deprecated
// to prevent accidental use elsewhere.
@@ -935,7 +930,8 @@ class Invariants_test : public beast::unit_test::Suite
auto const sle = ac.view().peek(keylet::account(a1.id()));
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::offer(a1.id(), (*sle)[sfSequence]));
auto sleNew = std::make_shared<SLE>(
keylet::offer(a1.id(), SeqProxy::rawSequence((*sle)[sfSequence])));
sleNew->setAccountID(sfAccount, a1.id());
sleNew->setFieldU32(sfSequence, (*sle)[sfSequence]);
sleNew->setFieldAmount(sfTakerPays, XRP(-1));
@@ -949,7 +945,8 @@ class Invariants_test : public beast::unit_test::Suite
auto const sle = ac.view().peek(keylet::account(a1.id()));
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::offer(a1.id(), (*sle)[sfSequence]));
auto sleNew = std::make_shared<SLE>(
keylet::offer(a1.id(), SeqProxy::rawSequence((*sle)[sfSequence])));
sleNew->setAccountID(sfAccount, a1.id());
sleNew->setFieldU32(sfSequence, (*sle)[sfSequence]);
sleNew->setFieldAmount(sfTakerPays, a1["USD"](10));
@@ -964,7 +961,8 @@ class Invariants_test : public beast::unit_test::Suite
auto const sle = ac.view().peek(keylet::account(a1.id()));
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::offer(a1.id(), (*sle)[sfSequence]));
auto sleNew = std::make_shared<SLE>(
keylet::offer(a1.id(), SeqProxy::rawSequence((*sle)[sfSequence])));
sleNew->setAccountID(sfAccount, a1.id());
sleNew->setFieldU32(sfSequence, (*sle)[sfSequence]);
sleNew->setFieldAmount(sfTakerPays, XRP(10));
@@ -988,7 +986,8 @@ class Invariants_test : public beast::unit_test::Suite
auto const sle = ac.view().peek(keylet::account(a1.id()));
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::escrow(a1, (*sle)[sfSequence] + 2));
auto sleNew = std::make_shared<SLE>(
keylet::escrow(a1, SeqProxy::rawSequence((*sle)[sfSequence] + 2)));
sleNew->setFieldAmount(sfAmount, XRP(-1));
ac.view().insert(sleNew);
return true;
@@ -1002,7 +1001,8 @@ class Invariants_test : public beast::unit_test::Suite
auto const sle = ac.view().peek(keylet::account(a1.id()));
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::escrow(a1, (*sle)[sfSequence] + 2));
auto sleNew = std::make_shared<SLE>(
keylet::escrow(a1, SeqProxy::rawSequence((*sle)[sfSequence] + 2)));
// Use `drops(1)` to bypass a call to STAmount::canonicalize
// with an invalid value
sleNew->setFieldAmount(sfAmount, kInitialXrp + drops(1));
@@ -1018,7 +1018,8 @@ class Invariants_test : public beast::unit_test::Suite
auto const sle = ac.view().peek(keylet::account(a1.id()));
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::escrow(a1, (*sle)[sfSequence] + 2));
auto sleNew = std::make_shared<SLE>(
keylet::escrow(a1, SeqProxy::rawSequence((*sle)[sfSequence] + 2)));
Issue const usd{Currency(0x5553440000000000), AccountID(0x4985601)};
STAmount const amt(usd, -1);
@@ -1035,7 +1036,8 @@ class Invariants_test : public beast::unit_test::Suite
auto const sle = ac.view().peek(keylet::account(a1.id()));
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::escrow(a1, (*sle)[sfSequence] + 2));
auto sleNew = std::make_shared<SLE>(
keylet::escrow(a1, SeqProxy::rawSequence((*sle)[sfSequence] + 2)));
Issue const bad{badCurrency(), AccountID(0x4985601)};
STAmount const amt(bad, 1);
@@ -1052,7 +1054,8 @@ class Invariants_test : public beast::unit_test::Suite
auto const sle = ac.view().peek(keylet::account(a1.id()));
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::escrow(a1, (*sle)[sfSequence] + 2));
auto sleNew = std::make_shared<SLE>(
keylet::escrow(a1, SeqProxy::rawSequence((*sle)[sfSequence] + 2)));
MPTIssue const mpt{makeMptID(1, AccountID(0x4985601))};
STAmount const amt(mpt, -1);
@@ -1477,7 +1480,7 @@ class Invariants_test : public beast::unit_test::Suite
std::uint32_t numCreds = 2,
std::uint32_t seq = 10)
{
Keylet const pdKeylet = keylet::permissionedDomain(a1.id(), seq);
Keylet const pdKeylet = keylet::permissionedDomain(a1.id(), SeqProxy::rawSequence(seq));
auto sle = std::make_shared<SLE>(pdKeylet);
sle->setAccountID(sfOwner, a1);
@@ -2019,7 +2022,7 @@ class Invariants_test : public beast::unit_test::Suite
makeEnv(features),
{{"domain doesn't exist"}},
[](Account const& a1, Account const&, ApplyContext& ac) {
Keylet const offerKey = keylet::offer(a1.id(), 10);
Keylet const offerKey = keylet::offer(a1.id(), SeqProxy::rawSequence(10));
auto sleOffer = std::make_shared<SLE>(offerKey);
sleOffer->setAccountID(sfAccount, a1);
sleOffer->setFieldAmount(sfTakerPays, a1["USD"](10));
@@ -2046,7 +2049,7 @@ class Invariants_test : public beast::unit_test::Suite
makeEnv(features),
{{"hybrid offer is malformed"}},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
Keylet const offerKey = keylet::offer(a2.id(), 10);
Keylet const offerKey = keylet::offer(a2.id(), SeqProxy::rawSequence(10));
auto sleOffer = std::make_shared<SLE>(offerKey);
sleOffer->setAccountID(sfAccount, a2);
sleOffer->setFieldAmount(sfTakerPays, a1["USD"](10));
@@ -2081,7 +2084,7 @@ class Invariants_test : public beast::unit_test::Suite
a2,
{{"hybrid offer is malformed"}},
[&pd1](Account const& a1, Account const& a2, ApplyContext& ac) {
Keylet const offerKey = keylet::offer(a2.id(), 10);
Keylet const offerKey = keylet::offer(a2.id(), SeqProxy::rawSequence(10));
auto sleOffer = std::make_shared<SLE>(offerKey);
sleOffer->setAccountID(sfAccount, a2);
sleOffer->setFieldAmount(sfTakerPays, a1["USD"](10));
@@ -2120,7 +2123,7 @@ class Invariants_test : public beast::unit_test::Suite
fixEnabled ? std::vector<std::string>{{"hybrid offer is malformed"}}
: std::vector<std::string>{},
[&pd1](Account const& a1, Account const& a2, ApplyContext& ac) {
Keylet const offerKey = keylet::offer(a2.id(), 10);
Keylet const offerKey = keylet::offer(a2.id(), SeqProxy::rawSequence(10));
auto sleOffer = std::make_shared<SLE>(offerKey);
sleOffer->setAccountID(sfAccount, a2);
sleOffer->setFieldAmount(sfTakerPays, a1["USD"](10));
@@ -2157,7 +2160,7 @@ class Invariants_test : public beast::unit_test::Suite
a2,
{{"hybrid offer is malformed"}},
[&pd1](Account const& a1, Account const& a2, ApplyContext& ac) {
Keylet const offerKey = keylet::offer(a2.id(), 10);
Keylet const offerKey = keylet::offer(a2.id(), SeqProxy::rawSequence(10));
auto sleOffer = std::make_shared<SLE>(offerKey);
sleOffer->setAccountID(sfAccount, a2);
sleOffer->setFieldAmount(sfTakerPays, a1["USD"](10));
@@ -2190,7 +2193,7 @@ class Invariants_test : public beast::unit_test::Suite
a2,
{{"transaction consumed wrong domains"}},
[&pd1](Account const& a1, Account const& a2, ApplyContext& ac) {
Keylet const offerKey = keylet::offer(a2.id(), 10);
Keylet const offerKey = keylet::offer(a2.id(), SeqProxy::rawSequence(10));
auto sleOffer = std::make_shared<SLE>(offerKey);
sleOffer->setAccountID(sfAccount, a2);
sleOffer->setFieldAmount(sfTakerPays, a1["USD"](10));
@@ -2227,7 +2230,7 @@ class Invariants_test : public beast::unit_test::Suite
a2,
{{"domain transaction affected regular offers"}},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
Keylet const offerKey = keylet::offer(a2.id(), 10);
Keylet const offerKey = keylet::offer(a2.id(), SeqProxy::rawSequence(10));
auto sleOffer = std::make_shared<SLE>(offerKey);
sleOffer->setAccountID(sfAccount, a2);
sleOffer->setFieldAmount(sfTakerPays, a1["USD"](10));
@@ -2428,7 +2431,7 @@ class Invariants_test : public beast::unit_test::Suite
// Create Loan Broker
using namespace loan_broker;
auto const loanBrokerKeylet = keylet::loanBroker(a.id(), env.seq(a));
auto const loanBrokerKeylet = keylet::loanBroker(a.id(), SeqProxy::rawSequence(env.seq(a)));
// Create a Loan Broker with all default values.
env(set(a, vaultID), Fee(kIncrement));
@@ -2932,7 +2935,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"vault deletion succeeded without deleting a vault"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -2953,7 +2956,7 @@ class Invariants_test : public beast::unit_test::Suite
{"vault updated by a wrong transaction type",
"deleted Vault without deleting its pseudo-account"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -2973,7 +2976,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"vault updated by a wrong transaction type"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -2994,7 +2997,7 @@ class Invariants_test : public beast::unit_test::Suite
{"vault updated by a wrong transaction type"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const sequence = ac.view().seq();
auto const vaultKeylet = keylet::vault(a1.id(), sequence);
auto const vaultKeylet = keylet::vault(a1.id(), SeqProxy::rawSequence(sequence));
auto sleVault = std::make_shared<SLE>(vaultKeylet);
auto const vaultPage = ac.view().dirInsert(
keylet::ownerDir(a1.id()), sleVault->key(), describeOwnerDir(a1.id()));
@@ -3011,7 +3014,7 @@ class Invariants_test : public beast::unit_test::Suite
{"vault deleted by a wrong transaction type",
"deleted Vault without deleting its pseudo-account"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3033,14 +3036,16 @@ class Invariants_test : public beast::unit_test::Suite
"deleted Vault without deleting its pseudo-account"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
{
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet =
keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
ac.view().erase(sleVault);
}
{
auto const keylet = keylet::vault(a2.id(), ac.view().seq());
auto const keylet =
keylet::vault(a2.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3069,7 +3074,7 @@ class Invariants_test : public beast::unit_test::Suite
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const sequence = ac.view().seq();
auto const insertVault = [&](Account const a) {
auto const vaultKeylet = keylet::vault(a.id(), sequence);
auto const vaultKeylet = keylet::vault(a.id(), SeqProxy::rawSequence(sequence));
auto sleVault = std::make_shared<SLE>(vaultKeylet);
auto const vaultPage = ac.view().dirInsert(
keylet::ownerDir(a.id()), sleVault->key(), describeOwnerDir(a.id()));
@@ -3089,7 +3094,7 @@ class Invariants_test : public beast::unit_test::Suite
{"deleted vault must also delete shares",
"deleted Vault without deleting its pseudo-account"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3111,7 +3116,7 @@ class Invariants_test : public beast::unit_test::Suite
"deleted vault must have no assets outstanding",
"deleted vault must have no assets available"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3136,7 +3141,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"vault operation succeeded without modifying a vault"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3223,7 +3228,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"updated vault must have shares"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3250,7 +3255,7 @@ class Invariants_test : public beast::unit_test::Suite
{"vault operation succeeded without updating shares",
"assets available must not be greater than assets outstanding"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3274,11 +3279,11 @@ class Invariants_test : public beast::unit_test::Suite
"set must not change assets available",
"set must not change shares outstanding",
"set must not change vault balance",
"assets available must be positive",
"assets available must not be negative",
"assets available must not be greater than assets outstanding",
"assets outstanding must be positive"},
"assets outstanding must not be negative"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3310,7 +3315,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"violation of vault immutable data"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3326,7 +3331,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"violation of vault immutable data"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3342,7 +3347,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"violation of vault immutable data"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3359,7 +3364,7 @@ class Invariants_test : public beast::unit_test::Suite
{"vault transaction must not change loss unrealized",
"set must not change assets outstanding"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [&](Adjustments& sample) {
sample.lossUnrealized = 13;
sample.assetsTotal = 20;
@@ -3376,7 +3381,7 @@ class Invariants_test : public beast::unit_test::Suite
"between assets outstanding and available",
"vault transaction must not change loss unrealized"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 100, [&](Adjustments& sample) {
sample.lossUnrealized = 13;
}));
@@ -3395,7 +3400,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"loss unrealized must not be negative"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [&](Adjustments& sample) {
sample.lossUnrealized = -1;
}));
@@ -3412,7 +3417,7 @@ class Invariants_test : public beast::unit_test::Suite
makeEnv(defaultAmendments() - fixCleanup3_4_0),
{},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [&](Adjustments& sample) {
sample.lossUnrealized = -1;
}));
@@ -3426,7 +3431,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"set assets outstanding must not exceed assets maximum"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [&](Adjustments& sample) {
sample.assetsMaximum = 1;
}));
@@ -3438,9 +3443,9 @@ class Invariants_test : public beast::unit_test::Suite
TxAccount::A2);
doInvariantCheck(
{"assets maximum must be positive"},
{"assets maximum must not be negative"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [&](Adjustments& sample) {
sample.assetsMaximum = -1;
}));
@@ -3456,7 +3461,7 @@ class Invariants_test : public beast::unit_test::Suite
"updated zero sized vault must have no assets outstanding",
"updated zero sized vault must have no assets available"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3477,7 +3482,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"updated shares must not exceed maximum"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3498,7 +3503,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"updated shares must not exceed maximum"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
kAdjust(ac.view(), keylet, kArgs(a2.id(), 10, [](Adjustments&) {}));
auto sleVault = ac.view().peek(keylet);
@@ -3525,7 +3530,7 @@ class Invariants_test : public beast::unit_test::Suite
"create operation must not have updated a vault",
},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3551,7 +3556,7 @@ class Invariants_test : public beast::unit_test::Suite
"create operation must not have updated a vault",
},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3578,7 +3583,7 @@ class Invariants_test : public beast::unit_test::Suite
"create operation must not have updated a vault",
},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3602,7 +3607,7 @@ class Invariants_test : public beast::unit_test::Suite
"create operation must not have updated a vault",
},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3626,11 +3631,11 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{
"assets maximum must be positive",
"assets maximum must not be negative",
"create operation must not have updated a vault",
},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3654,7 +3659,7 @@ class Invariants_test : public beast::unit_test::Suite
"shares issuer must be a pseudo-account",
"shares issuer pseudo-account must point back to the vault"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
auto sleVault = ac.view().peek(keylet);
if (!sleVault)
return false;
@@ -3683,7 +3688,7 @@ class Invariants_test : public beast::unit_test::Suite
// the invariants holding. Except one: it is created by the
// wrong transaction type.
auto const sequence = ac.view().seq();
auto const vaultKeylet = keylet::vault(a1.id(), sequence);
auto const vaultKeylet = keylet::vault(a1.id(), SeqProxy::rawSequence(sequence));
auto sleVault = std::make_shared<SLE>(vaultKeylet);
auto const vaultPage = ac.view().dirInsert(
keylet::ownerDir(a1.id()), sleVault->key(), describeOwnerDir(a1.id()));
@@ -3739,7 +3744,7 @@ class Invariants_test : public beast::unit_test::Suite
"shares issuer pseudo-account must point back to the vault"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const sequence = ac.view().seq();
auto const vaultKeylet = keylet::vault(a1.id(), sequence);
auto const vaultKeylet = keylet::vault(a1.id(), SeqProxy::rawSequence(sequence));
auto sleVault = std::make_shared<SLE>(vaultKeylet);
auto const vaultPage = ac.view().dirInsert(
keylet::ownerDir(a1.id()), sleVault->key(), describeOwnerDir(a1.id()));
@@ -3798,7 +3803,7 @@ class Invariants_test : public beast::unit_test::Suite
{"shares issuer and vault pseudo-account must be the same", "shares issuer must exist"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const sequence = ac.view().seq();
auto const vaultKeylet = keylet::vault(a1.id(), sequence);
auto const vaultKeylet = keylet::vault(a1.id(), SeqProxy::rawSequence(sequence));
auto sleVault = std::make_shared<SLE>(vaultKeylet);
auto const vaultPage = ac.view().dirInsert(
keylet::ownerDir(a1.id()), sleVault->key(), describeOwnerDir(a1.id()));
@@ -3839,7 +3844,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"deposit must change vault balance"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [](Adjustments& sample) {
sample.vaultAssets.reset();
}));
@@ -3852,7 +3857,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"deposit assets outstanding must not exceed assets maximum"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 200, [&](Adjustments& sample) {
sample.assetsMaximum = 1;
}));
@@ -3871,7 +3876,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"deposit must increase vault balance", "deposit must change depositor balance"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
// Move 10 drops to A4 to enforce total XRP balance
auto sleA4 = ac.view().peek(keylet::account(a4.id()));
@@ -3901,7 +3906,7 @@ class Invariants_test : public beast::unit_test::Suite
"deposit and assets outstanding must add up",
"deposit and assets available must add up"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
// Move 10 drops from A2 to A3 to enforce total XRP balance
auto sleA3 = ac.view().peek(keylet::account(a3.id()));
@@ -3924,7 +3929,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"deposit must change depositor balance"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
// Move 10 drops from A3 to vault to enforce total XRP balance
auto sleA3 = ac.view().peek(keylet::account(a3.id()));
@@ -3946,7 +3951,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"deposit must change depositor shares"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 10, [&](Adjustments& sample) {
sample.accountShares.reset();
}));
@@ -3960,7 +3965,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"deposit must change vault shares"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 10, [](Adjustments& sample) {
sample.sharesTotal = 0;
@@ -3978,7 +3983,7 @@ class Invariants_test : public beast::unit_test::Suite
"deposit must not change vault balance by more than deposited "
"amount"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 10, [&](Adjustments& sample) {
sample.accountShares->amount = -5;
sample.sharesTotal = -10;
@@ -3997,7 +4002,7 @@ class Invariants_test : public beast::unit_test::Suite
(*sleA3)[sfBalance] = *(*sleA3)[sfBalance] - 2000;
ac.view().update(sleA3);
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 10, [&](Adjustments& sample) {
sample.assetsTotal = 11;
}));
@@ -4018,7 +4023,7 @@ class Invariants_test : public beast::unit_test::Suite
{"deposit and assets outstanding must add up",
"deposit and assets available must add up"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 10, [&](Adjustments& sample) {
sample.assetsTotal = 7;
sample.assetsAvailable = 7;
@@ -4034,7 +4039,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"withdrawal must change vault balance"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [](Adjustments& sample) {
sample.vaultAssets.reset();
}));
@@ -4051,7 +4056,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"withdrawal must change one destination balance"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
// Move 10 drops to A4 to enforce total XRP balance
auto sleA4 = ac.view().peek(keylet::account(a4.id()));
@@ -4085,7 +4090,7 @@ class Invariants_test : public beast::unit_test::Suite
"withdrawal and assets available must add up",
},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
// Move 10 drops from A2 to A3 to enforce total XRP balance
auto sleA3 = ac.view().peek(keylet::account(a3.id()));
@@ -4108,7 +4113,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"withdrawal must change one destination balance"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
if (!kAdjust(ac.view(), keylet, kArgs(a2.id(), -10, [&](Adjustments& sample) {
*sample.vaultAssets -= 5;
})))
@@ -4129,7 +4134,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"withdrawal must change depositor shares"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), -10, [&](Adjustments& sample) {
sample.accountShares.reset();
}));
@@ -4143,7 +4148,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"withdrawal must change vault shares"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), -10, [](Adjustments& sample) {
sample.sharesTotal = 0;
}));
@@ -4159,7 +4164,7 @@ class Invariants_test : public beast::unit_test::Suite
"withdrawal must change depositor and vault shares by equal "
"amount"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), -10, [&](Adjustments& sample) {
sample.accountShares->amount = 5;
sample.sharesTotal = 10;
@@ -4175,7 +4180,7 @@ class Invariants_test : public beast::unit_test::Suite
{"withdrawal and assets outstanding must add up",
"withdrawal and assets available must add up"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), -10, [&](Adjustments& sample) {
sample.assetsTotal = -15;
sample.assetsAvailable = -15;
@@ -4194,7 +4199,7 @@ class Invariants_test : public beast::unit_test::Suite
(*sleA3)[sfBalance] = *(*sleA3)[sfBalance] - 2000;
ac.view().update(sleA3);
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), -10, [&](Adjustments& sample) {
sample.assetsTotal = -7;
}));
@@ -4262,7 +4267,8 @@ class Invariants_test : public beast::unit_test::Suite
"withdrawal must change depositor and vault shares by equal "
"amount"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq() - 2);
auto const keylet =
keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq() - 2));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), -10, [&](Adjustments& sample) {
sample.accountShares->amount = 5;
}));
@@ -4277,7 +4283,8 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"clawback must change vault balance"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq() - 2);
auto const keylet =
keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq() - 2));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), -1, [&](Adjustments& sample) {
sample.vaultAssets.reset();
}));
@@ -4291,7 +4298,7 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"clawback may only be performed by the asset issuer"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq());
auto const keylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq()));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [&](Adjustments& sample) {}));
},
XRPAmount{},
@@ -4303,7 +4310,8 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"clawback may only be performed by the asset issuer"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq() - 2);
auto const keylet =
keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq() - 2));
return kAdjust(ac.view(), keylet, kArgs(a2.id(), 0, [&](Adjustments& sample) {}));
},
XRPAmount{},
@@ -4316,7 +4324,8 @@ class Invariants_test : public beast::unit_test::Suite
"clawback must decrease holder shares",
"clawback must change vault shares"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq() - 2);
auto const keylet =
keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq() - 2));
return kAdjust(ac.view(), keylet, kArgs(a4.id(), 10, [&](Adjustments& sample) {
sample.sharesTotal = 0;
}));
@@ -4334,7 +4343,8 @@ class Invariants_test : public beast::unit_test::Suite
doInvariantCheck(
{"clawback must change holder shares"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq() - 2);
auto const keylet =
keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq() - 2));
return kAdjust(ac.view(), keylet, kArgs(a4.id(), -10, [&](Adjustments& sample) {
sample.accountShares.reset();
}));
@@ -4354,7 +4364,8 @@ class Invariants_test : public beast::unit_test::Suite
"clawback and assets outstanding must add up",
"clawback and assets available must add up"},
[&](Account const& a1, Account const& a2, ApplyContext& ac) {
auto const keylet = keylet::vault(a1.id(), ac.view().seq() - 2);
auto const keylet =
keylet::vault(a1.id(), SeqProxy::rawSequence(ac.view().seq() - 2));
return kAdjust(ac.view(), keylet, kArgs(a4.id(), -10, [&](Adjustments& sample) {
sample.accountShares->amount = -8;
sample.assetsTotal = -7;
@@ -4412,7 +4423,8 @@ class Invariants_test : public beast::unit_test::Suite
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::check(a1.id(), (*sle)[sfSequence]));
auto sleNew = std::make_shared<SLE>(
keylet::check(a1.id(), SeqProxy::rawSequence((*sle)[sfSequence])));
sleNew->setAccountID(sfAccount, a1.id());
sleNew->setAccountID(sfDestination, a2.id());
sleNew->setFieldAmount(sfSendMax, nonCanonicalMPTAmount(sfSendMax));
@@ -4427,7 +4439,8 @@ class Invariants_test : public beast::unit_test::Suite
if (!sle)
return false;
auto sleNew = std::make_shared<SLE>(keylet::check(a1.id(), (*sle)[sfSequence]));
auto sleNew = std::make_shared<SLE>(
keylet::check(a1.id(), SeqProxy::rawSequence((*sle)[sfSequence])));
sleNew->setAccountID(sfAccount, a1.id());
sleNew->setAccountID(sfDestination, a2.id());
sleNew->setFieldAmount(sfSendMax, negativeMPTAmount(sfSendMax));
@@ -5972,7 +5985,7 @@ class Invariants_test : public beast::unit_test::Suite
STTx{ttACCOUNT_SET, [](STObject&) {}},
{tecINVARIANT_FAILED, tefINVARIANT_FAILED},
[&checkID](Account const& a1, Account const& a2, Env& env) {
checkID = keylet::check(a1.id(), env.seq(a1)).key;
checkID = keylet::check(a1.id(), SeqProxy::rawSequence(env.seq(a1))).key;
env(check::create(a1, a2, XRP(1)));
return true;
});
@@ -6098,7 +6111,7 @@ class Invariants_test : public beast::unit_test::Suite
OpenView ov{*env.current()};
auto const vaultKeylet = keylet::vault(a1.id(), ov.seq());
auto const vaultKeylet = keylet::vault(a1.id(), SeqProxy::rawSequence(ov.seq()));
auto sleVault = std::make_shared<SLE>(vaultKeylet);
sleVault->makeFieldAbsent(sfAccount);
ov.rawInsert(sleVault);