mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-21 14:20:56 +00:00
Merge branch 'develop' into gregtatcam/mpt/mpt-invariants-gate-update
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user