Merge branch 'develop' into gregtatcam/mpt/audit-attackathon-fixes

This commit is contained in:
Gregory Tsipenyuk
2026-05-20 10:16:30 -04:00
694 changed files with 8411 additions and 7336 deletions

View File

@@ -128,7 +128,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTRequireAuth | kMPT_DEX_FLAGS,
.flags = tfMPTRequireAuth | kMptDexFlags,
.authHolder = true});
AMM const ammAlice(env, alice_, USD(10'000), btc(10'000));
}
@@ -142,7 +142,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
usd.set({.flags = tfMPTLock});
AMM const ammAliceFail(env, alice_, XRP(10'000), usd(10'000), Ter(tecFROZEN));
usd.set({.flags = tfMPTUnlock});
@@ -346,7 +346,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
btc.set({.flags = tfMPTLock});
AMM const ammAlice(env, alice_, USD(10'000), btc(10'000), Ter(tecFROZEN));
BEAST_EXPECT(!ammAlice.ammExists());
@@ -361,7 +361,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
btc.set({.holder = alice_, .flags = tfMPTLock});
// alice's token is locked
@@ -496,7 +496,7 @@ private:
{.env = env,
.issuer = gw_,
.holders = {alice_, carol_},
.flags = tfMPTCanLock | kMPT_DEX_FLAGS,
.flags = tfMPTCanLock | kMptDexFlags,
.authHolder = true});
// Depositing mismatched token, invalid Asset1In.issue
@@ -687,7 +687,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM ammAlice(env, alice_, USD(10'000), btc(10'000));
btc.set({.flags = tfMPTLock});
@@ -713,7 +713,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM ammAlice(env, alice_, USD(10'000), btc(10'000));
@@ -799,13 +799,13 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
MPTTester usd(
{.env = env,
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 40'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM ammAlice(env, alice_, usd(10'000), btc(10'000));
@@ -871,7 +871,7 @@ private:
{.maxAmt = 1'000'000,
.authorize = {{alice}},
.pay = {{{alice}, 10'000}},
.flags = tfMPTRequireAuth | kMPT_DEX_FLAGS,
.flags = tfMPTRequireAuth | kMptDexFlags,
.authHolder = true});
AMM amm(env, alice, XRP(10'000), btc(10'000));
@@ -2036,7 +2036,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTRequireAuth | kMPT_DEX_FLAGS,
.flags = tfMPTRequireAuth | kMptDexFlags,
.authHolder = true});
AMM ammAlice(env, alice_, XRP(10'000), btc(10'000));
WithdrawArg const args{
@@ -2054,7 +2054,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 2'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
// Invalid tokens
ammAlice.withdraw(alice_, 0, std::nullopt, std::nullopt, Ter(temBAD_AMM_TOKENS));
@@ -2225,7 +2225,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTRequireAuth | kMPT_DEX_FLAGS,
.flags = tfMPTRequireAuth | kMptDexFlags,
.authHolder = true});
MPT const btc = btcm;
@@ -2276,7 +2276,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS,
.flags = tfMPTCanLock | kMptDexFlags,
.authHolder = true});
AMM ammAlice(env, alice_, XRP(10'000), btc(10'000));
@@ -2300,13 +2300,13 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
MPTTester const usd(
{.env = env,
.issuer = gw_,
.holders = {alice_},
.pay = 40'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM ammAlice(env, alice_, usd(10'000), btc(10'000));
@@ -2334,7 +2334,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM ammAlice(env, alice_, USD(10'000), btc(10'000));
@@ -3477,7 +3477,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 2'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM amm(env, gw_, XRP(1'000), btc(1'000), false, 1'000);
// auction slot is owned by the creator of the AMM i.e. gw
@@ -3502,7 +3502,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 2'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM amm(env, gw_, XRP(1'000), btc(1'000), false, 1'000);
// auction slot is owned by the creator of the AMM i.e. gw
@@ -3610,7 +3610,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_, bob_},
.pay = 30'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM ammAlice(env, alice_, btc(10'000'000'000), USD(10'000));
ammAlice.deposit(carol_, 1'000'000);
@@ -3646,7 +3646,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_},
.pay = 1'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM amm(env, gw_, XRP(10), btc(1'000));
auto const lpIssue = amm.lptIssue();
env.trust(STAmount{lpIssue, 100}, alice_);
@@ -3711,7 +3711,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_, bob_},
.pay = 30'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM ammAlice(env, alice_, XRP(10'000), btc(10'000));
ammAlice.deposit(carol_, 1'000'000);
@@ -3756,7 +3756,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_, bob_},
.pay = 30'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM ammAlice(env, alice_, XRP(10'000), btc(10'000));
ammAlice.deposit(carol_, 1'000'000);
@@ -3770,18 +3770,17 @@ private:
// 1st Interval after close, price for 0th interval.
env(ammAlice.bid({.account = bob_}));
env.close(seconds(kAUCTION_SLOT_INTERVAL_DURATION + 1));
env.close(seconds(kAuctionSlotIntervalDuration + 1));
BEAST_EXPECT(ammAlice.expectAuctionSlot(0, 1, IOUAmount{1'155, -1}));
// 10th Interval after close, price for 1st interval.
env(ammAlice.bid({.account = carol_}));
env.close(seconds((10 * kAUCTION_SLOT_INTERVAL_DURATION) + 1));
env.close(seconds((10 * kAuctionSlotIntervalDuration) + 1));
BEAST_EXPECT(ammAlice.expectAuctionSlot(0, 10, IOUAmount{121'275, -3}));
// 20th Interval (expired) after close, price for 10th interval.
env(ammAlice.bid({.account = bob_}));
env.close(
seconds((kAUCTION_SLOT_TIME_INTERVALS * kAUCTION_SLOT_INTERVAL_DURATION) + 1));
env.close(seconds((kAuctionSlotTimeIntervals * kAuctionSlotIntervalDuration) + 1));
BEAST_EXPECT(ammAlice.expectAuctionSlot(0, std::nullopt, IOUAmount{127'33875, -5}));
// 0 Interval.
@@ -3884,7 +3883,7 @@ private:
btc(13'000'000'671), STAmount{USD, UINT64_C(13'114'03663044931), -11}, ammTokens));
// Auction slot expired, no discounted fee
env.close(seconds(kTOTAL_TIME_SLOT_SECS + 1));
env.close(seconds(kTotalTimeSlotSecs + 1));
// clock is parent's based
env.close();
@@ -3917,7 +3916,7 @@ private:
testAMM(
[&](AMM& ammAlice, Env& env) {
// Bid a tiny amount
auto const tiny = Number{STAmount::kMIN_VALUE, STAmount::kMIN_OFFSET};
auto const tiny = Number{STAmount::kMinValue, STAmount::kMinOffset};
env(ammAlice.bid({.account = alice_, .bidMin = IOUAmount{tiny}}));
// Auction slot purchase price is equal to the tiny amount
// since the minSlotPrice is 0 with no trading fee.
@@ -3928,7 +3927,7 @@ private:
// Bid the tiny amount
env(ammAlice.bid({
.account = alice_,
.bidMin = IOUAmount{STAmount::kMIN_VALUE, STAmount::kMIN_OFFSET},
.bidMin = IOUAmount{STAmount::kMinValue, STAmount::kMinOffset},
}));
// Pay slightly higher price
BEAST_EXPECT(ammAlice.expectAuctionSlot(0, 0, IOUAmount{tiny * Number{105, -2}}));
@@ -3971,7 +3970,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_},
.pay = 2'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
fund(env, gw_, {alice_, bob_}, {USD(2'000)}, Fund::TokenOnly);
AMM amm(env, gw_, btc(1'000'000'000), USD(1'010), false, 1'000);
auto const lpIssue = amm.lptIssue();
@@ -4007,7 +4006,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_},
.pay = 2'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM amm(env, gw_, XRP(1'000), btc(1'010), false, 1'000);
json::Value const tx = amm.bid({.account = alice_, .bidMin = 500});
@@ -4068,7 +4067,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
// to clawback from AMM account, must use AMMClawback instead of
// Clawback
@@ -4103,7 +4102,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 100,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
// XRP balance is below reserve
AMM const ammAlice(env, acct, XRP(10), btc(10));
// Pay below reserve
@@ -4122,7 +4121,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 20'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
// XRP balance is above reserve
AMM const ammAlice(env, acct, XRP(1'000'000), btc(10'000));
// Pay below reserve
@@ -4138,16 +4137,16 @@ private:
testAMM(
[&](AMM& ammAlice, Env& env) {
env(escrow::create(carol_, ammAlice.ammAccount(), MPT(ammAlice[1])(1)),
escrow::kCONDITION(escrow::kCB1),
escrow::kFINISH_TIME(env.now() + 1s),
escrow::kCANCEL_TIME(env.now() + 2s),
escrow::kCondition(escrow::kCb1),
escrow::kFinishTime(env.now() + 1s),
escrow::kCancelTime(env.now() + 2s),
Fee(1'500),
Ter(tecNO_PERMISSION));
env(escrow::create(carol_, ammAlice.ammAccount(), XRP(1)),
escrow::kCONDITION(escrow::kCB1),
escrow::kFINISH_TIME(env.now() + 1s),
escrow::kCANCEL_TIME(env.now() + 2s),
escrow::kCondition(escrow::kCb1),
escrow::kFinishTime(env.now() + 1s),
escrow::kCancelTime(env.now() + 2s),
Fee(1'500),
Ter(tecNO_PERMISSION));
},
@@ -4232,7 +4231,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'000));
btc.set({.flags = tfMPTLock});
@@ -4258,7 +4257,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'000));
btc.set({.holder = carol_, .flags = tfMPTLock});
@@ -4279,7 +4278,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'000));
btc.set({.holder = alice_, .flags = tfMPTLock});
@@ -4300,13 +4299,13 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
MPTTester eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM const ammAlice(env, alice_, eth(10'000), btc(10'000));
btc.set({.holder = carol_, .flags = tfMPTLock});
@@ -4336,7 +4335,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'000));
btc.set({.holder = ammAlice.ammAccount(), .flags = tfMPTLock});
@@ -4635,7 +4634,7 @@ private:
.holders = {alice_, carol_},
.transferFee = 10'000,
.pay = 30'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
auto ammAlice = AMM(env, alice_, XRP(10'000), btc(10'010'000'000'000'000));
env.close();
auto carolMPT = env.balance(carol_, MPT(btc));
@@ -4763,13 +4762,13 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 3'000'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 3'000'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env.fund(XRP(1'000), bob_);
env.close();
auto ammEthXrp = AMM(env, alice_, XRP(10'000), eth(1'000'000'000'000'000'000));
@@ -4813,13 +4812,13 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 3'000'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_},
.pay = 1'000'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
auto ammAlice = AMM(env, alice_, XRP(10'000), btc(1'000'000'000'000'000'000));
env.fund(XRP(1'000), bob_);
env.close();
@@ -4861,7 +4860,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 30'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM ammAlice(env, alice_, XRP(10'000), btc(10'100'000'000'000'000));
env(offer(bob_, XRP(100), MPT(ammAlice[1])(100'000'000'000'000)), Txflags(tfPassive));
env.close();
@@ -4896,7 +4895,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 2'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env(offer(bob_, XRP(50), btc(150)), Txflags(tfPassive));
env.close();
AMM const ammAlice(env, alice_, XRP(1'000), btc(1'050));
@@ -4915,7 +4914,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 30'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM ammAlice(env, alice_, XRP(10'000), btc(10'100));
env(offer(bob_, MPT(ammAlice[1])(100), XRP(100)));
env.close();
@@ -4941,14 +4940,14 @@ private:
.holders = {alice_, carol_},
.transferFee = 25'000,
.pay = 30'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, carol_},
.transferFee = 25'000,
.pay = 30'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const ammAlice(env, alice_, btc(1'000'000'000'000'000), eth(1'100'000'000'000'000));
// This offer succeeds to cross pre- and post-amendment
// because the strand's out amount is small enough to match
@@ -4977,7 +4976,7 @@ private:
.holders = {alice_, carol_},
.transferFee = 100,
.pay = 30'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const amm(env, alice_, XRP(1'000), btc(500'000'000'000'000));
env(offer(carol_, XRP(100), btc(55'000'000'000'000)));
env.close();
@@ -5000,7 +4999,7 @@ private:
.holders = {alice_, carol_},
.transferFee = 100,
.pay = 3'000'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const amm(env, alice_, XRP(1'000), btc(50'000'000'000'000'000));
env(offer(carol_, XRP(10), btc(5'500'000'000'000'000)));
env.close();
@@ -5020,14 +5019,14 @@ private:
.holders = {alice_, bob_, carol_, ed},
.transferFee = 25'000,
.pay = 20'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_, ed},
.transferFee = 25'000,
.pay = 20'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const ammAlice(
env, alice_, btc(10'000'000'000'000'000), eth(11'000'000'000'000'000));
@@ -5067,14 +5066,14 @@ private:
.holders = {alice_, bob_, carol_},
.transferFee = 25'000,
.pay = 30'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.transferFee = 25'000,
.pay = 30'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const ammAlice(env, alice_, btc(1'000), eth(1'100));
env(rate(gw_, 1.25));
env.close();
@@ -5110,28 +5109,28 @@ private:
.holders = {alice_, bob_, carol_, dan, ed},
.transferFee = 25'000,
.pay = 30'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_, dan, ed},
.transferFee = 25'000,
.pay = 30'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const can(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_, dan, ed},
.transferFee = 25'000,
.pay = 2'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const gbp(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_, dan, ed},
.transferFee = 25'000,
.pay = 3'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const ammAlice(env, alice_, gbp(1'000'000), eth(10'125));
env(pay(gw_, bob_, can(1'953'125)));
env.close();
@@ -5190,25 +5189,25 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 500'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 500'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const usd(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 500'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eur(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 500'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const xrpEur(env, alice_, XRP(10'100), eur(100'000'000'000'000'000));
AMM const eurBtc(
env, alice_, eur(100'000'000'000'000'000), btc(102'000'000'000'000'000));
@@ -5263,25 +5262,25 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 50'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 50'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const usd(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 50'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eur(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 50'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const xrpEur(env, alice_, XRP(10'100), eur(10'000'000'000'000'000));
AMM const eurBtc(env, alice_, eur(10'000'000'000'000'000), btc(10'200'000'000'000'000));
AMM const btcUsd(env, alice_, btc(10'100'000'000'000'000), usd(10'000'000'000'000'000));
@@ -5316,13 +5315,13 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 30'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 400'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'000'000'000'000'000));
for (int i = 0; i < 30; ++i)
@@ -5352,13 +5351,13 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 30'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester const eth(
{.env = env,
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 400'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'000'000'000'000'000));
for (int i = 0; i < 29; ++i)
@@ -5389,7 +5388,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 30'000'000'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env(offer(bob_, XRP(100), btc(100'001'000'000'000)));
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'100'000'000'000'000));
@@ -5412,7 +5411,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'000));
btc.set({.holder = carol_, .flags = tfMPTLock});
@@ -5433,7 +5432,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM const ammAlice(env, alice_, XRP(10'000), btc(10'000));
btc.set({.holder = alice_, .flags = tfMPTLock});
@@ -5604,7 +5603,7 @@ private:
env.fund(XRP(10'000), lP1);
env.fund(XRP(10'000), lP2);
MPTTester const tst(
{.env = env, .issuer = gw, .holders = {lP1, lP2}, .flags = kMPT_DEX_FLAGS});
{.env = env, .issuer = gw, .holders = {lP1, lP2}, .flags = kMptDexFlags});
env(offer(gw, XRP(11'500'000'000), tst(1'000'000'000'000'000)));
@@ -5901,7 +5900,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_},
.pay = 30'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
auto const usd = gw_["USD"];
env.trust(usd(30'000), alice_);
@@ -6024,7 +6023,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_, ed},
.pay = 30'000'000000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env(offer(carol_, btc(5'000000), USD(5)));
AMM const ammAlice(env, alice_, USD(1'005), btc(1'000'000000));
@@ -6053,7 +6052,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_, ed},
.pay = 30'000'000000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env(offer(carol_, btc(5'000000), USD(5)));
// Set 0.25% fee
@@ -6080,7 +6079,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_, ed},
.pay = 30'000'000000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env(offer(carol_, btc(10'000000), USD(10)));
// Set 1% fee
@@ -6108,7 +6107,7 @@ private:
.issuer = gw_,
.holders = {alice_, bob_, carol_, ed},
.pay = 30'000'000000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env(offer(carol_, btc(9'000000), USD(9)));
// Set 1% fee
@@ -6154,7 +6153,7 @@ private:
.issuer = gw,
.holders = holders,
.pay = 40'000'000000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
auto const usd = gw["USD"];
for (auto const& holder : holders)
@@ -6245,7 +6244,7 @@ private:
.issuer = gw,
.holders = holders,
.pay = 40'000'000000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
auto const usd = gw["USD"];
for (auto const& holder : holders)
@@ -6394,21 +6393,21 @@ private:
.holders = {alice_, bob_, carol_, ed},
.transferFee = gwTransferFee,
.pay = 2'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester eth(
{.env = env,
.issuer = gw1,
.holders = {alice_, bob_, carol_, ed},
.transferFee = gw1TransferFee,
.pay = 2'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
MPTTester can(
{.env = env,
.issuer = gw1,
.holders = {alice_, bob_, carol_, ed},
.transferFee = gw1TransferFee,
.pay = 2'000'000'000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env.close();
return MPTList{
@@ -6418,10 +6417,10 @@ private:
};
};
std::uint32_t constexpr kLOW_RATE = 10'000;
std::uint32_t constexpr kHIGH_RATE = 50'000;
static constexpr std::uint32_t kLowRate = 10'000;
static constexpr std::uint32_t kHighRate = 50'000;
for (auto const& rates :
{std::make_pair(kLOW_RATE, kHIGH_RATE), std::make_pair(kHIGH_RATE, kLOW_RATE)})
{std::make_pair(kLowRate, kHighRate), std::make_pair(kHighRate, kLowRate)})
{
// Offer Selection
@@ -6555,7 +6554,7 @@ private:
if (i == 2)
{
if (rates.first == kLOW_RATE)
if (rates.first == kLowRate)
{
BEAST_EXPECT(expectOffers(
env,
@@ -6620,7 +6619,7 @@ private:
// limitQuality
if (i == 2)
{
if (rates.first == kLOW_RATE)
if (rates.first == kLowRate)
{
// Ed offer is partially crossed.
// The updated rounding makes limitQuality
@@ -6699,7 +6698,7 @@ private:
{
// NOLINTBEGIN(bugprone-unchecked-optional-access) i==2 implies amm is
// emplaced (i>0)
if (rates.first == kLOW_RATE)
if (rates.first == kLowRate)
{
// Liquidity is consumed from AMM strand only
BEAST_EXPECT(amm->expectBalances(
@@ -6789,7 +6788,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 2'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
WithdrawArg const args{
.asset1Out = XRP(100),
.asset2Out = btc(100),
@@ -6812,7 +6811,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 2'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
btc(100).value().setJson(jv[jss::EPrice]);
env(jv, Ter(telENV_RPC_FAILED));
},
@@ -6837,7 +6836,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 40'000'000000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env(offer(alice_, btc(1), USD(0.01)));
env.close();
@@ -6871,7 +6870,7 @@ private:
.issuer = gw_,
.holders = {alice_, carol_},
.pay = 40'000'000000,
.flags = kMPT_DEX_FLAGS});
.flags = kMptDexFlags});
env(offer(alice_, btc(1), XRP(0.01)));
env.close();
@@ -6921,7 +6920,7 @@ private:
.issuer = gw,
.holders = {alice, bob},
.pay = 40'000'000000,
.flags = tfMPTCanClawback | tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanClawback | tfMPTCanLock | kMptDexFlags});
AMM amm(env, alice, btc(2), usd(1));
amm.deposit(alice, IOUAmount{1'876123487565916, -15});
@@ -6960,7 +6959,7 @@ private:
.issuer = gw_,
.holders = {alice_},
.pay = 30'000,
.flags = tfMPTCanLock | kMPT_DEX_FLAGS});
.flags = tfMPTCanLock | kMptDexFlags});
AMM amm(env, alice_, btc(100), XRP(100));
env.close();
@@ -7019,7 +7018,7 @@ private:
MPTTester const usd({.env = env, .issuer = gw_, .holders = {alice_}, .pay = 20'000});
MPTTester const btc({.env = env, .issuer = gw_, .holders = {alice_}, .pay = 20'000});
AMM amm(env, gw_, usd(10'000), btc(10'000));
for (auto i = 0; i < kMAX_DELETABLE_AMM_TRUST_LINES + 10; ++i)
for (auto i = 0; i < kMaxDeletableAmmTrustLines + 10; ++i)
{
Account const a{std::to_string(i)};
env.fund(XRP(1'000), a);
@@ -7073,7 +7072,7 @@ private:
MPTTester const usd({.env = env, .issuer = gw_, .holders = {alice_}, .pay = 20'000});
MPTTester const btc({.env = env, .issuer = gw_, .holders = {alice_}, .pay = 20'000});
AMM amm(env, gw_, usd(10'000), btc(10'000));
for (auto i = 0; i < (kMAX_DELETABLE_AMM_TRUST_LINES * 2) + 10; ++i)
for (auto i = 0; i < (kMaxDeletableAmmTrustLines * 2) + 10; ++i)
{
Account const a{std::to_string(i)};
env.fund(XRP(1'000), a);
@@ -7119,7 +7118,7 @@ private:
}
// This test validates both invariant changes work together for
// the specific case of MPT/MPT pools with > maxDeletableAMMTrustLines.
// the specific case of MPT/MPT pools with > kMaxDeletableAmmTrustLines.
{
Env env(
*this,
@@ -7137,7 +7136,7 @@ private:
// MPT/MPT pool with MANY trustlines
AMM amm(env, gw_, usd(10'000), btc(10'000));
for (auto i = 0; i < (kMAX_DELETABLE_AMM_TRUST_LINES * 2) + 10; ++i)
for (auto i = 0; i < (kMaxDeletableAmmTrustLines * 2) + 10; ++i)
{
Account const a{std::to_string(i)};
env.fund(XRP(1'000), a);