2233 using namespace jtx;
2235 auto const gw =
Account(
"gateway");
2236 auto const usd = gw[
"USD"];
2238 Env env{*
this, features};
2244 auto const f = env.
current()->fees().base;
2247 enum class PreTrustType { NoPreTrust, GwPreTrust, AcctPreTrust };
2253 PreTrustType preTrust;
2263 TestData
const tests[]{
2265 {.account=
"ann", .fundXrp=
reserve(env, 0) + 0 * f, .bookAmount=1, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tecUNFUNDED_OFFER, .spentXrp=f, .balanceUsd=usd( 0), .offers=0, .owners=0},
2266 {.account=
"bev", .fundXrp=
reserve(env, 0) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tecUNFUNDED_OFFER, .spentXrp=f, .balanceUsd=usd( 0), .offers=0, .owners=0},
2267 {.account=
"cam", .fundXrp=
reserve(env, 0) + 2 * f, .bookAmount=0, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tecINSUF_RESERVE_OFFER, .spentXrp=f, .balanceUsd=usd( 0), .offers=0, .owners=0},
2268 {.account=
"deb", .fundXrp=
drops(10) +
reserve(env, 0) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
drops(10) + f, .balanceUsd=usd(0.00001), .offers=0, .owners=1},
2269 {.account=
"eve", .fundXrp=
reserve(env, 1) + 0 * f, .bookAmount=0, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=f, .balanceUsd=usd( 0), .offers=1, .owners=1},
2270 {.account=
"flo", .fundXrp=
reserve(env, 1) + 0 * f, .bookAmount=1, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 1) + f, .balanceUsd=usd( 1), .offers=0, .owners=1},
2271 {.account=
"gay", .fundXrp=
reserve(env, 1) + 1 * f, .bookAmount=1000, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 50) + f, .balanceUsd=usd( 50), .offers=0, .owners=1},
2272 {.account=
"hye", .fundXrp=
XRP(1000) + 1 * f, .bookAmount=1000, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 800) + f, .balanceUsd=usd( 800), .offers=0, .owners=1},
2273 {.account=
"ivy", .fundXrp=
XRP( 1) +
reserve(env, 1) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 1) + f, .balanceUsd=usd( 1), .offers=0, .owners=1},
2274 {.account=
"joy", .fundXrp=
XRP( 1) +
reserve(env, 2) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 1) + f, .balanceUsd=usd( 1), .offers=1, .owners=2},
2275 {.account=
"kim", .fundXrp=
XRP( 900) +
reserve(env, 2) + 1 * f, .bookAmount=999, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 999) + f, .balanceUsd=usd( 999), .offers=0, .owners=1},
2276 {.account=
"liz", .fundXrp=
XRP( 998) +
reserve(env, 0) + 1 * f, .bookAmount=999, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 998) + f, .balanceUsd=usd( 998), .offers=0, .owners=1},
2277 {.account=
"meg", .fundXrp=
XRP( 998) +
reserve(env, 1) + 1 * f, .bookAmount=999, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 999) + f, .balanceUsd=usd( 999), .offers=0, .owners=1},
2278 {.account=
"nia", .fundXrp=
XRP( 998) +
reserve(env, 2) + 1 * f, .bookAmount=999, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 999) + f, .balanceUsd=usd( 999), .offers=1, .owners=2},
2279 {.account=
"ova", .fundXrp=
XRP( 999) +
reserve(env, 0) + 1 * f, .bookAmount=1000, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 999) + f, .balanceUsd=usd( 999), .offers=0, .owners=1},
2280 {.account=
"pam", .fundXrp=
XRP( 999) +
reserve(env, 1) + 1 * f, .bookAmount=1000, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP(1000) + f, .balanceUsd=usd( 1000), .offers=0, .owners=1},
2281 {.account=
"rae", .fundXrp=
XRP( 999) +
reserve(env, 2) + 1 * f, .bookAmount=1000, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP(1000) + f, .balanceUsd=usd( 1000), .offers=0, .owners=1},
2282 {.account=
"sue", .fundXrp=
XRP(1000) +
reserve(env, 2) + 1 * f, .bookAmount=0, .preTrust=PreTrustType::NoPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=f, .balanceUsd=usd( 0), .offers=1, .owners=1},
2284 {.account=
"abe", .fundXrp=
reserve(env, 0) + 0 * f, .bookAmount=1, .preTrust=PreTrustType::GwPreTrust, .offerAmount=1000, .tec=
tecUNFUNDED_OFFER, .spentXrp=f, .balanceUsd=usd( 0), .offers=0, .owners=0},
2285 {.account=
"bud", .fundXrp=
reserve(env, 0) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::GwPreTrust, .offerAmount=1000, .tec=
tecUNFUNDED_OFFER, .spentXrp=f, .balanceUsd=usd( 0), .offers=0, .owners=0},
2286 {.account=
"che", .fundXrp=
reserve(env, 0) + 2 * f, .bookAmount=0, .preTrust=PreTrustType::GwPreTrust, .offerAmount=1000, .tec=
tecINSUF_RESERVE_OFFER, .spentXrp=f, .balanceUsd=usd( 0), .offers=0, .owners=0},
2287 {.account=
"dan", .fundXrp=
drops(10) +
reserve(env, 0) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::GwPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
drops(10) + f, .balanceUsd=usd(0.00001), .offers=0, .owners=0},
2288 {.account=
"eli", .fundXrp=
XRP( 20) +
reserve(env, 0) + 1 * f, .bookAmount=1000, .preTrust=PreTrustType::GwPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP(20) + 1 * f, .balanceUsd=usd( 20), .offers=0, .owners=0},
2289 {.account=
"fyn", .fundXrp=
reserve(env, 1) + 0 * f, .bookAmount=0, .preTrust=PreTrustType::GwPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=f, .balanceUsd=usd( 0), .offers=1, .owners=1},
2290 {.account=
"gar", .fundXrp=
reserve(env, 1) + 0 * f, .bookAmount=1, .preTrust=PreTrustType::GwPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 1) + f, .balanceUsd=usd( 1), .offers=1, .owners=1},
2291 {.account=
"hal", .fundXrp=
reserve(env, 1) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::GwPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 1) + f, .balanceUsd=usd( 1), .offers=1, .owners=1},
2293 {.account=
"ned", .fundXrp=
reserve(env, 1) + 0 * f, .bookAmount=1, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tecUNFUNDED_OFFER, .spentXrp=2 * f, .balanceUsd=usd( 0), .offers=0, .owners=1},
2294 {.account=
"ole", .fundXrp=
reserve(env, 1) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tecUNFUNDED_OFFER, .spentXrp=2 * f, .balanceUsd=usd( 0), .offers=0, .owners=1},
2295 {.account=
"pat", .fundXrp=
reserve(env, 1) + 2 * f, .bookAmount=0, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tecUNFUNDED_OFFER, .spentXrp=2 * f, .balanceUsd=usd( 0), .offers=0, .owners=1},
2296 {.account=
"quy", .fundXrp=
reserve(env, 1) + 2 * f, .bookAmount=1, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tecUNFUNDED_OFFER, .spentXrp=2 * f, .balanceUsd=usd( 0), .offers=0, .owners=1},
2297 {.account=
"ron", .fundXrp=
reserve(env, 1) + 3 * f, .bookAmount=0, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tecINSUF_RESERVE_OFFER, .spentXrp=2 * f, .balanceUsd=usd( 0), .offers=0, .owners=1},
2298 {.account=
"syd", .fundXrp=
drops(10) +
reserve(env, 1) + 2 * f, .bookAmount=1, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
drops(10) + 2 * f, .balanceUsd=usd(0.00001), .offers=0, .owners=1},
2299 {.account=
"ted", .fundXrp=
XRP( 20) +
reserve(env, 1) + 2 * f, .bookAmount=1000, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP(20) + 2 * f, .balanceUsd=usd( 20), .offers=0, .owners=1},
2300 {.account=
"uli", .fundXrp=
reserve(env, 2) + 0 * f, .bookAmount=0, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tecINSUF_RESERVE_OFFER, .spentXrp=2 * f, .balanceUsd=usd( 0), .offers=0, .owners=1},
2301 {.account=
"vic", .fundXrp=
reserve(env, 2) + 0 * f, .bookAmount=1, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 1) + 2 * f, .balanceUsd=usd( 1), .offers=0, .owners=1},
2302 {.account=
"wes", .fundXrp=
reserve(env, 2) + 1 * f, .bookAmount=0, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=2 * f, .balanceUsd=usd( 0), .offers=1, .owners=2},
2303 {.account=
"xan", .fundXrp=
reserve(env, 2) + 1 * f, .bookAmount=1, .preTrust=PreTrustType::AcctPreTrust, .offerAmount=1000, .tec=
tesSUCCESS, .spentXrp=
XRP( 1) + 2 * f, .balanceUsd=usd( 1), .offers=1, .owners=2},
2307 for (
auto const& t :
tests)
2309 auto const acct =
Account(t.account);
2310 env.
fund(t.fundXrp, acct);
2317 auto const book = t.bookAmount;
2319 env(
offer(gw,
XRP(book), usd(book)));
2324 if (t.preTrust == PreTrustType::GwPreTrust)
2325 env(
trust(gw, acct[
"USD"](1)));
2331 if (t.preTrust == PreTrustType::AcctPreTrust)
2332 env(
trust(acct, usd(1)));
2337 auto const acctOffer = t.offerAmount;
2338 env(
offer(acct, usd(acctOffer),
XRP(acctOffer)),
Ter(t.tec));
2343 BEAST_EXPECT(env.
balance(acct, usd) == t.balanceUsd);
2344 BEAST_EXPECT(env.
balance(acct,
xrpIssue()) == t.fundXrp - t.spentXrp);
2349 BEAST_EXPECT(acctOffers.size() == t.offers);
2350 if (!acctOffers.empty() && (t.offers != 0))
2352 auto const& acctOffer = *(acctOffers.front());
2354 auto const leftover = t.offerAmount - t.bookAmount;
2355 BEAST_EXPECT(acctOffer[sfTakerGets] ==
XRP(leftover));
2356 BEAST_EXPECT(acctOffer[sfTakerPays] == usd(leftover));
2359 if (t.preTrust == PreTrustType::NoPreTrust)
2361 if (t.balanceUsd.value().signum() != 0)
2370 BEAST_EXPECT(!sleTrust);
2680 using namespace jtx;
2682 auto const gw =
Account(
"gateway");
2683 auto const usd = gw[
"USD"];
2685 Env env{*
this, features};
2691 auto const f = env.
current()->fees().base;
2694 enum class PreTrustType { NoPreTrust, GwPreTrust, AcctPreTrust };
2728 : account(std::move(account))
2729 , fundXrp(std::move(fundXrp))
2730 , fundUSD(std::move(fundUsd))
2731 , gwGets(std::move(gwGets))
2732 , gwPays(std::move(gwPays))
2733 , acctGets(std::move(acctGets))
2734 , acctPays(std::move(acctPays))
2736 , spentXrp(std::move(spentXrp))
2737 , finalUsd(std::move(finalUsd))
2740 , takerGets(std::move(takerGets))
2741 , takerPays(std::move(takerPays))
2779 TestData
const tests[]{
2782 {
"ann",
XRP(10) +
reserve(env, 0) + 1 * f, usd( 0),
XRP(10), usd( 5), usd(10),
XRP(10),
tecINSUF_RESERVE_OFFER,
XRP( 0) + (1 * f), usd( 0), 0, 0},
2783 {
"bev",
XRP(10) +
reserve(env, 1) + 1 * f, usd( 0),
XRP(10), usd( 5), usd(10),
XRP(10),
tesSUCCESS,
XRP( 0) + (1 * f), usd( 0), 1, 1,
XRP(10), usd(10)},
2784 {
"cam",
XRP(10) +
reserve(env, 0) + 1 * f, usd( 0),
XRP(10), usd(10), usd(10),
XRP(10),
tesSUCCESS,
XRP( 10) + (1 * f), usd(10), 0, 1},
2785 {
"deb",
XRP(10) +
reserve(env, 0) + 1 * f, usd( 0),
XRP(10), usd(20), usd(10),
XRP(10),
tesSUCCESS,
XRP( 10) + (1 * f), usd(20), 0, 1},
2786 {
"eve",
XRP(10) +
reserve(env, 0) + 1 * f, usd( 0),
XRP(10), usd(20), usd( 5),
XRP( 5),
tesSUCCESS,
XRP( 5) + (1 * f), usd(10), 0, 1},
2787 {
"flo",
XRP(10) +
reserve(env, 0) + 1 * f, usd( 0),
XRP(10), usd(20), usd(20),
XRP(20),
tesSUCCESS,
XRP( 10) + (1 * f), usd(20), 0, 1},
2788 {
"gay",
XRP(20) +
reserve(env, 1) + 1 * f, usd( 0),
XRP(10), usd(20), usd(20),
XRP(20),
tesSUCCESS,
XRP( 10) + (1 * f), usd(20), 0, 1},
2789 {
"hye",
XRP(20) +
reserve(env, 2) + 1 * f, usd( 0),
XRP(10), usd(20), usd(20),
XRP(20),
tesSUCCESS,
XRP( 10) + (1 * f), usd(20), 1, 2,
XRP(10), usd(10)},
2791 {
"meg",
reserve(env, 1) + 2 * f, usd(10), usd(10),
XRP( 5),
XRP(10), usd(10),
tecINSUF_RESERVE_OFFER,
XRP( 0) + (2 * f), usd(10), 0, 1},
2792 {
"nia",
reserve(env, 2) + 2 * f, usd(10), usd(10),
XRP( 5),
XRP(10), usd(10),
tesSUCCESS,
XRP( 0) + (2 * f), usd(10), 1, 2, usd(10),
XRP(10)},
2793 {
"ova",
reserve(env, 1) + 2 * f, usd(10), usd(10),
XRP(10),
XRP(10), usd(10),
tesSUCCESS,
XRP(-10) + (2 * f), usd( 0), 0, 1},
2794 {
"pam",
reserve(env, 1) + 2 * f, usd(10), usd(10),
XRP(20),
XRP(10), usd(10),
tesSUCCESS,
XRP(-20) + (2 * f), usd( 0), 0, 1},
2795 {
"qui",
reserve(env, 1) + 2 * f, usd(10), usd(20),
XRP(40),
XRP(10), usd(10),
tesSUCCESS,
XRP(-20) + (2 * f), usd( 0), 0, 1},
2796 {
"rae",
reserve(env, 2) + 2 * f, usd(10), usd( 5),
XRP( 5),
XRP(10), usd(10),
tesSUCCESS,
XRP( -5) + (2 * f), usd( 5), 1, 2, usd( 5),
XRP( 5)},
2797 {
"sue",
reserve(env, 2) + 2 * f, usd(10), usd( 5),
XRP(10),
XRP(10), usd(10),
tesSUCCESS,
XRP(-10) + (2 * f), usd( 5), 1, 2, usd( 5),
XRP( 5)},
2801 auto const zeroUsd = usd(0);
2802 for (
auto const& t :
tests)
2807 auto const acct =
Account(t.account);
2809 env.
fund(t.fundXrp, acct);
2815 if (t.fundUSD != zeroUsd)
2817 env(
trust(acct, t.fundUSD));
2819 env(
pay(gw, acct, t.fundUSD));
2823 env(
offer(gw, t.gwGets, t.gwPays));
2828 env(
offer(acct, t.acctGets, t.acctPays, tfSell),
Ter(t.tec));
2833 BEAST_EXPECT(env.
balance(acct, usd) == t.finalUsd);
2834 BEAST_EXPECT(env.
balance(acct,
xrpIssue()) == t.fundXrp - t.spentXrp);
2841 if (!acctOffers.empty())
2843 BEAST_EXPECT(acctOffers.size() == 1);
2844 auto const& acctOffer = *(acctOffers.front());
2846 BEAST_EXPECT(acctOffer[sfLedgerEntryType] == ltOFFER);
2847 BEAST_EXPECT(acctOffer[sfTakerGets] == t.takerGets);
2848 BEAST_EXPECT(acctOffer[sfTakerPays] == t.takerPays);