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>
40 {0xA0, 0x25, 0x80, 0x20, 0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC,
41 0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8, 0x99, 0x6F, 0xB9, 0x24,
42 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95,
43 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55, 0x81, 0x01, 0x00}};
47 {0xA0, 0x05, 0x80, 0x03, 0x61, 0x61, 0x61}};
50 {0xA0, 0x25, 0x80, 0x20, 0x98, 0x34, 0x87, 0x6D, 0xCF, 0xB0,
51 0x5C, 0xB1, 0x67, 0xA5, 0xC2, 0x49, 0x53, 0xEB, 0xA5, 0x8C,
52 0x4A, 0xC8, 0x9B, 0x1A, 0xDF, 0x57, 0xF2, 0x8F, 0x2F, 0x9D,
53 0x09, 0xAF, 0x10, 0x7E, 0xE8, 0xF0, 0x81, 0x01, 0x03}};
57 {0xA0, 0x06, 0x80, 0x04, 0x6E, 0x69, 0x6B, 0x62}};
60 {0xA0, 0x25, 0x80, 0x20, 0x6E, 0x4C, 0x71, 0x45, 0x30, 0xC0,
61 0xA4, 0x26, 0x8B, 0x3F, 0xA6, 0x3B, 0x1B, 0x60, 0x6F, 0x2D,
62 0x26, 0x4A, 0x2D, 0x85, 0x7B, 0xE8, 0xA0, 0x9C, 0x1D, 0xFD,
63 0x57, 0x0D, 0x15, 0x85, 0x8B, 0xD4, 0x81, 0x01, 0x04}};
68 testcase(
"Enablement");
74 env.
fund(
XRP(5000),
"alice",
"bob");
78 auto const seq1 = env.
seq(
"alice");
80 env(escrow(
"alice",
"bob",
XRP(1000)),
85 env(
finish(
"bob",
"alice", seq1),
90 auto const seq2 = env.
seq(
"alice");
92 env(escrow(
"alice",
"bob",
XRP(1000)),
98 env(cancel(
"bob",
"alice", seq2),
fee(1500));
108 testcase(
"Timing: Finish Only");
110 env.
fund(
XRP(5000),
"alice",
"bob");
114 auto const ts = env.
now() + 97s;
116 auto const seq = env.
seq(
"alice");
130 testcase(
"Timing: Cancel Only");
132 env.
fund(
XRP(5000),
"alice",
"bob");
136 auto const ts = env.
now() + 117s;
138 auto const seq = env.
seq(
"alice");
139 env(escrow(
"alice",
"bob",
XRP(1000)),
146 env(cancel(
"bob",
"alice",
seq),
158 env(cancel(
"bob",
"alice",
seq),
fee(1500));
162 testcase(
"Timing: Finish and Cancel -> Finish");
164 env.
fund(
XRP(5000),
"alice",
"bob");
168 auto const fts = env.
now() + 117s;
169 auto const cts = env.
now() + 192s;
171 auto const seq = env.
seq(
"alice");
172 env(escrow(
"alice",
"bob",
XRP(1000)),
178 for (; env.
now() < fts; env.
close())
183 env(cancel(
"bob",
"alice",
seq),
196 testcase(
"Timing: Finish and Cancel -> Cancel");
198 env.
fund(
XRP(5000),
"alice",
"bob");
202 auto const fts = env.
now() + 109s;
203 auto const cts = env.
now() + 184s;
205 auto const seq = env.
seq(
"alice");
206 env(escrow(
"alice",
"bob",
XRP(1000)),
212 for (; env.
now() < fts; env.
close())
217 env(cancel(
"bob",
"alice",
seq),
224 for (; env.
now() < cts; env.
close())
225 env(cancel(
"bob",
"alice",
seq),
234 env(cancel(
"bob",
"alice",
seq),
fee(1500));
248 auto const alice =
Account(
"alice");
249 auto const bob =
Account(
"bob");
251 env.
fund(
XRP(5000), alice, bob);
256 env(escrow(alice, bob,
XRP(1000)),
261 auto const seq = env.
seq(alice);
263 env(escrow(alice, bob,
XRP(1000)),
277 testcase(
"Disallow XRP");
286 env.
fund(
XRP(5000),
"bob",
"george");
288 env(escrow(
"bob",
"george",
XRP(10)),
297 env.
fund(
XRP(5000),
"bob",
"george");
310 testcase(
"Implied Finish Time (without fix1571)");
313 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
318 auto const seq1 = env.
seq(
"alice");
319 env(escrow(
"alice",
"bob",
XRP(100)),
323 env(
finish(
"carol",
"alice", seq1),
fee(1500));
324 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5100));
330 auto const seq2 = env.
seq(
"alice");
331 env(escrow(
"alice",
"bob",
XRP(100)),
336 env(
finish(
"carol",
"alice", seq2),
340 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5200));
344 testcase(
"Implied Finish Time (with fix1571)");
347 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
351 env(escrow(
"alice",
"bob",
XRP(100)),
358 auto const seq = env.
seq(
"alice");
359 env(escrow(
"alice",
"bob",
XRP(100)),
368 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5100));
375 testcase(
"Failure Cases");
381 env.
fund(
XRP(5000),
"alice",
"bob");
385 env(escrow(
"alice",
"bob",
XRP(1000)),
390 env(escrow(
"alice",
"bob",
XRP(1000)),
396 env(escrow(
"alice",
"carol",
XRP(1000)),
403 env(escrow(
"alice",
"carol",
Account(
"alice")[
"USD"](500)),
408 env(escrow(
"alice",
"carol",
XRP(0)),
411 env(escrow(
"alice",
"carol",
XRP(-1000)),
419 env(escrow(
"alice",
"carol",
XRP(1)),
424 env(escrow(
"alice",
"carol",
XRP(1)),
430 env(escrow(
"alice",
"carol",
XRP(1)),
436 env(escrow(
"alice",
"carol",
XRP(1)),
446 env(escrow(
"alice",
"carol",
XRP(1)),
452 env(escrow(
"alice",
"carol",
XRP(1)),
458 auto const accountReserve =
drops(env.
current()->fees().reserve);
459 auto const accountIncrement =
462 env.
fund(accountReserve + accountIncrement +
XRP(50),
"daniel");
463 env(escrow(
"daniel",
"bob",
XRP(51)),
467 env.
fund(accountReserve + accountIncrement +
XRP(50),
"evan");
468 env(escrow(
"evan",
"bob",
XRP(50)),
472 env.
fund(accountReserve,
"frank");
473 env(escrow(
"frank",
"bob",
XRP(1)),
480 auto const seq = env.
seq(
"hannah");
481 env(escrow(
"hannah",
"hannah",
XRP(10)),
492 auto const seq = env.
seq(
"ivan");
515 env.
fund(
XRP(5000),
"alice",
"bob");
516 auto const seq = env.
seq(
"alice");
517 env(escrow(
"alice",
"alice",
XRP(1000)),
539 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
540 auto const seq = env.
seq(
"alice");
565 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
569 auto const seq = env.
seq(
"alice");
593 auto const baseFee = env.
current()->fees().base;
603 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
606 env(deposit::auth(
"bob",
"zelda"));
609 auto const seq = env.
seq(
"alice");
621 auto const baseFee = env.
current()->fees().base;
629 env.
fund(
XRP(5000),
"alice",
"bob");
630 auto const seq = env.
seq(
"alice");
631 env(escrow(
"alice",
"alice",
XRP(1000)),
671 env.
fund(
XRP(5000),
"alice",
"bob");
672 auto const seq = env.
seq(
"alice");
673 env(escrow(
"alice",
"alice",
XRP(1000)),
707 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
708 auto const seq = env.
seq(
"alice");
709 env(escrow(
"alice",
"alice",
XRP(1000)),
717 env(deposit::auth(
"alice",
"zelda"));
750 testcase(
"Escrow with CryptoConditions");
757 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
758 auto const seq = env.
seq(
"alice");
760 env(escrow(
"alice",
"carol",
XRP(1000)),
830 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
831 auto const seq = env.
seq(
"alice");
833 env(escrow(
"alice",
"carol",
XRP(1000)),
839 env(cancel(
"bob",
"alice",
seq));
846 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
848 auto const seq = env.
seq(
"alice");
849 env(escrow(
"alice",
"carol",
XRP(1000)),
868 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
874 auto const p = v.
data();
875 auto const s = v.
size();
877 auto const ts = env.
now() + 1s;
881 env(escrow(
"alice",
"carol",
XRP(1000)),
885 env(escrow(
"alice",
"carol",
XRP(1000)),
889 env(escrow(
"alice",
"carol",
XRP(1000)),
893 env(escrow(
"alice",
"carol",
XRP(1000)),
897 env(escrow(
"alice",
"carol",
XRP(1000)),
901 env(escrow(
"alice",
"carol",
XRP(1000)),
905 env(escrow(
"alice",
"carol",
XRP(1000)),
910 auto const seq = env.
seq(
"alice");
911 env(escrow(
"alice",
"carol",
XRP(1000)),
925 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
931 auto const cp = cv.
data();
932 auto const cs = cv.
size();
938 auto const fp = fv.
data();
939 auto const fs = fv.
size();
941 auto const ts = env.
now() + 1s;
945 env(escrow(
"alice",
"carol",
XRP(1000)),
949 env(escrow(
"alice",
"carol",
XRP(1000)),
953 env(escrow(
"alice",
"carol",
XRP(1000)),
957 env(escrow(
"alice",
"carol",
XRP(1000)),
961 env(escrow(
"alice",
"carol",
XRP(1000)),
965 env(escrow(
"alice",
"carol",
XRP(1000)),
969 env(escrow(
"alice",
"carol",
XRP(1000)),
974 auto const seq = env.
seq(
"alice");
975 env(escrow(
"alice",
"carol",
XRP(1000)),
1071 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
1073 env(escrow(
"alice",
"carol",
XRP(1000)),
1078 auto const seq = env.
seq(
"alice");
1079 env(escrow(
"alice",
"carol",
XRP(1000)),
1117 env.
fund(
XRP(5000),
"alice",
"bob");
1120 {0xA2, 0x2B, 0x80, 0x20, 0x42, 0x4A, 0x70, 0x49, 0x49,
1121 0x52, 0x92, 0x67, 0xB6, 0x21, 0xB3, 0xD7, 0x91, 0x19,
1122 0xD7, 0x29, 0xB2, 0x38, 0x2C, 0xED, 0x8B, 0x29, 0x6C,
1123 0x3C, 0x02, 0x8F, 0xA9, 0x7D, 0x35, 0x0F, 0x6D, 0x07,
1124 0x81, 0x03, 0x06, 0x34, 0xD2, 0x82, 0x02, 0x03, 0xC8}};
1128 env(escrow(
"alice",
"bob",
XRP(1000)),
1138 using namespace jtx;
1141 auto const alice =
Account(
"alice");
1142 auto const bruce =
Account(
"bruce");
1143 auto const carol =
Account(
"carol");
1146 testcase(
"Metadata to self");
1149 env.
fund(
XRP(5000), alice, bruce, carol);
1150 auto const aseq = env.
seq(alice);
1151 auto const bseq = env.
seq(bruce);
1153 env(escrow(alice, alice,
XRP(1000)),
1170 env(escrow(bruce, bruce,
XRP(1000)),
1188 env(
finish(alice, alice, aseq));
1207 env(cancel(bruce, bruce, bseq));
1221 testcase(
"Metadata to other");
1224 env.
fund(
XRP(5000), alice, bruce, carol);
1225 auto const aseq = env.
seq(alice);
1226 auto const bseq = env.
seq(bruce);
1233 env(escrow(bruce, carol,
XRP(1000)),
1267 env(
finish(alice, alice, aseq));
1289 env(cancel(bruce, bruce, bseq));
1315 testcase(
"Consequences");
1317 using namespace jtx;
1326 auto const jtx = env.
jt(
1327 escrow(
"alice",
"carol",
XRP(1000)),
1338 BEAST_EXPECT(!pf.consequences.isBlocker());
1339 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1340 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(1000));
1344 auto const jtx = env.
jt(cancel(
"bob",
"alice", 3),
seq(1),
fee(10));
1352 BEAST_EXPECT(!pf.consequences.isBlocker());
1353 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1354 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(0));
1358 auto const jtx = env.
jt(
finish(
"bob",
"alice", 3),
seq(1),
fee(10));
1366 BEAST_EXPECT(!pf.consequences.isBlocker());
1367 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1368 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(0));
1375 testcase(
"Escrow with tickets");
1377 using namespace jtx;
1385 env.
fund(
XRP(5000), alice, bob);
1390 env(ticket::create(alice, 1));
1396 env(ticket::create(bob, bobTicketCount));
1408 auto const ts = env.
now() + 97s;
1411 env(escrow(alice, bob,
XRP(1000)),
1414 BEAST_EXPECT(env.
seq(alice) == aliceRootSeq);
1420 for (; env.
now() < ts; env.
close())
1422 env(
finish(bob, alice, escrowSeq),
1426 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1430 env(
finish(bob, alice, escrowSeq),
1436 env(
finish(bob, alice, escrowSeq),
1440 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1446 env.
fund(
XRP(5000), alice, bob);
1451 env(ticket::create(alice, 1));
1457 env(ticket::create(bob, bobTicketCount));
1468 auto const ts = env.
now() + 117s;
1471 env(escrow(alice, bob,
XRP(1000)),
1475 BEAST_EXPECT(env.
seq(alice) == aliceRootSeq);
1481 for (; env.
now() < ts; env.
close())
1483 env(cancel(bob, alice, escrowSeq),
1487 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1491 env(
finish(bob, alice, escrowSeq),
1497 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1500 env(cancel(bob, alice, escrowSeq),
1504 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);