Skip to content

Commit

Permalink
test: verify the rounding behavior of equal-asset AMM deposits (XRPLF…
Browse files Browse the repository at this point in the history
…#4982)

* Specifically, test using tfLPToken flag
  • Loading branch information
ckeshava authored and sophiax851 committed Jun 12, 2024
1 parent 56c16be commit d12e308
Showing 1 changed file with 56 additions and 0 deletions.
56 changes: 56 additions & 0 deletions src/test/app/AMM_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1244,6 +1244,62 @@ struct AMM_test : public jtx::AMMTest
expectLedgerEntryRoot(env, carol, XRPAmount{28'999'999'990}));
});

// equal asset deposit: unit test to exercise the rounding-down of
// LPTokens in the AMMHelpers.cpp: adjustLPTokens calculations
// The LPTokens need to have 16 significant digits and a fractional part
for (const Number deltaLPTokens :
{Number{UINT64_C(100000'0000000009), -10},
Number{UINT64_C(100000'0000000001), -10}})
{
testAMM([&](AMM& ammAlice, Env& env) {
// initial LPToken balance
IOUAmount const initLPToken = ammAlice.getLPTokensBalance();
const IOUAmount newLPTokens{
deltaLPTokens.mantissa(), deltaLPTokens.exponent()};

// carol performs a two-asset deposit
ammAlice.deposit(
DepositArg{.account = carol, .tokens = newLPTokens});

IOUAmount const finalLPToken = ammAlice.getLPTokensBalance();

// Change in behavior due to rounding down of LPTokens:
// there is a decrease in the observed return of LPTokens --
// Inputs Number{UINT64_C(100000'0000000001), -10} and
// Number{UINT64_C(100000'0000000009), -10} are both rounded
// down to 1e5
BEAST_EXPECT((finalLPToken - initLPToken == IOUAmount{1, 5}));
BEAST_EXPECT(finalLPToken - initLPToken < deltaLPTokens);

// fraction of newLPTokens/(existing LPToken balance). The
// existing LPToken balance is 1e7
const Number fr = deltaLPTokens / 1e7;

// The below equations are based on Equation 1, 2 from XLS-30d
// specification, Section: 2.3.1.2
const Number deltaXRP = fr * 1e10;
const Number deltaUSD = fr * 1e4;

const STAmount depositUSD =
STAmount{USD, deltaUSD.mantissa(), deltaUSD.exponent()};

const STAmount depositXRP =
STAmount{XRP, deltaXRP.mantissa(), deltaXRP.exponent()};

// initial LPTokens (1e7) + newLPTokens
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'000) + depositXRP,
USD(10'000) + depositUSD,
IOUAmount{1, 7} + newLPTokens));

// 30,000 less deposited depositUSD
BEAST_EXPECT(expectLine(env, carol, USD(30'000) - depositUSD));
// 30,000 less deposited depositXRP and 10 drops tx fee
BEAST_EXPECT(expectLedgerEntryRoot(
env, carol, XRP(30'000) - depositXRP - txfee(env, 1)));
});
}

// Equal limit deposit: deposit USD100 and XRP proportionally
// to the pool composition not to exceed 100XRP. If the amount
// exceeds 100XRP then deposit 100XRP and USD proportionally
Expand Down

0 comments on commit d12e308

Please sign in to comment.