Miscellaneous refactors and updates (#5590)

- Added a new Invariant: `ValidPseudoAccounts` which checks that all pseudo-accounts behave consistently through creation and updates, and that no "real" accounts look like pseudo-accounts (which means they don't have a 0 sequence). 
- `to_short_string(base_uint)`. Like `to_string`, but only returns the first 8 characters. (Similar to how a git commit ID can be abbreviated.) Used as a wrapped sink to prefix most transaction-related messages. More can be added later.
- `XRPL_ASSERT_PARTS`. Convenience wrapper for `XRPL_ASSERT`, which takes the `function` and `description` as separate parameters.
- `SField::sMD_PseudoAccount`. Metadata option for `SField` definitions to indicate that the field, if set in an `AccountRoot` indicates that account is a pseudo-account. Removes the need for hard-coded field lists all over the place. Added the flag to `AMMID` and `VaultID`.
- Added functionality to `SField` ctor to detect both code and name collisions using asserts. And require all SFields to have a name
- Convenience type aliases `STLedgerEntry::const_pointer` and `STLedgerEntry::const_ref`. (`SLE` is an alias to `STLedgerEntry`.)
- Generalized `feeunit.h` (`TaggedFee`) into `unit.h` (`ValueUnit`) and added new "BIPS"-related tags for future use. Also refactored the type restrictions to use Concepts.
- Restructured `transactions.macro` to do two big things
	1. Include the `#include` directives for transactor header files directly in the macro file. Removes the need to update `applySteps.cpp` and the resulting conflicts.
	2. Added a `privileges` parameter to the `TRANSACTION` macro, which specifies some of the operations a transaction is allowed to do. These `privileges` are enforced by invariant checks. Again, removed the need to update scattered lists of transaction types in various checks.
- Unit tests:
	1.  Moved more helper functions into `TestHelpers.h` and `.cpp`. 
	2. Cleaned up the namespaces to prevent / mitigate random collisions and ambiguous symbols, particularly in unity builds.
	3. Generalized `Env::balance` to add support for `MPTIssue` and `Asset`.
	4. Added a set of helper classes to simplify `Env` transaction parameter classes: `JTxField`, `JTxFieldWrapper`, and a bunch of classes derived or aliased from it. For an example of how awesome it is, check the changes `src/test/jtx/escrow.h` for how much simpler the definitions are for `finish_time`, `cancel_time`, `condition`, and `fulfillment`. 
	5. Generalized several of the amount-related helper classes to understand `Asset`s.
     6. `env.balance` for an MPT issuer will return a negative number (or 0) for consistency with IOUs.
This commit is contained in:
Ed Hennis
2025-09-18 13:55:49 -04:00
committed by GitHub
parent bd834c87e0
commit 3cbdf818a7
65 changed files with 2148 additions and 1210 deletions

View File

@@ -181,9 +181,9 @@ private:
BEAST_EXPECT(expectLedgerEntryRoot(
env, alice, XRP(20'000) - XRP(50) - txfee(env, 1)));
BEAST_EXPECT(expectLine(env, bob, USD1(100)));
BEAST_EXPECT(expectLine(env, bob, USD2(0)));
BEAST_EXPECT(expectLine(env, carol, USD2(50)));
BEAST_EXPECT(expectHolding(env, bob, USD1(100)));
BEAST_EXPECT(expectHolding(env, bob, USD2(0)));
BEAST_EXPECT(expectHolding(env, carol, USD2(50)));
}
}
@@ -220,7 +220,7 @@ private:
BEAST_EXPECT(expectLedgerEntryRoot(
env, carol, XRP(30'000) - (txfee(env, 1))));
BEAST_EXPECT(expectOffers(env, carol, 0));
BEAST_EXPECT(expectLine(env, carol, USD(30'000)));
BEAST_EXPECT(expectHolding(env, carol, USD(30'000)));
// Order that can be filled
env(offer(carol, XRP(100), USD(100)),
@@ -230,7 +230,7 @@ private:
XRP(10'000), USD(10'100), ammAlice.tokens()));
BEAST_EXPECT(expectLedgerEntryRoot(
env, carol, XRP(30'000) + XRP(100) - txfee(env, 2)));
BEAST_EXPECT(expectLine(env, carol, USD(29'900)));
BEAST_EXPECT(expectHolding(env, carol, USD(29'900)));
BEAST_EXPECT(expectOffers(env, carol, 0));
},
{{XRP(10'100), USD(10'000)}},
@@ -254,7 +254,7 @@ private:
BEAST_EXPECT(expectLedgerEntryRoot(
env, carol, XRP(30'000) + XRP(100) - txfee(env, 1)));
// AMM
BEAST_EXPECT(expectLine(env, carol, USD(29'900)));
BEAST_EXPECT(expectHolding(env, carol, USD(29'900)));
BEAST_EXPECT(expectOffers(env, carol, 0));
},
{{XRP(10'100), USD(10'000)}},
@@ -327,7 +327,7 @@ private:
USD(49),
IOUAmount{273'861'278752583, -8}));
BEAST_EXPECT(expectLine(env, bob, STAmount{USD, 101}));
BEAST_EXPECT(expectHolding(env, bob, STAmount{USD, 101}));
BEAST_EXPECT(expectLedgerEntryRoot(
env, bob, XRP(300'000) - xrpTransferred - txfee(env, 1)));
BEAST_EXPECT(expectOffers(env, bob, 0));
@@ -390,7 +390,7 @@ private:
BEAST_EXPECT(
ammBob.expectBalances(USD(300), XRP(1'000), ammBob.tokens()));
BEAST_EXPECT(expectLine(env, alice, USD(0)));
BEAST_EXPECT(expectHolding(env, alice, USD(0)));
auto jrr = ledgerEntryRoot(env, alice);
BEAST_EXPECT(
@@ -423,7 +423,7 @@ private:
BEAST_EXPECT(ammAlice.expectBalances(
XRPAmount{9'900'990'100}, USD(10'100), ammAlice.tokens()));
// initial 30,000 - 10,000AMM - 100pay
BEAST_EXPECT(expectLine(env, alice, USD(19'900)));
BEAST_EXPECT(expectHolding(env, alice, USD(19'900)));
// initial 30,000 - 10,0000AMM + 99.009900pay - fee*3
BEAST_EXPECT(expectLedgerEntryRoot(
env,
@@ -453,7 +453,7 @@ private:
env(pay(alice, bob, USD(100)), sendmax(XRP(100)));
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'100), USD(10'000), ammAlice.tokens()));
BEAST_EXPECT(expectLine(env, bob, USD(100)));
BEAST_EXPECT(expectHolding(env, bob, USD(100)));
},
{{XRP(10'000), USD(10'100)}},
0,
@@ -533,7 +533,7 @@ private:
STAmount{USD1, UINT64_C(5'030'181086519115), -12},
ammCarol.tokens()));
BEAST_EXPECT(expectOffers(env, dan, 1, {{Amounts{XRP(200), EUR(20)}}}));
BEAST_EXPECT(expectLine(env, bob, STAmount{EUR1, 30}));
BEAST_EXPECT(expectHolding(env, bob, STAmount{EUR1, 30}));
}
void
@@ -642,7 +642,7 @@ private:
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'000), USD(9'999), ammAlice.tokens()));
BEAST_EXPECT(expectOffers(env, carol, 0));
BEAST_EXPECT(expectLine(env, carol, USD(30'101)));
BEAST_EXPECT(expectHolding(env, carol, USD(30'101)));
BEAST_EXPECT(expectLedgerEntryRoot(
env, carol, XRP(30'000) - XRP(100) - txfee(env, 1)));
},
@@ -682,7 +682,7 @@ private:
env(offer(alice, USD(100), XRP(200)), json(jss::Flags, tfSell));
BEAST_EXPECT(
ammBob.expectBalances(XRP(1'100), USD(2'000), ammBob.tokens()));
BEAST_EXPECT(expectLine(env, alice, USD(200)));
BEAST_EXPECT(expectHolding(env, alice, USD(200)));
BEAST_EXPECT(expectLedgerEntryRoot(env, alice, XRP(250)));
BEAST_EXPECT(expectOffers(env, alice, 0));
}
@@ -733,7 +733,7 @@ private:
STAmount(XTS, UINT64_C(101'010101010101), -12),
XXX(99),
ammAlice.tokens()));
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, bob, STAmount{XTS, UINT64_C(98'989898989899), -12}));
}
else
@@ -742,10 +742,10 @@ private:
STAmount(XTS, UINT64_C(101'0101010101011), -13),
XXX(99),
ammAlice.tokens()));
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, bob, STAmount{XTS, UINT64_C(98'9898989898989), -13}));
}
BEAST_EXPECT(expectLine(env, bob, XXX(101)));
BEAST_EXPECT(expectHolding(env, bob, XXX(101)));
}
void
@@ -783,8 +783,8 @@ private:
XRP(10'100), USD(10'000), ammAlice.tokens()));
BEAST_EXPECT(ammBob.expectBalances(
XRP(10'000), EUR(10'100), ammBob.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(15'100)));
BEAST_EXPECT(expectLine(env, carol, EUR(14'900)));
BEAST_EXPECT(expectHolding(env, carol, USD(15'100)));
BEAST_EXPECT(expectHolding(env, carol, EUR(14'900)));
BEAST_EXPECT(expectOffers(env, carol, 0));
}
@@ -816,8 +816,8 @@ private:
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'100), USD(10'000), ammAlice.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(15'100)));
BEAST_EXPECT(expectLine(env, carol, EUR(14'900)));
BEAST_EXPECT(expectHolding(env, carol, USD(15'100)));
BEAST_EXPECT(expectHolding(env, carol, EUR(14'900)));
BEAST_EXPECT(expectOffers(env, carol, 0));
BEAST_EXPECT(expectOffers(env, bob, 0));
}
@@ -850,8 +850,8 @@ private:
BEAST_EXPECT(ammBob.expectBalances(
XRP(10'000), EUR(10'100), ammBob.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(15'100)));
BEAST_EXPECT(expectLine(env, carol, EUR(14'900)));
BEAST_EXPECT(expectHolding(env, carol, USD(15'100)));
BEAST_EXPECT(expectHolding(env, carol, EUR(14'900)));
BEAST_EXPECT(expectOffers(env, carol, 0));
BEAST_EXPECT(expectOffers(env, alice, 0));
}
@@ -894,7 +894,7 @@ private:
XRP(20'220),
STAmount{USD, UINT64_C(197'8239366963403), -13},
ammBob.tokens()));
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, alice, STAmount{USD, UINT64_C(1'002'17606330366), -11}));
BEAST_EXPECT(expectOffers(env, alice, 0));
}
@@ -912,7 +912,7 @@ private:
XRP(21'500),
STAmount{USD, UINT64_C(186'046511627907), -12},
ammBob.tokens()));
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, alice, STAmount{USD, UINT64_C(1'013'953488372093), -12}));
BEAST_EXPECT(expectOffers(env, alice, 0));
}
@@ -953,7 +953,7 @@ private:
// AMM doesn't pay the transfer fee
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'100), USD(10'000), ammAlice.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(30'100)));
BEAST_EXPECT(expectHolding(env, carol, USD(30'100)));
BEAST_EXPECT(expectOffers(env, carol, 0));
},
{{XRP(10'000), USD(10'100)}},
@@ -974,7 +974,7 @@ private:
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'000), USD(10'100), ammAlice.tokens()));
// Carol pays 25% transfer fee
BEAST_EXPECT(expectLine(env, carol, USD(29'875)));
BEAST_EXPECT(expectHolding(env, carol, USD(29'875)));
BEAST_EXPECT(expectOffers(env, carol, 0));
},
{{XRP(10'100), USD(10'000)}},
@@ -1011,9 +1011,9 @@ private:
// AMM doesn't pay the transfer fee
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'100), USD(10'000), ammAlice.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(15'100)));
BEAST_EXPECT(expectHolding(env, carol, USD(15'100)));
// Carol pays 25% transfer fee.
BEAST_EXPECT(expectLine(env, carol, EUR(14'875)));
BEAST_EXPECT(expectHolding(env, carol, EUR(14'875)));
BEAST_EXPECT(expectOffers(env, carol, 0));
BEAST_EXPECT(expectOffers(env, bob, 0));
}
@@ -1051,9 +1051,9 @@ private:
// AMM doesn't pay the transfer fee
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'050), USD(10'000), ammAlice.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(15'050)));
BEAST_EXPECT(expectHolding(env, carol, USD(15'050)));
// Carol pays 25% transfer fee.
BEAST_EXPECT(expectLine(env, carol, EUR(14'937.5)));
BEAST_EXPECT(expectHolding(env, carol, EUR(14'937.5)));
BEAST_EXPECT(expectOffers(env, carol, 0));
BEAST_EXPECT(
expectOffers(env, bob, 1, {{Amounts{EUR(50), XRP(50)}}}));
@@ -1077,7 +1077,7 @@ private:
env(pay(gw, carol, EUR(1'000)), sendmax(EUR(10'000)));
env.close();
// 1000 / 0.8
BEAST_EXPECT(expectLine(env, carol, EUR(1'250)));
BEAST_EXPECT(expectHolding(env, carol, EUR(1'250)));
// The scenario:
// o USD/XRP AMM is created.
// o EUR/XRP Offer is created.
@@ -1096,9 +1096,9 @@ private:
// AMM doesn't pay the transfer fee
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'100), USD(10'000), ammAlice.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(100)));
BEAST_EXPECT(expectHolding(env, carol, USD(100)));
// Carol pays 25% transfer fee: 1250 - 100(offer) - 25(transfer fee)
BEAST_EXPECT(expectLine(env, carol, EUR(1'125)));
BEAST_EXPECT(expectHolding(env, carol, EUR(1'125)));
BEAST_EXPECT(expectOffers(env, carol, 0));
BEAST_EXPECT(expectOffers(env, bob, 0));
}
@@ -1120,7 +1120,7 @@ private:
env(pay(gw, alice, USD(11'000)));
env(pay(gw, carol, EUR(1'000)), sendmax(EUR(10'000)));
env.close();
BEAST_EXPECT(expectLine(env, carol, EUR(1'000)));
BEAST_EXPECT(expectHolding(env, carol, EUR(1'000)));
// The scenario:
// o USD/XRP AMM is created.
// o EUR/XRP Offer is created.
@@ -1139,9 +1139,9 @@ private:
// AMM pay doesn't transfer fee
BEAST_EXPECT(ammAlice.expectBalances(
XRP(10'100), USD(10'000), ammAlice.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(100)));
BEAST_EXPECT(expectHolding(env, carol, USD(100)));
// Carol pays 25% transfer fee: 1000 - 100(offer) - 25(transfer fee)
BEAST_EXPECT(expectLine(env, carol, EUR(875)));
BEAST_EXPECT(expectHolding(env, carol, EUR(875)));
BEAST_EXPECT(expectOffers(env, carol, 0));
BEAST_EXPECT(expectOffers(env, bob, 0));
}
@@ -1170,7 +1170,7 @@ private:
BEAST_EXPECT(ammBob.expectBalances(
XRP(10'100), USD_bob(10'000), ammBob.tokens()));
BEAST_EXPECT(expectOffers(env, alice, 0));
BEAST_EXPECT(expectLine(env, alice, USD_bob(100)));
BEAST_EXPECT(expectHolding(env, alice, USD_bob(100)));
}
void
@@ -1206,19 +1206,19 @@ private:
env.close();
env(pay(dan, bob, D_BUX(100)));
env.close();
BEAST_EXPECT(expectLine(env, bob, D_BUX(100)));
BEAST_EXPECT(expectHolding(env, bob, D_BUX(100)));
env(pay(ann, cam, D_BUX(60)), path(bob, dan), sendmax(A_BUX(200)));
env.close();
BEAST_EXPECT(expectLine(env, ann, A_BUX(none)));
BEAST_EXPECT(expectLine(env, ann, D_BUX(none)));
BEAST_EXPECT(expectLine(env, bob, A_BUX(72)));
BEAST_EXPECT(expectLine(env, bob, D_BUX(40)));
BEAST_EXPECT(expectLine(env, cam, A_BUX(none)));
BEAST_EXPECT(expectLine(env, cam, D_BUX(60)));
BEAST_EXPECT(expectLine(env, dan, A_BUX(none)));
BEAST_EXPECT(expectLine(env, dan, D_BUX(none)));
BEAST_EXPECT(expectHolding(env, ann, A_BUX(none)));
BEAST_EXPECT(expectHolding(env, ann, D_BUX(none)));
BEAST_EXPECT(expectHolding(env, bob, A_BUX(72)));
BEAST_EXPECT(expectHolding(env, bob, D_BUX(40)));
BEAST_EXPECT(expectHolding(env, cam, A_BUX(none)));
BEAST_EXPECT(expectHolding(env, cam, D_BUX(60)));
BEAST_EXPECT(expectHolding(env, dan, A_BUX(none)));
BEAST_EXPECT(expectHolding(env, dan, D_BUX(none)));
AMM ammBob(env, bob, A_BUX(30), D_BUX(30));
@@ -1234,12 +1234,12 @@ private:
BEAST_EXPECT(
ammBob.expectBalances(A_BUX(30), D_BUX(30), ammBob.tokens()));
BEAST_EXPECT(expectLine(env, ann, A_BUX(none)));
BEAST_EXPECT(expectLine(env, ann, D_BUX(0)));
BEAST_EXPECT(expectLine(env, cam, A_BUX(none)));
BEAST_EXPECT(expectLine(env, cam, D_BUX(60)));
BEAST_EXPECT(expectLine(env, dan, A_BUX(0)));
BEAST_EXPECT(expectLine(env, dan, D_BUX(none)));
BEAST_EXPECT(expectHolding(env, ann, A_BUX(none)));
BEAST_EXPECT(expectHolding(env, ann, D_BUX(0)));
BEAST_EXPECT(expectHolding(env, cam, A_BUX(none)));
BEAST_EXPECT(expectHolding(env, cam, D_BUX(60)));
BEAST_EXPECT(expectHolding(env, dan, A_BUX(0)));
BEAST_EXPECT(expectHolding(env, dan, D_BUX(none)));
}
}
@@ -1363,7 +1363,7 @@ private:
env(pay(gw, bob, USD(50)));
env.close();
BEAST_EXPECT(expectLine(env, bob, USD(50)));
BEAST_EXPECT(expectHolding(env, bob, USD(50)));
// Bob's offer should cross Alice's AMM
env(offer(bob, XRP(50), USD(50)));
@@ -1372,7 +1372,7 @@ private:
BEAST_EXPECT(
ammAlice.expectBalances(USD(1'050), XRP(1'000), ammAlice.tokens()));
BEAST_EXPECT(expectOffers(env, bob, 0));
BEAST_EXPECT(expectLine(env, bob, USD(0)));
BEAST_EXPECT(expectHolding(env, bob, USD(0)));
}
void
@@ -1403,7 +1403,7 @@ private:
env(pay(gw, bob, USD(50)));
env.close();
BEAST_EXPECT(expectLine(env, bob, USD(50)));
BEAST_EXPECT(expectHolding(env, bob, USD(50)));
// Alice should not be able to create AMM without authorization.
{
@@ -1440,7 +1440,7 @@ private:
BEAST_EXPECT(
ammAlice.expectBalances(USD(1'050), XRP(1'000), ammAlice.tokens()));
BEAST_EXPECT(expectOffers(env, bob, 0));
BEAST_EXPECT(expectLine(env, bob, USD(0)));
BEAST_EXPECT(expectHolding(env, bob, USD(0)));
}
void
@@ -1535,7 +1535,7 @@ private:
// AMM offer is 51.282052XRP/11AUD, 11AUD/1.1 = 10AUD to bob
BEAST_EXPECT(
ammCarol.expectBalances(XRP(51), AUD(40), ammCarol.tokens()));
BEAST_EXPECT(expectLine(env, bob, AUD(10)));
BEAST_EXPECT(expectHolding(env, bob, AUD(10)));
auto const result =
find_paths(env, alice, bob, Account(bob)["USD"](25));
@@ -1950,10 +1950,10 @@ private:
env(pay(alice, carol, USD(50)), path(~USD), sendmax(BTC(50)));
BEAST_EXPECT(expectLine(env, alice, BTC(50)));
BEAST_EXPECT(expectLine(env, bob, BTC(0)));
BEAST_EXPECT(expectLine(env, bob, USD(0)));
BEAST_EXPECT(expectLine(env, carol, USD(200)));
BEAST_EXPECT(expectHolding(env, alice, BTC(50)));
BEAST_EXPECT(expectHolding(env, bob, BTC(0)));
BEAST_EXPECT(expectHolding(env, bob, USD(0)));
BEAST_EXPECT(expectHolding(env, carol, USD(200)));
BEAST_EXPECT(
ammBob.expectBalances(BTC(150), USD(100), ammBob.tokens()));
}
@@ -1974,10 +1974,10 @@ private:
env(pay(alice, carol, USD(50)), path(~XRP, ~USD), sendmax(BTC(50)));
BEAST_EXPECT(expectLine(env, alice, BTC(50)));
BEAST_EXPECT(expectLine(env, bob, BTC(0)));
BEAST_EXPECT(expectLine(env, bob, USD(0)));
BEAST_EXPECT(expectLine(env, carol, USD(200)));
BEAST_EXPECT(expectHolding(env, alice, BTC(50)));
BEAST_EXPECT(expectHolding(env, bob, BTC(0)));
BEAST_EXPECT(expectHolding(env, bob, USD(0)));
BEAST_EXPECT(expectHolding(env, carol, USD(200)));
BEAST_EXPECT(ammBobBTC_XRP.expectBalances(
BTC(150), XRP(100), ammBobBTC_XRP.tokens()));
BEAST_EXPECT(ammBobXRP_USD.expectBalances(
@@ -2003,8 +2003,8 @@ private:
env, alice, xrpMinusFee(env, 10'000 - 50)));
BEAST_EXPECT(expectLedgerEntryRoot(
env, bob, XRP(10'000) - XRP(100) - ammCrtFee(env)));
BEAST_EXPECT(expectLine(env, bob, USD(0)));
BEAST_EXPECT(expectLine(env, carol, USD(200)));
BEAST_EXPECT(expectHolding(env, bob, USD(0)));
BEAST_EXPECT(expectHolding(env, carol, USD(200)));
BEAST_EXPECT(
ammBob.expectBalances(XRP(150), USD(100), ammBob.tokens()));
}
@@ -2024,10 +2024,10 @@ private:
env(pay(alice, carol, XRP(50)), path(~XRP), sendmax(USD(50)));
BEAST_EXPECT(expectLine(env, alice, USD(50)));
BEAST_EXPECT(expectHolding(env, alice, USD(50)));
BEAST_EXPECT(expectLedgerEntryRoot(
env, bob, XRP(10'000) - XRP(150) - ammCrtFee(env)));
BEAST_EXPECT(expectLine(env, bob, USD(0)));
BEAST_EXPECT(expectHolding(env, bob, USD(0)));
BEAST_EXPECT(expectLedgerEntryRoot(env, carol, XRP(10'000 + 50)));
BEAST_EXPECT(
ammBob.expectBalances(USD(150), XRP(100), ammBob.tokens()));
@@ -2209,7 +2209,7 @@ private:
sendmax(USD(0.4)),
txflags(tfNoRippleDirect | tfPartialPayment));
BEAST_EXPECT(expectLine(env, carol, EUR(1)));
BEAST_EXPECT(expectHolding(env, carol, EUR(1)));
BEAST_EXPECT(ammBob.expectBalances(
USD(8.4), XRPAmount{20}, ammBob.tokens()));
}
@@ -2244,7 +2244,7 @@ private:
// alice buys 107.1428USD with 120GBP and pays 25% tr fee on 120GBP
// 1,000 - 120*1.25 = 850GBP
BEAST_EXPECT(expectLine(env, alice, GBP(850)));
BEAST_EXPECT(expectHolding(env, alice, GBP(850)));
if (!features[fixAMMv1_1])
{
// 120GBP is swapped in for 107.1428USD
@@ -2262,7 +2262,7 @@ private:
}
// 25% of 85.7142USD is paid in tr fee
// 85.7142*1.25 = 107.1428USD
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, carol, STAmount(USD, UINT64_C(1'085'714285714286), -12)));
}
@@ -2294,10 +2294,10 @@ private:
// alice buys 120EUR with 120GBP via the offer
// and pays 25% tr fee on 120GBP
// 1,000 - 120*1.25 = 850GBP
BEAST_EXPECT(expectLine(env, alice, GBP(850)));
BEAST_EXPECT(expectHolding(env, alice, GBP(850)));
// consumed offer is 120GBP/120EUR
// ed doesn't pay tr fee
BEAST_EXPECT(expectLine(env, ed, EUR(880), GBP(1'120)));
BEAST_EXPECT(expectHolding(env, ed, EUR(880), GBP(1'120)));
BEAST_EXPECT(
expectOffers(env, ed, 1, {Amounts{GBP(880), EUR(880)}}));
// 25% on 96EUR is paid in tr fee 96*1.25 = 120EUR
@@ -2307,7 +2307,7 @@ private:
STAmount{USD, UINT64_C(912'4087591240876), -13},
amm.tokens()));
// 25% on 70.0729USD is paid in tr fee 70.0729*1.25 = 87.5912USD
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, carol, STAmount(USD, UINT64_C(1'070'07299270073), -11)));
}
{
@@ -2333,7 +2333,7 @@ private:
txflags(tfNoRippleDirect | tfPartialPayment));
env.close();
BEAST_EXPECT(expectLine(env, alice, GBP(850)));
BEAST_EXPECT(expectHolding(env, alice, GBP(850)));
if (!features[fixAMMv1_1])
{
// alice buys 107.1428EUR with 120GBP and pays 25% tr fee on
@@ -2367,7 +2367,7 @@ private:
amm2.tokens()));
}
// 25% on 63.1578USD is paid in tr fee 63.1578*1.25 = 78.9473USD
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, carol, STAmount(USD, UINT64_C(1'063'157894736842), -12)));
}
{
@@ -2386,7 +2386,7 @@ private:
BEAST_EXPECT(
amm.expectBalances(USD(1'100), EUR(1'000), amm.tokens()));
// alice pays 25% tr fee on 100USD 1100-100*1.25 = 975USD
BEAST_EXPECT(expectLine(env, alice, USD(975), EUR(1'200)));
BEAST_EXPECT(expectHolding(env, alice, USD(975), EUR(1'200)));
BEAST_EXPECT(expectOffers(env, alice, 0));
}
@@ -2416,7 +2416,7 @@ private:
// alice buys 125USD with 142.8571GBP and pays 25% tr fee
// on 142.8571GBP
// 1,000 - 142.8571*1.25 = 821.4285GBP
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, alice, STAmount(GBP, UINT64_C(821'4285714285712), -13)));
// 142.8571GBP is swapped in for 125USD
BEAST_EXPECT(amm.expectBalances(
@@ -2425,7 +2425,7 @@ private:
amm.tokens()));
// 25% on 100USD is paid in tr fee
// 100*1.25 = 125USD
BEAST_EXPECT(expectLine(env, carol, USD(1'100)));
BEAST_EXPECT(expectHolding(env, carol, USD(1'100)));
}
{
// Payment via AMM with limit quality, deliver less
@@ -2456,7 +2456,7 @@ private:
// alice buys 28.125USD with 24GBP and pays 25% tr fee
// on 24GBP
// 1,200 - 24*1.25 = 1,170GBP
BEAST_EXPECT(expectLine(env, alice, GBP(1'170)));
BEAST_EXPECT(expectHolding(env, alice, GBP(1'170)));
// 24GBP is swapped in for 28.125USD
BEAST_EXPECT(amm.expectBalances(
GBP(1'024), USD(1'171.875), amm.tokens()));
@@ -2466,7 +2466,7 @@ private:
// alice buys 28.125USD with 24GBP and pays 25% tr fee
// on 24GBP
// 1,200 - 24*1.25 =~ 1,170GBP
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
alice,
STAmount{GBP, UINT64_C(1'169'999999999999), -12}));
@@ -2478,7 +2478,7 @@ private:
}
// 25% on 22.5USD is paid in tr fee
// 22.5*1.25 = 28.125USD
BEAST_EXPECT(expectLine(env, carol, USD(1'222.5)));
BEAST_EXPECT(expectHolding(env, carol, USD(1'222.5)));
}
{
// Payment via offer and AMM with limit quality, deliver less
@@ -2513,13 +2513,13 @@ private:
// alice buys 70.4210EUR with 70.4210GBP via the offer
// and pays 25% tr fee on 70.4210GBP
// 1,400 - 70.4210*1.25 = 1400 - 88.0262 = 1311.9736GBP
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
alice,
STAmount{GBP, UINT64_C(1'311'973684210527), -12}));
// ed doesn't pay tr fee, the balances reflect consumed offer
// 70.4210GBP/70.4210EUR
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
ed,
STAmount{EUR, UINT64_C(1'329'578947368421), -12},
@@ -2543,13 +2543,13 @@ private:
// alice buys 70.4210EUR with 70.4210GBP via the offer
// and pays 25% tr fee on 70.4210GBP
// 1,400 - 70.4210*1.25 = 1400 - 88.0262 = 1311.9736GBP
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
alice,
STAmount{GBP, UINT64_C(1'311'973684210525), -12}));
// ed doesn't pay tr fee, the balances reflect consumed offer
// 70.4210GBP/70.4210EUR
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
ed,
STAmount{EUR, UINT64_C(1'329'57894736842), -11},
@@ -2569,7 +2569,7 @@ private:
amm.tokens()));
}
// 25% on 59.7321USD is paid in tr fee 59.7321*1.25 = 74.6651USD
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, carol, STAmount(USD, UINT64_C(1'459'732142857143), -12)));
}
{
@@ -2605,7 +2605,7 @@ private:
// alice buys 53.3322EUR with 56.3368GBP via the amm
// and pays 25% tr fee on 56.3368GBP
// 1,400 - 56.3368*1.25 = 1400 - 70.4210 = 1329.5789GBP
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
alice,
STAmount{GBP, UINT64_C(1'329'578947368421), -12}));
@@ -2622,7 +2622,7 @@ private:
// alice buys 53.3322EUR with 56.3368GBP via the amm
// and pays 25% tr fee on 56.3368GBP
// 1,400 - 56.3368*1.25 = 1400 - 70.4210 = 1329.5789GBP
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
alice,
STAmount{GBP, UINT64_C(1'329'57894736842), -11}));
@@ -2636,7 +2636,7 @@ private:
}
// 25% on 42.6658EUR is paid in tr fee 42.6658*1.25 = 53.3322EUR
// 42.6658EUR/59.7321USD
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
ed,
STAmount{USD, UINT64_C(1'340'267857142857), -12},
@@ -2649,7 +2649,7 @@ private:
STAmount{EUR, UINT64_C(957'3341836734693), -13},
STAmount{USD, UINT64_C(1'340'267857142857), -12}}}));
// 25% on 47.7857USD is paid in tr fee 47.7857*1.25 = 59.7321USD
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, carol, STAmount(USD, UINT64_C(1'447'785714285714), -12)));
}
{
@@ -2683,7 +2683,7 @@ private:
// alice buys 53.3322EUR with 107.5308GBP
// 25% on 86.0246GBP is paid in tr fee
// 1,400 - 86.0246*1.25 = 1400 - 107.5308 = 1229.4691GBP
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
alice,
STAmount{GBP, UINT64_C(1'292'469135802469), -12}));
@@ -2704,7 +2704,7 @@ private:
// alice buys 53.3322EUR with 107.5308GBP
// 25% on 86.0246GBP is paid in tr fee
// 1,400 - 86.0246*1.25 = 1400 - 107.5308 = 1229.4691GBP
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env,
alice,
STAmount{GBP, UINT64_C(1'292'469135802466), -12}));
@@ -2721,7 +2721,7 @@ private:
amm2.tokens()));
}
// 25% on 66.7432USD is paid in tr fee 66.7432*1.25 = 83.4291USD
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, carol, STAmount(USD, UINT64_C(1'466'743295019157), -12)));
}
{
@@ -2778,7 +2778,7 @@ private:
amm2.tokens()));
}
// 25% on 81.1111USD is paid in tr fee 81.1111*1.25 = 101.3888USD
BEAST_EXPECT(expectLine(
BEAST_EXPECT(expectHolding(
env, carol, STAmount{USD, UINT64_C(1'481'111111111111), -12}));
}
}
@@ -2808,7 +2808,7 @@ private:
BEAST_EXPECT(
ammBob.expectBalances(XRP(1'050), USD(1'000), ammBob.tokens()));
BEAST_EXPECT(expectLine(env, carol, USD(2'050)));
BEAST_EXPECT(expectHolding(env, carol, USD(2'050)));
BEAST_EXPECT(expectOffers(env, bob, 1, {{{XRP(100), USD(50)}}}));
}
}