mirror of
https://github.com/XRPLF/rippled.git
synced 2026-04-29 15:37:57 +00:00
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:
@@ -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)}}}));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user