20 #include <ripple/app/tx/applySteps.h>
21 #include <ripple/ledger/Directory.h>
22 #include <ripple/protocol/Feature.h>
23 #include <ripple/protocol/Indexes.h>
24 #include <ripple/protocol/TxFlags.h>
25 #include <ripple/protocol/jss.h>
27 #include <test/jtx/TestHelpers.h>
41 {0xA0, 0x25, 0x80, 0x20, 0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC,
42 0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8, 0x99, 0x6F, 0xB9, 0x24,
43 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95,
44 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55, 0x81, 0x01, 0x00}};
48 {0xA0, 0x05, 0x80, 0x03, 0x61, 0x61, 0x61}};
51 {0xA0, 0x25, 0x80, 0x20, 0x98, 0x34, 0x87, 0x6D, 0xCF, 0xB0,
52 0x5C, 0xB1, 0x67, 0xA5, 0xC2, 0x49, 0x53, 0xEB, 0xA5, 0x8C,
53 0x4A, 0xC8, 0x9B, 0x1A, 0xDF, 0x57, 0xF2, 0x8F, 0x2F, 0x9D,
54 0x09, 0xAF, 0x10, 0x7E, 0xE8, 0xF0, 0x81, 0x01, 0x03}};
58 {0xA0, 0x06, 0x80, 0x04, 0x6E, 0x69, 0x6B, 0x62}};
61 {0xA0, 0x25, 0x80, 0x20, 0x6E, 0x4C, 0x71, 0x45, 0x30, 0xC0,
62 0xA4, 0x26, 0x8B, 0x3F, 0xA6, 0x3B, 0x1B, 0x60, 0x6F, 0x2D,
63 0x26, 0x4A, 0x2D, 0x85, 0x7B, 0xE8, 0xA0, 0x9C, 0x1D, 0xFD,
64 0x57, 0x0D, 0x15, 0x85, 0x8B, 0xD4, 0x81, 0x01, 0x04}};
69 testcase(
"Enablement");
75 env.
fund(
XRP(5000),
"alice",
"bob");
79 auto const seq1 = env.
seq(
"alice");
81 env(escrow(
"alice",
"bob",
XRP(1000)),
86 env(
finish(
"bob",
"alice", seq1),
91 auto const seq2 = env.
seq(
"alice");
93 env(escrow(
"alice",
"bob",
XRP(1000)),
99 env(cancel(
"bob",
"alice", seq2),
fee(1500));
109 testcase(
"Timing: Finish Only");
111 env.
fund(
XRP(5000),
"alice",
"bob");
115 auto const ts = env.
now() + 97s;
117 auto const seq = env.
seq(
"alice");
131 testcase(
"Timing: Cancel Only");
133 env.
fund(
XRP(5000),
"alice",
"bob");
137 auto const ts = env.
now() + 117s;
139 auto const seq = env.
seq(
"alice");
140 env(escrow(
"alice",
"bob",
XRP(1000)),
147 env(cancel(
"bob",
"alice",
seq),
159 env(cancel(
"bob",
"alice",
seq),
fee(1500));
163 testcase(
"Timing: Finish and Cancel -> Finish");
165 env.
fund(
XRP(5000),
"alice",
"bob");
169 auto const fts = env.
now() + 117s;
170 auto const cts = env.
now() + 192s;
172 auto const seq = env.
seq(
"alice");
173 env(escrow(
"alice",
"bob",
XRP(1000)),
179 for (; env.
now() < fts; env.
close())
184 env(cancel(
"bob",
"alice",
seq),
197 testcase(
"Timing: Finish and Cancel -> Cancel");
199 env.
fund(
XRP(5000),
"alice",
"bob");
203 auto const fts = env.
now() + 109s;
204 auto const cts = env.
now() + 184s;
206 auto const seq = env.
seq(
"alice");
207 env(escrow(
"alice",
"bob",
XRP(1000)),
213 for (; env.
now() < fts; env.
close())
218 env(cancel(
"bob",
"alice",
seq),
225 for (; env.
now() < cts; env.
close())
226 env(cancel(
"bob",
"alice",
seq),
235 env(cancel(
"bob",
"alice",
seq),
fee(1500));
249 auto const alice =
Account(
"alice");
250 auto const bob =
Account(
"bob");
252 env.
fund(
XRP(5000), alice, bob);
257 env(escrow(alice, bob,
XRP(1000)),
262 auto const seq = env.
seq(alice);
264 env(escrow(alice, bob,
XRP(1000)),
278 testcase(
"Disallow XRP");
287 env.
fund(
XRP(5000),
"bob",
"george");
289 env(escrow(
"bob",
"george",
XRP(10)),
298 env.
fund(
XRP(5000),
"bob",
"george");
311 testcase(
"Implied Finish Time (without fix1571)");
314 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
319 auto const seq1 = env.
seq(
"alice");
320 env(escrow(
"alice",
"bob",
XRP(100)),
324 env(
finish(
"carol",
"alice", seq1),
fee(1500));
325 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5100));
331 auto const seq2 = env.
seq(
"alice");
332 env(escrow(
"alice",
"bob",
XRP(100)),
337 env(
finish(
"carol",
"alice", seq2),
341 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5200));
345 testcase(
"Implied Finish Time (with fix1571)");
348 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
352 env(escrow(
"alice",
"bob",
XRP(100)),
359 auto const seq = env.
seq(
"alice");
360 env(escrow(
"alice",
"bob",
XRP(100)),
369 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5100));
376 testcase(
"Failure Cases");
382 env.
fund(
XRP(5000),
"alice",
"bob");
386 env(escrow(
"alice",
"bob",
XRP(1000)),
391 env(escrow(
"alice",
"bob",
XRP(1000)),
397 env(escrow(
"alice",
"carol",
XRP(1000)),
404 env(escrow(
"alice",
"carol",
Account(
"alice")[
"USD"](500)),
409 env(escrow(
"alice",
"carol",
XRP(0)),
412 env(escrow(
"alice",
"carol",
XRP(-1000)),
420 env(escrow(
"alice",
"carol",
XRP(1)),
425 env(escrow(
"alice",
"carol",
XRP(1)),
431 env(escrow(
"alice",
"carol",
XRP(1)),
437 env(escrow(
"alice",
"carol",
XRP(1)),
447 env(escrow(
"alice",
"carol",
XRP(1)),
453 env(escrow(
"alice",
"carol",
XRP(1)),
459 auto const accountReserve =
drops(env.
current()->fees().reserve);
460 auto const accountIncrement =
463 env.
fund(accountReserve + accountIncrement +
XRP(50),
"daniel");
464 env(escrow(
"daniel",
"bob",
XRP(51)),
468 env.
fund(accountReserve + accountIncrement +
XRP(50),
"evan");
469 env(escrow(
"evan",
"bob",
XRP(50)),
473 env.
fund(accountReserve,
"frank");
474 env(escrow(
"frank",
"bob",
XRP(1)),
481 auto const seq = env.
seq(
"hannah");
482 env(escrow(
"hannah",
"hannah",
XRP(10)),
493 auto const seq = env.
seq(
"ivan");
516 env.
fund(
XRP(5000),
"alice",
"bob");
517 auto const seq = env.
seq(
"alice");
518 env(escrow(
"alice",
"alice",
XRP(1000)),
540 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
541 auto const seq = env.
seq(
"alice");
566 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
570 auto const seq = env.
seq(
"alice");
594 auto const baseFee = env.
current()->fees().base;
604 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
607 env(deposit::auth(
"bob",
"zelda"));
610 auto const seq = env.
seq(
"alice");
622 auto const baseFee = env.
current()->fees().base;
630 env.
fund(
XRP(5000),
"alice",
"bob");
631 auto const seq = env.
seq(
"alice");
632 env(escrow(
"alice",
"alice",
XRP(1000)),
672 env.
fund(
XRP(5000),
"alice",
"bob");
673 auto const seq = env.
seq(
"alice");
674 env(escrow(
"alice",
"alice",
XRP(1000)),
708 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
709 auto const seq = env.
seq(
"alice");
710 env(escrow(
"alice",
"alice",
XRP(1000)),
718 env(deposit::auth(
"alice",
"zelda"));
751 testcase(
"Escrow with CryptoConditions");
758 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
759 auto const seq = env.
seq(
"alice");
761 env(escrow(
"alice",
"carol",
XRP(1000)),
831 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
832 auto const seq = env.
seq(
"alice");
834 env(escrow(
"alice",
"carol",
XRP(1000)),
840 env(cancel(
"bob",
"alice",
seq));
847 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
849 auto const seq = env.
seq(
"alice");
850 env(escrow(
"alice",
"carol",
XRP(1000)),
869 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
875 auto const p = v.
data();
876 auto const s = v.
size();
878 auto const ts = env.
now() + 1s;
882 env(escrow(
"alice",
"carol",
XRP(1000)),
886 env(escrow(
"alice",
"carol",
XRP(1000)),
890 env(escrow(
"alice",
"carol",
XRP(1000)),
894 env(escrow(
"alice",
"carol",
XRP(1000)),
898 env(escrow(
"alice",
"carol",
XRP(1000)),
902 env(escrow(
"alice",
"carol",
XRP(1000)),
906 env(escrow(
"alice",
"carol",
XRP(1000)),
911 auto const seq = env.
seq(
"alice");
912 env(escrow(
"alice",
"carol",
XRP(1000)),
926 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
932 auto const cp = cv.
data();
933 auto const cs = cv.
size();
939 auto const fp = fv.
data();
940 auto const fs = fv.
size();
942 auto const ts = env.
now() + 1s;
946 env(escrow(
"alice",
"carol",
XRP(1000)),
950 env(escrow(
"alice",
"carol",
XRP(1000)),
954 env(escrow(
"alice",
"carol",
XRP(1000)),
958 env(escrow(
"alice",
"carol",
XRP(1000)),
962 env(escrow(
"alice",
"carol",
XRP(1000)),
966 env(escrow(
"alice",
"carol",
XRP(1000)),
970 env(escrow(
"alice",
"carol",
XRP(1000)),
975 auto const seq = env.
seq(
"alice");
976 env(escrow(
"alice",
"carol",
XRP(1000)),
1072 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
1074 env(escrow(
"alice",
"carol",
XRP(1000)),
1079 auto const seq = env.
seq(
"alice");
1080 env(escrow(
"alice",
"carol",
XRP(1000)),
1118 env.
fund(
XRP(5000),
"alice",
"bob");
1121 {0xA2, 0x2B, 0x80, 0x20, 0x42, 0x4A, 0x70, 0x49, 0x49,
1122 0x52, 0x92, 0x67, 0xB6, 0x21, 0xB3, 0xD7, 0x91, 0x19,
1123 0xD7, 0x29, 0xB2, 0x38, 0x2C, 0xED, 0x8B, 0x29, 0x6C,
1124 0x3C, 0x02, 0x8F, 0xA9, 0x7D, 0x35, 0x0F, 0x6D, 0x07,
1125 0x81, 0x03, 0x06, 0x34, 0xD2, 0x82, 0x02, 0x03, 0xC8}};
1129 env(escrow(
"alice",
"bob",
XRP(1000)),
1139 using namespace jtx;
1142 auto const alice =
Account(
"alice");
1143 auto const bruce =
Account(
"bruce");
1144 auto const carol =
Account(
"carol");
1147 testcase(
"Metadata to self");
1150 env.
fund(
XRP(5000), alice, bruce, carol);
1151 auto const aseq = env.
seq(alice);
1152 auto const bseq = env.
seq(bruce);
1154 env(escrow(alice, alice,
XRP(1000)),
1171 env(escrow(bruce, bruce,
XRP(1000)),
1189 env(
finish(alice, alice, aseq));
1208 env(cancel(bruce, bruce, bseq));
1222 testcase(
"Metadata to other");
1225 env.
fund(
XRP(5000), alice, bruce, carol);
1226 auto const aseq = env.
seq(alice);
1227 auto const bseq = env.
seq(bruce);
1234 env(escrow(bruce, carol,
XRP(1000)),
1268 env(
finish(alice, alice, aseq));
1290 env(cancel(bruce, bruce, bseq));
1316 testcase(
"Consequences");
1318 using namespace jtx;
1327 auto const jtx = env.
jt(
1328 escrow(
"alice",
"carol",
XRP(1000)),
1339 BEAST_EXPECT(!pf.consequences.isBlocker());
1340 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1341 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(1000));
1345 auto const jtx = env.
jt(cancel(
"bob",
"alice", 3),
seq(1),
fee(10));
1353 BEAST_EXPECT(!pf.consequences.isBlocker());
1354 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1355 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(0));
1359 auto const jtx = env.
jt(
finish(
"bob",
"alice", 3),
seq(1),
fee(10));
1367 BEAST_EXPECT(!pf.consequences.isBlocker());
1368 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1369 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(0));
1376 testcase(
"Escrow with tickets");
1378 using namespace jtx;
1386 env.
fund(
XRP(5000), alice, bob);
1391 env(ticket::create(alice, 1));
1397 env(ticket::create(bob, bobTicketCount));
1409 auto const ts = env.
now() + 97s;
1412 env(escrow(alice, bob,
XRP(1000)),
1415 BEAST_EXPECT(env.
seq(alice) == aliceRootSeq);
1421 for (; env.
now() < ts; env.
close())
1423 env(
finish(bob, alice, escrowSeq),
1427 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1431 env(
finish(bob, alice, escrowSeq),
1437 env(
finish(bob, alice, escrowSeq),
1441 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1447 env.
fund(
XRP(5000), alice, bob);
1452 env(ticket::create(alice, 1));
1458 env(ticket::create(bob, bobTicketCount));
1469 auto const ts = env.
now() + 117s;
1472 env(escrow(alice, bob,
XRP(1000)),
1476 BEAST_EXPECT(env.
seq(alice) == aliceRootSeq);
1482 for (; env.
now() < ts; env.
close())
1484 env(cancel(bob, alice, escrowSeq),
1488 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1492 env(
finish(bob, alice, escrowSeq),
1498 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1501 env(cancel(bob, alice, escrowSeq),
1505 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);