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>
39 {0xA0, 0x25, 0x80, 0x20, 0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC,
40 0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8, 0x99, 0x6F, 0xB9, 0x24,
41 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95,
42 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55, 0x81, 0x01, 0x00}};
46 {0xA0, 0x05, 0x80, 0x03, 0x61, 0x61, 0x61}};
49 {0xA0, 0x25, 0x80, 0x20, 0x98, 0x34, 0x87, 0x6D, 0xCF, 0xB0,
50 0x5C, 0xB1, 0x67, 0xA5, 0xC2, 0x49, 0x53, 0xEB, 0xA5, 0x8C,
51 0x4A, 0xC8, 0x9B, 0x1A, 0xDF, 0x57, 0xF2, 0x8F, 0x2F, 0x9D,
52 0x09, 0xAF, 0x10, 0x7E, 0xE8, 0xF0, 0x81, 0x01, 0x03}};
56 {0xA0, 0x06, 0x80, 0x04, 0x6E, 0x69, 0x6B, 0x62}};
59 {0xA0, 0x25, 0x80, 0x20, 0x6E, 0x4C, 0x71, 0x45, 0x30, 0xC0,
60 0xA4, 0x26, 0x8B, 0x3F, 0xA6, 0x3B, 0x1B, 0x60, 0x6F, 0x2D,
61 0x26, 0x4A, 0x2D, 0x85, 0x7B, 0xE8, 0xA0, 0x9C, 0x1D, 0xFD,
62 0x57, 0x0D, 0x15, 0x85, 0x8B, 0xD4, 0x81, 0x01, 0x04}};
154 jv[jss::TransactionType] = jss::EscrowCreate;
156 jv[jss::Account] = account.human();
157 jv[jss::Destination] = to.
human();
169 jv[jss::TransactionType] = jss::EscrowFinish;
171 jv[jss::Account] = account.human();
184 jv[jss::TransactionType] = jss::EscrowCancel;
186 jv[jss::Account] = account.human();
195 testcase(
"Enablement");
201 env.
fund(
XRP(5000),
"alice",
"bob");
205 auto const seq1 = env.
seq(
"alice");
212 env(
finish(
"bob",
"alice", seq1),
217 auto const seq2 = env.
seq(
"alice");
225 env(
cancel(
"bob",
"alice", seq2),
fee(1500));
235 testcase(
"Timing: Finish Only");
237 env.
fund(
XRP(5000),
"alice",
"bob");
241 auto const ts = env.
now() + 97s;
243 auto const seq = env.
seq(
"alice");
257 testcase(
"Timing: Cancel Only");
259 env.
fund(
XRP(5000),
"alice",
"bob");
263 auto const ts = env.
now() + 117s;
265 auto const seq = env.
seq(
"alice");
289 testcase(
"Timing: Finish and Cancel -> Finish");
291 env.
fund(
XRP(5000),
"alice",
"bob");
295 auto const fts = env.
now() + 117s;
296 auto const cts = env.
now() + 192s;
298 auto const seq = env.
seq(
"alice");
305 for (; env.
now() < fts; env.
close())
323 testcase(
"Timing: Finish and Cancel -> Cancel");
325 env.
fund(
XRP(5000),
"alice",
"bob");
329 auto const fts = env.
now() + 109s;
330 auto const cts = env.
now() + 184s;
332 auto const seq = env.
seq(
"alice");
339 for (; env.
now() < fts; env.
close())
351 for (; env.
now() < cts; env.
close())
375 auto const alice =
Account(
"alice");
376 auto const bob =
Account(
"bob");
378 env.
fund(
XRP(5000), alice, bob);
388 auto const seq = env.
seq(alice);
404 testcase(
"Disallow XRP");
413 env.
fund(
XRP(5000),
"bob",
"george");
424 env.
fund(
XRP(5000),
"bob",
"george");
437 testcase(
"Implied Finish Time (without fix1571)");
440 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
445 auto const seq1 = env.
seq(
"alice");
450 env(
finish(
"carol",
"alice", seq1),
fee(1500));
451 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5100));
457 auto const seq2 = env.
seq(
"alice");
463 env(
finish(
"carol",
"alice", seq2),
467 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5200));
471 testcase(
"Implied Finish Time (with fix1571)");
474 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
485 auto const seq = env.
seq(
"alice");
495 BEAST_EXPECT(env.
balance(
"bob") ==
XRP(5100));
502 testcase(
"Failure Cases");
508 env.
fund(
XRP(5000),
"alice",
"bob");
538 env(
escrow(
"alice",
"carol",
XRP(-1000)),
585 auto const accountReserve =
drops(env.
current()->fees().reserve);
586 auto const accountIncrement =
589 env.
fund(accountReserve + accountIncrement +
XRP(50),
"daniel");
594 env.
fund(accountReserve + accountIncrement +
XRP(50),
"evan");
599 env.
fund(accountReserve,
"frank");
607 auto const seq = env.
seq(
"hannah");
619 auto const seq = env.
seq(
"ivan");
642 env.
fund(
XRP(5000),
"alice",
"bob");
643 auto const seq = env.
seq(
"alice");
666 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
667 auto const seq = env.
seq(
"alice");
692 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
696 auto const seq = env.
seq(
"alice");
720 auto const baseFee = env.
current()->fees().base;
730 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
733 env(deposit::auth(
"bob",
"zelda"));
736 auto const seq = env.
seq(
"alice");
748 auto const baseFee = env.
current()->fees().base;
756 env.
fund(
XRP(5000),
"alice",
"bob");
757 auto const seq = env.
seq(
"alice");
798 env.
fund(
XRP(5000),
"alice",
"bob");
799 auto const seq = env.
seq(
"alice");
834 env.
fund(
XRP(5000),
"alice",
"bob",
"zelda");
835 auto const seq = env.
seq(
"alice");
844 env(deposit::auth(
"alice",
"zelda"));
877 testcase(
"Escrow with CryptoConditions");
884 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
885 auto const seq = env.
seq(
"alice");
957 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
958 auto const seq = env.
seq(
"alice");
973 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
975 auto const seq = env.
seq(
"alice");
995 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
1001 auto const p = v.
data();
1002 auto const s = v.
size();
1004 auto const ts = env.
now() + 1s;
1008 env(
escrow(
"alice",
"carol",
XRP(1000)),
1012 env(
escrow(
"alice",
"carol",
XRP(1000)),
1016 env(
escrow(
"alice",
"carol",
XRP(1000)),
1020 env(
escrow(
"alice",
"carol",
XRP(1000)),
1024 env(
escrow(
"alice",
"carol",
XRP(1000)),
1028 env(
escrow(
"alice",
"carol",
XRP(1000)),
1032 env(
escrow(
"alice",
"carol",
XRP(1000)),
1037 auto const seq = env.
seq(
"alice");
1038 env(
escrow(
"alice",
"carol",
XRP(1000)),
1052 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
1058 auto const cp = cv.
data();
1059 auto const cs = cv.
size();
1065 auto const fp = fv.
data();
1066 auto const fs = fv.
size();
1068 auto const ts = env.
now() + 1s;
1072 env(
escrow(
"alice",
"carol",
XRP(1000)),
1076 env(
escrow(
"alice",
"carol",
XRP(1000)),
1080 env(
escrow(
"alice",
"carol",
XRP(1000)),
1084 env(
escrow(
"alice",
"carol",
XRP(1000)),
1088 env(
escrow(
"alice",
"carol",
XRP(1000)),
1092 env(
escrow(
"alice",
"carol",
XRP(1000)),
1096 env(
escrow(
"alice",
"carol",
XRP(1000)),
1101 auto const seq = env.
seq(
"alice");
1102 env(
escrow(
"alice",
"carol",
XRP(1000)),
1198 env.
fund(
XRP(5000),
"alice",
"bob",
"carol");
1200 env(
escrow(
"alice",
"carol",
XRP(1000)),
1205 auto const seq = env.
seq(
"alice");
1206 env(
escrow(
"alice",
"carol",
XRP(1000)),
1244 env.
fund(
XRP(5000),
"alice",
"bob");
1247 {0xA2, 0x2B, 0x80, 0x20, 0x42, 0x4A, 0x70, 0x49, 0x49,
1248 0x52, 0x92, 0x67, 0xB6, 0x21, 0xB3, 0xD7, 0x91, 0x19,
1249 0xD7, 0x29, 0xB2, 0x38, 0x2C, 0xED, 0x8B, 0x29, 0x6C,
1250 0x3C, 0x02, 0x8F, 0xA9, 0x7D, 0x35, 0x0F, 0x6D, 0x07,
1251 0x81, 0x03, 0x06, 0x34, 0xD2, 0x82, 0x02, 0x03, 0xC8}};
1265 using namespace jtx;
1268 auto const alice =
Account(
"alice");
1269 auto const bruce =
Account(
"bruce");
1270 auto const carol =
Account(
"carol");
1273 testcase(
"Metadata to self");
1276 env.
fund(
XRP(5000), alice, bruce, carol);
1277 auto const aseq = env.
seq(alice);
1278 auto const bseq = env.
seq(bruce);
1315 env(
finish(alice, alice, aseq));
1334 env(
cancel(bruce, bruce, bseq));
1348 testcase(
"Metadata to other");
1351 env.
fund(
XRP(5000), alice, bruce, carol);
1352 auto const aseq = env.
seq(alice);
1353 auto const bseq = env.
seq(bruce);
1394 env(
finish(alice, alice, aseq));
1416 env(
cancel(bruce, bruce, bseq));
1442 testcase(
"Consequences");
1444 using namespace jtx;
1453 auto const jtx = env.
jt(
1465 BEAST_EXPECT(!pf.consequences.isBlocker());
1466 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1467 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(1000));
1471 auto const jtx = env.
jt(
cancel(
"bob",
"alice", 3),
seq(1),
fee(10));
1479 BEAST_EXPECT(!pf.consequences.isBlocker());
1480 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1481 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(0));
1485 auto const jtx = env.
jt(
finish(
"bob",
"alice", 3),
seq(1),
fee(10));
1493 BEAST_EXPECT(!pf.consequences.isBlocker());
1494 BEAST_EXPECT(pf.consequences.fee() ==
drops(10));
1495 BEAST_EXPECT(pf.consequences.potentialSpend() ==
XRP(0));
1502 testcase(
"Escrow with tickets");
1504 using namespace jtx;
1512 env.
fund(
XRP(5000), alice, bob);
1517 env(ticket::create(alice, 1));
1523 env(ticket::create(bob, bobTicketCount));
1535 auto const ts = env.
now() + 97s;
1541 BEAST_EXPECT(env.
seq(alice) == aliceRootSeq);
1547 for (; env.
now() < ts; env.
close())
1549 env(
finish(bob, alice, escrowSeq),
1553 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1557 env(
finish(bob, alice, escrowSeq),
1563 env(
finish(bob, alice, escrowSeq),
1567 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1573 env.
fund(
XRP(5000), alice, bob);
1578 env(ticket::create(alice, 1));
1584 env(ticket::create(bob, bobTicketCount));
1595 auto const ts = env.
now() + 117s;
1602 BEAST_EXPECT(env.
seq(alice) == aliceRootSeq);
1608 for (; env.
now() < ts; env.
close())
1610 env(
cancel(bob, alice, escrowSeq),
1614 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1618 env(
finish(bob, alice, escrowSeq),
1624 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);
1627 env(
cancel(bob, alice, escrowSeq),
1631 BEAST_EXPECT(env.
seq(bob) == bobRootSeq);