40 using namespace test::jtx;
43 Account gw{
"gateway"};
44 Account alice{
"alice"};
47 env.fund(XRP(10000), gw, alice, bob);
52 auto jrr = ledgerEntryState(env, gw, alice,
"USD");
53 BEAST_EXPECT(jrr[jss::error] ==
"entryNotFound");
56 env(trust(alice, gw[
"USD"](800)));
58 jrr = ledgerEntryState(env, gw, alice,
"USD");
59 BEAST_EXPECT(jrr[jss::node][sfBalance.fieldName][jss::value] ==
"0");
61 jrr[jss::node][sfHighLimit.fieldName][jss::value] ==
"800");
63 jrr[jss::node][sfHighLimit.fieldName][jss::issuer] ==
66 jrr[jss::node][sfHighLimit.fieldName][jss::currency] ==
"USD");
67 BEAST_EXPECT(jrr[jss::node][sfLowLimit.fieldName][jss::value] ==
"0");
69 jrr[jss::node][sfLowLimit.fieldName][jss::issuer] == gw.human());
71 jrr[jss::node][sfLowLimit.fieldName][jss::currency] ==
"USD");
74 env(trust(alice, gw[
"USD"](700)));
76 jrr = ledgerEntryState(env, gw, alice,
"USD");
77 BEAST_EXPECT(jrr[jss::node][sfBalance.fieldName][jss::value] ==
"0");
79 jrr[jss::node][sfHighLimit.fieldName][jss::value] ==
"700");
81 jrr[jss::node][sfHighLimit.fieldName][jss::issuer] ==
84 jrr[jss::node][sfHighLimit.fieldName][jss::currency] ==
"USD");
85 BEAST_EXPECT(jrr[jss::node][sfLowLimit.fieldName][jss::value] ==
"0");
87 jrr[jss::node][sfLowLimit.fieldName][jss::issuer] == gw.human());
89 jrr[jss::node][sfLowLimit.fieldName][jss::currency] ==
"USD");
95 env(trust(alice, gw[
"USD"](0)));
98 jrr = ledgerEntryState(env, gw, alice,
"USD");
99 BEAST_EXPECT(jrr[jss::error] ==
"entryNotFound");
104 env(trust(alice, bob[
"USD"](600)));
107 env(trust(bob, alice[
"USD"](500)));
110 jrr = ledgerEntryState(env, alice, bob,
"USD");
111 BEAST_EXPECT(jrr[jss::node][sfBalance.fieldName][jss::value] ==
"0");
113 jrr[jss::node][sfHighLimit.fieldName][jss::value] ==
"500");
115 jrr[jss::node][sfHighLimit.fieldName][jss::issuer] == bob.human());
117 jrr[jss::node][sfHighLimit.fieldName][jss::currency] ==
"USD");
118 BEAST_EXPECT(jrr[jss::node][sfLowLimit.fieldName][jss::value] ==
"600");
120 jrr[jss::node][sfLowLimit.fieldName][jss::issuer] == alice.human());
122 jrr[jss::node][sfLowLimit.fieldName][jss::currency] ==
"USD");
129 using namespace test::jtx;
131 Env env{*
this, features};
132 Account alice{
"alice"};
135 env.fund(XRP(10000), alice, bob);
138 env(trust(alice, bob[
"USD"](600)));
139 env(trust(bob, alice[
"USD"](700)));
142 env(pay(alice, bob, alice[
"USD"](24)));
143 env.require(balance(bob, alice[
"USD"](24)));
146 env(pay(alice, bob, bob[
"USD"](33)));
147 env.require(balance(bob, alice[
"USD"](57)));
150 env(pay(bob, alice, bob[
"USD"](90)));
151 env.require(balance(bob, alice[
"USD"](-33)));
154 env(pay(alice, bob, bob[
"USD"](733)));
155 env.require(balance(bob, alice[
"USD"](700)));
158 env(pay(bob, alice, bob[
"USD"](1300)));
159 env.require(balance(bob, alice[
"USD"](-600)));
162 env(pay(bob, alice, bob[
"USD"](1)), ter(
tecPATH_DRY));
163 env.require(balance(bob, alice[
"USD"](-600)));
171 (with_rate ?
"With " :
"Without ") +
" Xfer Fee, " +
172 (subscribe ?
"With " :
"Without ") +
" Subscribe");
173 using namespace test::jtx;
175 Env env{*
this, features};
177 Account gw{
"gateway"};
178 Account alice{
"alice"};
181 env.fund(XRP(10000), gw, alice, bob);
184 env(trust(alice, gw[
"AUD"](100)));
185 env(trust(bob, gw[
"AUD"](100)));
187 env(pay(gw, alice, alice[
"AUD"](1)));
190 env.require(balance(alice, gw[
"AUD"](1)));
193 env(pay(alice, bob, gw[
"AUD"](1)));
196 env.require(balance(alice, gw[
"AUD"](0)));
197 env.require(balance(bob, gw[
"AUD"](1)));
198 env.require(balance(gw, bob[
"AUD"](-1)));
206 env(pay(bob, alice, gw[
"AUD"](0.5)), sendmax(gw[
"AUD"](0.55)));
211 env(pay(bob, alice, gw[
"AUD"](0.5)));
214 env.require(balance(alice, gw[
"AUD"](0.5)));
215 env.require(balance(bob, gw[
"AUD"](with_rate ? 0.45 : 0.5)));
216 env.require(balance(gw, bob[
"AUD"](with_rate ? -0.45 : -0.5)));
222 jvs[jss::accounts].
append(gw.human());
224 jvs[jss::streams].
append(
"transactions");
225 jvs[jss::streams].
append(
"ledger");
226 auto jv = wsc->invoke(
"subscribe", jvs);
227 BEAST_EXPECT(jv[jss::status] ==
"success");
231 using namespace std::chrono_literals;
232 BEAST_EXPECT(wsc->findMsg(5s, [](
auto const& jval) {
233 auto const& t = jval[jss::transaction];
234 return t[jss::TransactionType] == jss::Payment;
236 BEAST_EXPECT(wsc->findMsg(5s, [](
auto const& jval) {
237 return jval[jss::type] ==
"ledgerClosed";
241 wsc->invoke(
"unsubscribe", jv)[jss::status] ==
"success");
248 testcase(
"Payments With Paths and Fees");
249 using namespace test::jtx;
251 Env env{*
this, features};
252 Account gw{
"gateway"};
253 Account alice{
"alice"};
256 env.fund(XRP(10000), gw, alice, bob);
262 env(trust(alice, gw[
"AUD"](100)));
263 env(trust(bob, gw[
"AUD"](100)));
265 env(pay(gw, alice, alice[
"AUD"](4.4)));
266 env.require(balance(alice, gw[
"AUD"](4.4)));
270 env(pay(alice, bob, gw[
"AUD"](1)), sendmax(gw[
"AUD"](1.1)));
271 env.require(balance(alice, gw[
"AUD"](3.3)));
272 env.require(balance(bob, gw[
"AUD"](1)));
275 env(pay(alice, bob, bob[
"AUD"](1)), sendmax(gw[
"AUD"](1.1)));
276 env.require(balance(alice, gw[
"AUD"](2.2)));
277 env.require(balance(bob, gw[
"AUD"](2)));
280 env(pay(alice, bob, gw[
"AUD"](1)), sendmax(alice[
"AUD"](1.1)));
281 env.require(balance(alice, gw[
"AUD"](1.1)));
282 env.require(balance(bob, gw[
"AUD"](3)));
286 env(pay(alice, bob, bob[
"AUD"](1)),
287 sendmax(alice[
"AUD"](1.1)),
290 env.require(balance(alice, gw[
"AUD"](1.1)));
291 env.require(balance(bob, gw[
"AUD"](3)));
298 using namespace test::jtx;
300 Env env{*
this, features};
301 Account gw{
"gateway"};
302 Account alice{
"alice"};
305 env.fund(XRP(10000), gw, alice, bob);
308 env(trust(alice, gw[
"USD"](600)));
309 env(trust(bob, gw[
"USD"](700)));
311 env(pay(gw, alice, alice[
"USD"](70)));
312 env(pay(gw, bob, bob[
"USD"](50)));
314 env.require(balance(alice, gw[
"USD"](70)));
315 env.require(balance(bob, gw[
"USD"](50)));
325 env.require(balance(alice, gw[
"USD"](70)));
326 env.require(balance(bob, gw[
"USD"](50)));
331 env.require(balance(alice, gw[
"USD"](65)));
332 env.require(balance(bob, gw[
"USD"](55)));
340 (with_rate ?
"With " :
"Without ") +
" Xfer Fee, ");
341 using namespace test::jtx;
343 Env env{*
this, features};
344 Account gw{
"gateway"};
345 Account amazon{
"amazon"};
346 Account alice{
"alice"};
348 Account carol{
"carol"};
350 env.fund(XRP(10000), gw, amazon, alice, bob, carol);
353 env(trust(amazon, gw[
"USD"](2000)));
354 env(trust(bob, alice[
"USD"](600)));
355 env(trust(bob, gw[
"USD"](1000)));
356 env(trust(carol, alice[
"USD"](700)));
357 env(trust(carol, gw[
"USD"](1000)));
362 env(pay(gw, bob, bob[
"USD"](100)));
363 env(pay(gw, carol, carol[
"USD"](100)));
368 env(pay(alice, amazon, gw[
"USD"](150)),
369 sendmax(alice[
"USD"](200)),
373 env(pay(alice, amazon, gw[
"USD"](150)),
382 carol[
"USD"].issue(),
387 env.require(balance(carol, gw[
"USD"](35)));
391 env.require(balance(alice, carol[
"USD"](-50)));
392 env.require(balance(carol, gw[
"USD"](50)));
394 env.require(balance(alice, bob[
"USD"](-100)));
395 env.require(balance(amazon, gw[
"USD"](150)));
396 env.require(balance(bob, gw[
"USD"](0)));
402 testcase(
"Set Invoice ID on Payment");
403 using namespace test::jtx;
405 Env env{*
this, features};
406 Account alice{
"alice"};
409 env.fund(XRP(10000), alice);
414 jvs[jss::accounts].
append(env.master.human());
416 jvs[jss::streams].
append(
"transactions");
417 BEAST_EXPECT(wsc->invoke(
"subscribe", jvs)[jss::status] ==
"success");
419 char const* invoiceid =
420 "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89";
424 pay(env.master, alice, XRP(10000)),
425 json(sfInvoiceID.fieldName, invoiceid));
426 jv[jss::tx_blob] =
strHex(tx.stx->getSerializer().slice());
427 auto jrr = wsc->invoke(
"submit", jv)[jss::result];
428 BEAST_EXPECT(jrr[jss::status] ==
"success");
429 BEAST_EXPECT(jrr[jss::tx_json][sfInvoiceID.fieldName] == invoiceid);
432 using namespace std::chrono_literals;
433 BEAST_EXPECT(wsc->findMsg(2s, [invoiceid](
auto const& jval) {
434 auto const& t = jval[jss::transaction];
435 return t[jss::TransactionType] == jss::Payment &&
436 t[sfInvoiceID.fieldName] == invoiceid;
439 BEAST_EXPECT(wsc->invoke(
"unsubscribe", jv)[jss::status] ==
"success");