18 #include <ripple/core/ConfigSections.h>
19 #include <ripple/protocol/Feature.h>
20 #include <ripple/protocol/jss.h>
41 testcase (
"No Reserve");
44 Env env {*
this, features};
53 auto const fee = env.current()->fees().base;
54 auto const smallSignersReserve = reserve1 ?
XRP(250) :
XRP(350);
55 env.fund(smallSignersReserve -
drops (1), alice);
57 env.require (
owners (alice, 0));
64 env.require (
owners (alice, 0));
71 env.require (
owners (alice, reserve1 ? 1 : 3));
76 auto const addReserveBigSigners = reserve1 ?
XRP(0) :
XRP(350);
77 env(
pay(env.master, alice, addReserveBigSigners +
fee -
drops(1)));
85 env.require (
owners (alice, reserve1 ? 1 : 3));
92 env.require (
owners (alice, reserve1 ? 1 : 10));
97 env.require (
owners (alice, 0));
102 testcase (
"SignerListSet");
105 Env env {*
this, features};
107 env.fund(
XRP(1000), alice);
144 env.require (
owners (alice, 0));
149 testcase (
"Phantom Signers");
152 Env env {*
this, features};
154 env.fund(
XRP(1000), alice);
163 auto const baseFee = env.current()->fees().base;
167 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
170 aliceSeq = env.seq (alice);
173 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
175 aliceSeq = env.seq (alice);
178 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
181 aliceSeq = env.seq (alice);
184 BEAST_EXPECT(env.seq(alice) == aliceSeq);
187 aliceSeq = env.seq (alice);
191 BEAST_EXPECT(env.seq(alice) == aliceSeq);
195 aliceSeq = env.seq (alice);
198 BEAST_EXPECT(env.seq(alice) == aliceSeq);
201 aliceSeq = env.seq (alice);
204 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
212 Env env {*
this, features};
214 env.fund(
XRP(1000), alice);
218 env(
signers(alice, 1, {{
bogie, 1}, {
demon, 1}, {
ghost, 1}, {
haunt, 1},
224 auto const baseFee = env.current()->fees().base;
229 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
232 aliceSeq = env.seq (alice);
238 BEAST_EXPECT(env.seq(alice) == aliceSeq);
241 aliceSeq = env.seq (alice);
247 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
250 aliceSeq = env.seq (alice);
253 fee((9 * baseFee) - 1),
257 BEAST_EXPECT(env.seq(alice) == aliceSeq);
262 testcase (
"Misordered Signers");
265 Env env {*
this, features};
267 env.fund(
XRP(1000), alice);
277 std::reverse (phantoms.signers.begin(), phantoms.signers.end());
281 BEAST_EXPECT(env.seq(alice) == aliceSeq);
286 testcase (
"Master Signers");
289 Env env {*
this, features};
293 env.fund(
XRP(1000), alice, becky, cheri);
298 env(
regkey (alice, alie));
304 BEAST_EXPECT(env.seq(alice) == aliceSeq + 2);
307 env(
signers(alice, 4, {{becky, 3}, {cheri, 4}}),
sig (alice));
312 auto const baseFee = env.current()->fees().base;
313 aliceSeq = env.seq (alice);
316 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
319 aliceSeq = env.seq (alice);
322 BEAST_EXPECT(env.seq(alice) == aliceSeq);
326 env(
regkey (becky, beck));
328 env(
regkey (cheri, cher));
332 aliceSeq = env.seq (alice);
333 env(
noop(alice),
msig(becky, cheri),
fee(3 * baseFee));
335 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
340 testcase (
"Regular Signers");
343 Env env {*
this, features};
347 env.fund(
XRP(1000), alice, becky, cheri);
351 env(
signers(alice, 1, {{becky, 1}, {cheri, 1}}),
sig (alice));
355 env(
regkey (alice, alie));
357 env(
regkey (becky, beck));
359 env(
regkey (cheri, cher));
367 auto const baseFee = env.current()->fees().base;
371 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
374 aliceSeq = env.seq (alice);
377 BEAST_EXPECT(env.seq(alice) == aliceSeq);
380 aliceSeq = env.seq (alice);
383 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
385 aliceSeq = env.seq (alice);
388 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
391 aliceSeq = env.seq (alice);
392 env(
noop(alice),
fee(3 * baseFee),
395 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
400 testcase (
"Regular Signers Using submit_multisigned");
405 cfg->loadFromString (
"[" SECTION_SIGNING_SUPPORT
"]\ntrue");
411 env.
fund(
XRP(1000), alice, becky, cheri);
415 env(
signers(alice, 2, {{becky, 1}, {cheri, 1}}),
sig (alice));
419 env(
regkey (becky, beck));
421 env(
regkey (cheri, cher));
428 auto const baseFee = env.
current()->fees().base;
434 jv[jss::tx_json][jss::Account] = alice.human();
435 jv[jss::tx_json][jss::TransactionType] = jss::AccountSet;
436 jv[jss::tx_json][jss::Fee] = (8 * baseFee).jsonClipped();
437 jv[jss::tx_json][jss::Sequence] = env.
seq(alice);
438 jv[jss::tx_json][jss::SigningPubKey] =
"";
442 jv[jss::account] = cheri.human();
443 jv[jss::key_type] =
"ed25519";
444 jv[jss::passphrase] = cher.name();
447 jv[jss::account] = becky.human();
448 jv[jss::secret] = beck.name();
454 aliceSeq = env.
seq (alice);
457 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_one))[jss::result];
458 BEAST_EXPECT(jrr[jss::status] ==
"success");
463 jv_two[jss::tx_json] = jrr[jss::tx_json];
465 jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_two))[jss::result];
466 BEAST_EXPECT(jrr[jss::status] ==
"success");
469 jv_submit[jss::tx_json] = jrr[jss::tx_json];
470 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jv_submit))[jss::result];
471 BEAST_EXPECT(jrr[jss::status] ==
"success");
473 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
478 aliceSeq = env.
seq (alice);
480 jv_one[jss::tx_json][jss::SigningPubKey] =
strHex(alice.pk().slice());
482 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_one))[jss::result];
483 BEAST_EXPECT(jrr[jss::status] ==
"error");
484 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
485 BEAST_EXPECT(jrr[jss::error_message] ==
"When multi-signing 'tx_json.SigningPubKey' must be empty.");
490 aliceSeq = env.
seq (alice);
492 jv_one[jss::tx_json][jss::Fee] = -1;
494 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_one))[jss::result];
495 BEAST_EXPECT(jrr[jss::status] ==
"success");
500 jv_two[jss::tx_json] = jrr[jss::tx_json];
502 jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_two))[jss::result];
503 BEAST_EXPECT(jrr[jss::status] ==
"success");
506 jv_submit[jss::tx_json] = jrr[jss::tx_json];
507 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jv_submit))[jss::result];
508 BEAST_EXPECT(jrr[jss::status] ==
"error");
509 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
510 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid Fee field. Fees must be greater than zero.");
515 aliceSeq = env.
seq (alice);
517 jv_one[jss::tx_json][jss::Fee] = alice[
"USD"](10).value().getFullText();
519 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_one))[jss::result];
520 BEAST_EXPECT(jrr[jss::status] ==
"success");
525 jv_two[jss::tx_json] = jrr[jss::tx_json];
527 jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_two))[jss::result];
528 BEAST_EXPECT(jrr[jss::status] ==
"success");
531 jv_submit[jss::tx_json] = jrr[jss::tx_json];
532 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jv_submit))[jss::result];
533 BEAST_EXPECT(jrr[jss::status] ==
"error");
534 BEAST_EXPECT(jrr[jss::error] ==
"internal");
535 BEAST_EXPECT(jrr[jss::error_message] ==
"Internal error.");
540 aliceSeq = env.
seq (alice);
542 jv[jss::account] = cheri.human();
543 jv[jss::secret] = cheri.name();
544 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
545 BEAST_EXPECT(jrr[jss::status] ==
"error");
546 BEAST_EXPECT(jrr[jss::error] ==
"masterDisabled");
548 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
553 aliceSeq = env.
seq (alice);
556 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_one))[jss::result];
557 BEAST_EXPECT(jrr[jss::status] ==
"success");
562 jv_two[jss::tx_json] = jrr[jss::tx_json];
563 jv_two[jss::account] = becky.human();
564 jv_two[jss::key_type] =
"ed25519";
565 jv_two[jss::passphrase] = becky.name();
566 jrr = env.
rpc(
"json",
"sign_for",
to_string(jv_two))[jss::result];
567 BEAST_EXPECT(jrr[jss::status] ==
"success");
570 jv_submit[jss::tx_json] = jrr[jss::tx_json];
571 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jv_submit))[jss::result];
572 BEAST_EXPECT(jrr[jss::status] ==
"success");
574 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
580 jv[jss::tx_json][jss::Account] =
"DEADBEEF";
582 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
583 BEAST_EXPECT(jrr[jss::status] ==
"error");
584 BEAST_EXPECT(jrr[jss::error] ==
"srcActMalformed");
587 jv[jss::tx_json][jss::Account] = jimmy.human();
588 jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
589 BEAST_EXPECT(jrr[jss::status] ==
"error");
590 BEAST_EXPECT(jrr[jss::error] ==
"srcActNotFound");
594 aliceSeq = env.
seq (alice);
598 auto jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jv))[jss::result];
599 BEAST_EXPECT(jrr[jss::status] ==
"error");
600 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
601 BEAST_EXPECT(jrr[jss::error_message] ==
"tx_json.Signers array may not be empty.");
603 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
609 testcase (
"Heterogenious Signers");
612 Env env {*
this, features};
617 env.fund(
XRP(1000), alice, becky, cheri, daria);
622 env(
regkey (alice, alie));
629 env(
regkey (cheri, cher));
633 env(
regkey (daria, dari));
639 {{becky, 1}, {cheri, 1}, {daria, 1}, {
jinni, 1}}),
sig (alie));
644 auto const baseFee = env.current()->fees().base;
648 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
650 aliceSeq = env.seq (alice);
653 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
655 aliceSeq = env.seq (alice);
658 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
660 aliceSeq = env.seq (alice);
663 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
665 aliceSeq = env.seq (alice);
668 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
671 aliceSeq = env.seq (alice);
672 env(
noop(alice),
fee(5 * baseFee),
675 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
678 env(
signers(alice, 0x3FFFC, {{becky, 0xFFFF},
679 {cheri, 0xFFFF}, {daria, 0xFFFF}, {
jinni, 0xFFFF}}),
sig (alie));
683 aliceSeq = env.seq (alice);
684 env(
noop(alice),
fee(9 * baseFee),
687 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
690 aliceSeq = env.seq (alice);
691 env(
noop(alice),
fee(5 * baseFee),
694 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
697 env(
signers(alice, 0x7FFF8, {{becky, 0xFFFF}, {cheri, 0xFFFF},
698 {daria, 0xFFFF}, {
haunt, 0xFFFF}, {
jinni, 0xFFFF},
703 aliceSeq = env.seq (alice);
707 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
710 aliceSeq = env.seq (alice);
714 BEAST_EXPECT(env.seq(alice) == aliceSeq);
719 env.require (
owners (alice, 0));
726 testcase (
"Key Disable");
729 Env env {*
this, features};
731 env.fund(
XRP(1000), alice);
755 env(
regkey (alice, alie));
767 env(
regkey (alice, disabled),
sig(alie));
770 auto const baseFee = env.current()->fees().base;
796 env(
regkey (alice, disabled),
sig(alie));
803 testcase (
"Regular Key");
806 Env env {*
this, features};
808 env.fund(
XRP(1000), alice);
824 env.fund(
XRP(1000), becky);
826 env(
signers(becky, 1, {{alice, 1}}),
sig (becky));
837 testcase (
"Transaction Types");
840 Env env {*
this, features};
845 auto const USD = gw[
"USD"];
846 env.fund(
XRP(1000), alice, becky, zelda, gw);
851 env(
regkey (alice, alie));
858 env.require (
owners (alice, signerListOwners + 0));
861 auto const baseFee = env.current()->fees().
base;
863 env(
pay(alice, env.master,
XRP(1)),
866 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
869 aliceSeq = env.seq (alice);
872 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
875 aliceSeq = env.seq (alice);
879 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
882 env(
trust(
"alice", USD(100)),
885 env.require (
owners (alice, signerListOwners + 1));
888 env(
pay(gw, alice, USD(50)));
890 env.require(
balance(alice, USD(50)));
891 env.require(
balance(gw, alice[
"USD"](-50)));
897 env.require (
owners (alice, signerListOwners + 2));
901 aliceSeq = env.seq (alice);
903 cancelOffer[jss::Account] = alice.human();
904 cancelOffer[jss::OfferSequence] = offerSeq;
905 cancelOffer[jss::TransactionType] = jss::OfferCancel;
906 env (cancelOffer,
seq (aliceSeq),
909 BEAST_EXPECT(env.seq(alice) == aliceSeq + 1);
910 env.require(
owners(alice, signerListOwners + 1));
922 testcase (
"Bad Signature Text");
927 Env env {*
this, features};
930 auto submitSTTx = [&env] (
STTx const& stx)
933 jvResult[jss::tx_blob] =
strHex (stx.getSerializer().slice());
934 return env.rpc (
"json",
"submit",
to_string(jvResult));
938 env.fund(
XRP(1000), alice);
941 auto const baseFee = env.current()->fees().base;
947 auto const info = submitSTTx (local);
948 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
949 "fails local checks: Empty SigningPubKey.");
960 auto const info = submitSTTx (local);
961 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
962 "fails local checks: Invalid signature.");
972 auto const info = submitSTTx (local);
973 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
974 "fails local checks: Invalid signature.");
981 auto const info = submitSTTx (local);
982 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
983 "fails local checks: Cannot both single- and multi-sign.");
989 local.
sign (alice.pk(), alice.sk());
991 auto const info = submitSTTx (local);
992 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
993 "fails local checks: Cannot both single- and multi-sign.");
1005 auto const info = submitSTTx (local);
1006 BEAST_EXPECT(info[jss::result][jss::error_exception].asString().
1007 find (
"Invalid signature on account r") != std::string::npos);
1014 auto const info = submitSTTx (local);
1015 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
1016 "fails local checks: Invalid Signers array size.");
1020 JTx tx = env.jt (
noop(alice),
fee(2 * baseFee),
1024 auto const info = submitSTTx (local);
1025 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
1026 "fails local checks: Invalid Signers array size.");
1032 auto const info = submitSTTx (local);
1033 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
1034 "fails local checks: Invalid multisigner.");
1040 auto const info = submitSTTx (local);
1041 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
1042 "fails local checks: Duplicate Signers not allowed.");
1052 auto const info = submitSTTx (local);
1053 BEAST_EXPECT(info[jss::result][jss::error_exception] ==
1054 "fails local checks: Unsorted Signers array.");
1060 testcase (
"No Multisigners");
1062 using namespace jtx;
1063 Env env {*
this, features};
1066 env.fund(
XRP(1000), alice, becky);
1069 auto const baseFee = env.current()->fees().base;
1075 testcase (
"Multisigning multisigner");
1082 using namespace jtx;
1083 Env env {*
this, features};
1086 env.fund (
XRP(1000), alice, becky);
1090 env (
signers (alice, 1, {{becky, 1}}));
1099 auto const baseFee = env.current()->fees().base;
1100 env (
noop (alice),
msig (becky),
fee (2 * baseFee));
1109 env (
noop (alice),
msig (becky),
fee (2 * baseFee),
1143 testcase (
"sign_for Hash");
1149 using namespace jtx;
1154 cfg->loadFromString (
"[" SECTION_SIGNING_SUPPORT
"]\ntrue");
1165 auto const baseFee = env.
current()->fees().base;
1169 jvSig1[jss::tx_json][jss::Account] = alice.human();
1170 jvSig1[jss::tx_json][jss::Amount] = 10000000;
1171 jvSig1[jss::tx_json][jss::Destination] = env.
master.
human();
1172 jvSig1[jss::tx_json][jss::Fee] = (3 * baseFee).jsonClipped();
1173 jvSig1[jss::tx_json][jss::Sequence] = env.
seq(alice);
1174 jvSig1[jss::tx_json][jss::TransactionType] = jss::Payment;
1177 "json",
"sign_for",
to_string (jvSig1));
1179 jvSig2[jss::result][jss::status].asString() ==
"success");
1183 jvSig2[jss::result][jss::tx_json][jss::hash].
asString();
1186 jvSig2[jss::result][jss::account] =
ghost.
human();
1187 jvSig2[jss::result][jss::secret] =
ghost.
name();
1189 "json",
"sign_for",
to_string (jvSig2[jss::result]));
1191 jvSubmit[jss::result][jss::status].asString() ==
"success");
1195 jvSubmit[jss::result][jss::tx_json][jss::hash].
asString();
1196 BEAST_EXPECT (hash1 != hash2);
1200 "json",
"submit_multisigned",
to_string (jvSubmit[jss::result]));
1202 jvResult[jss::result][jss::status].asString() ==
"success");
1203 BEAST_EXPECT (jvResult[jss::result]
1204 [jss::engine_result].asString() ==
"tesSUCCESS");
1209 hash2 == jvResult[jss::result][jss::tx_json][jss::hash].asString());
1215 BEAST_EXPECT (jvTx[jss::result][jss::status].asString() ==
"success");
1216 BEAST_EXPECT (jvTx[jss::result][jss::validated].asString() ==
"true");
1217 BEAST_EXPECT (jvTx[jss::result][jss::meta]
1223 testcase (
"Amendment Transition");
1229 using namespace jtx;
1236 env.fund (
XRP(1000), alice, becky, cheri, daria);
1245 env.require (
owners (alice, 3));
1246 env.require (
owners (becky, 10));
1258 env.require (
owners (alice, 3));
1259 env.require (
owners (becky, 10));
1260 env.require (
owners (cheri, 1));
1261 env.require (
owners (daria, 1));
1270 env.require (
owners (alice, 1));
1271 env.require (
owners (becky, 0));
1272 env.require (
owners (cheri, 1));
1273 env.require (
owners (daria, 1));
1282 env.require (
owners (alice, 0));
1283 env.require (
owners (becky, 0));
1284 env.require (
owners (cheri, 0));
1285 env.require (
owners (daria, 0));
1310 using namespace jtx;