2#include <test/jtx/Account.h>
3#include <test/jtx/Env.h>
4#include <test/jtx/JTx.h>
5#include <test/jtx/amount.h>
6#include <test/jtx/balance.h>
7#include <test/jtx/envconfig.h>
8#include <test/jtx/fee.h>
9#include <test/jtx/flags.h>
10#include <test/jtx/multisign.h>
11#include <test/jtx/noop.h>
12#include <test/jtx/offer.h>
13#include <test/jtx/owners.h>
14#include <test/jtx/pay.h>
15#include <test/jtx/regkey.h>
16#include <test/jtx/require.h>
17#include <test/jtx/rpc.h>
18#include <test/jtx/seq.h>
19#include <test/jtx/sig.h>
20#include <test/jtx/tags.h>
21#include <test/jtx/ter.h>
22#include <test/jtx/ticket.h>
23#include <test/jtx/trust.h>
24#include <test/jtx/txflags.h>
26#include <xrpld/core/Config.h>
28#include <xrpl/basics/base_uint.h>
29#include <xrpl/basics/strHex.h>
30#include <xrpl/beast/unit_test/suite.h>
31#include <xrpl/config/Constants.h>
32#include <xrpl/json/json_value.h>
33#include <xrpl/json/to_string.h>
34#include <xrpl/protocol/Feature.h>
35#include <xrpl/protocol/Indexes.h>
36#include <xrpl/protocol/KeyType.h>
37#include <xrpl/protocol/SField.h>
38#include <xrpl/protocol/STTx.h>
39#include <xrpl/protocol/TER.h>
40#include <xrpl/protocol/TxFlags.h>
41#include <xrpl/protocol/jss.h>
93 Env env{*
this, features};
98 auto const fee = env.
current()->fees().base;
108 env.require(
Owners(alice, 0));
111 env(
pay(env.master, alice, fee +
drops(1)));
115 env.require(
Owners(alice, 1));
136 env.require(
Owners(alice, 1));
139 env(
pay(env.master, alice, fee +
drops(1)));
143 env.require(
Owners(alice, 1));
157 Env env{*
this, features};
211 {
bogie_, 1}, {
demon_, 1}, {
ghost_, 1}, {
haunt_, 1}, {
jinni_, 1}, {
phase_, 1},
212 {
shade_, 1}, {
spook_, 1}, {spare, 1}, {
acc10_, 1}, {
acc11_, 1}, {
acc12_, 1},
213 {
acc13_, 1}, {
acc14_, 1}, {
acc15_, 1}, {
acc16_, 1}, {
acc17_, 1}, {
acc18_, 1},
214 {
acc19_, 1}, {
acc20_, 1}, {
acc21_, 1}, {
acc22_, 1}, {
acc23_, 1}, {
acc24_, 1},
215 {
acc25_, 1}, {
acc26_, 1}, {
acc27_, 1}, {
acc28_, 1}, {
acc29_, 1}, {
acc30_, 1},
230 Env env{*
this, features};
241 auto const baseFee = env.
current()->fees().base;
245 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
248 aliceSeq = env.
seq(alice);
251 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
253 aliceSeq = env.
seq(alice);
256 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
259 aliceSeq = env.
seq(alice);
263 Rpc(
"invalidTransaction",
"fails local checks: Duplicate Signers not allowed."));
265 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
268 aliceSeq = env.
seq(alice);
271 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
275 aliceSeq = env.
seq(alice);
278 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
281 aliceSeq = env.
seq(alice);
284 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
293 Env env{*
this, features};
314 auto const baseFee = env.
current()->fees().base;
319 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
322 aliceSeq = env.
seq(alice);
326 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
329 aliceSeq = env.
seq(alice);
335 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
338 aliceSeq = env.
seq(alice);
341 Fee((9 * baseFee) - 1),
345 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
354 Env env{*
this, features};
370 Rpc(
"invalidTransaction",
"fails local checks: Unsorted Signers array."));
372 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
381 Env env{*
this, features};
385 env.
fund(
XRP(1000), alice, becky, cheri);
396 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 2);
399 env(
signers(alice, 4, {{becky, 3}, {cheri, 4}}),
Sig(alice));
404 auto const baseFee = env.
current()->fees().base;
405 aliceSeq = env.
seq(alice);
408 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
411 aliceSeq = env.
seq(alice);
414 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
424 aliceSeq = env.
seq(alice);
425 env(
noop(alice),
Msig(becky, cheri),
Fee(3 * baseFee));
427 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
436 Env env{*
this, features};
440 env.
fund(
XRP(1000), alice, becky, cheri);
444 env(
signers(alice, 1, {{becky, 1}, {cheri, 1}}),
Sig(alice));
456 env(
fset(cheri, asfDisableMaster),
Sig(cheri));
460 auto const baseFee = env.
current()->fees().base;
464 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
467 aliceSeq = env.
seq(alice);
470 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
473 aliceSeq = env.
seq(alice);
476 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
478 aliceSeq = env.
seq(alice);
481 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
484 aliceSeq = env.
seq(alice);
487 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
493 testcase(
"Regular Signers Using submit_multisigned");
506 env.
fund(
XRP(1000), alice, becky, cheri);
510 env(
signers(alice, 2, {{becky, 1}, {cheri, 1}}),
Sig(alice));
520 env(
fset(cheri, asfDisableMaster),
Sig(cheri));
523 auto const baseFee = env.
current()->fees().base;
529 jv[jss::tx_json][jss::Account] = alice.human();
530 jv[jss::tx_json][jss::TransactionType] = jss::AccountSet;
531 jv[jss::tx_json][jss::Fee] = (8 * baseFee).jsonClipped();
532 jv[jss::tx_json][jss::Sequence] = env.
seq(alice);
533 jv[jss::tx_json][jss::SigningPubKey] =
"";
537 jv[jss::account] = cheri.
human();
538 jv[jss::key_type] =
"ed25519";
539 jv[jss::passphrase] = cher.
name();
542 jv[jss::account] = becky.
human();
543 jv[jss::secret] = beck.name();
549 aliceSeq = env.
seq(alice);
552 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
553 BEAST_EXPECT(jrr[jss::status] ==
"success");
558 jvTwo[jss::tx_json] = jrr[jss::tx_json];
560 jrr = env.
rpc(
"json",
"sign_for",
to_string(jvTwo))[jss::result];
561 BEAST_EXPECT(jrr[jss::status] ==
"success");
564 jvSubmit[jss::tx_json] = jrr[jss::tx_json];
565 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit))[jss::result];
566 BEAST_EXPECT(jrr[jss::status] ==
"success");
568 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
573 aliceSeq = env.
seq(alice);
575 jvOne[jss::tx_json][jss::SigningPubKey] =
strHex(alice.pk().slice());
577 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
578 BEAST_EXPECT(jrr[jss::status] ==
"error");
579 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
581 jrr[jss::error_message] ==
582 "When multi-signing 'tx_json.SigningPubKey' must be empty.");
587 aliceSeq = env.
seq(alice);
589 jvOne[jss::tx_json][jss::Fee] = -1;
591 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
592 BEAST_EXPECT(jrr[jss::status] ==
"success");
597 jvTwo[jss::tx_json] = jrr[jss::tx_json];
599 jrr = env.
rpc(
"json",
"sign_for",
to_string(jvTwo))[jss::result];
600 BEAST_EXPECT(jrr[jss::status] ==
"success");
603 jvSubmit[jss::tx_json] = jrr[jss::tx_json];
604 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit))[jss::result];
605 BEAST_EXPECT(jrr[jss::status] ==
"error");
606 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
608 jrr[jss::error_message] ==
"Invalid Fee field. Fees must be greater than zero.");
613 aliceSeq = env.
seq(alice);
615 jvOne[jss::tx_json][jss::Fee] = alice[
"USD"](10).value().getFullText();
617 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
618 BEAST_EXPECT(jrr[jss::status] ==
"success");
623 jvTwo[jss::tx_json] = jrr[jss::tx_json];
625 jrr = env.
rpc(
"json",
"sign_for",
to_string(jvTwo))[jss::result];
626 BEAST_EXPECT(jrr[jss::status] ==
"success");
629 jvSubmit[jss::tx_json] = jrr[jss::tx_json];
630 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit))[jss::result];
631 BEAST_EXPECT(jrr[jss::status] ==
"error");
632 BEAST_EXPECT(jrr[jss::error] ==
"internal");
633 BEAST_EXPECT(jrr[jss::error_message] ==
"Internal error.");
638 aliceSeq = env.
seq(alice);
640 jv[jss::account] = cheri.
human();
641 jv[jss::secret] = cheri.
name();
642 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
643 BEAST_EXPECT(jrr[jss::status] ==
"error");
644 BEAST_EXPECT(jrr[jss::error] ==
"masterDisabled");
646 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
652 aliceSeq = env.
seq(alice);
655 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
656 BEAST_EXPECT(jrr[jss::status] ==
"success");
661 jvTwo[jss::tx_json] = jrr[jss::tx_json];
662 jvTwo[jss::account] = becky.
human();
663 jvTwo[jss::key_type] =
"ed25519";
664 jvTwo[jss::passphrase] = becky.
name();
665 jrr = env.
rpc(
"json",
"sign_for",
to_string(jvTwo))[jss::result];
666 BEAST_EXPECT(jrr[jss::status] ==
"success");
669 jvSubmit[jss::tx_json] = jrr[jss::tx_json];
670 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit))[jss::result];
671 BEAST_EXPECT(jrr[jss::status] ==
"success");
673 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
679 jv[jss::tx_json][jss::Account] =
"DEADBEEF";
681 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
682 BEAST_EXPECT(jrr[jss::status] ==
"error");
683 BEAST_EXPECT(jrr[jss::error] ==
"srcActMalformed");
686 jv[jss::tx_json][jss::Account] = jimmy.
human();
687 jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
688 BEAST_EXPECT(jrr[jss::status] ==
"error");
689 BEAST_EXPECT(jrr[jss::error] ==
"srcActNotFound");
693 aliceSeq = env.
seq(alice);
697 auto jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jv))[jss::result];
698 BEAST_EXPECT(jrr[jss::status] ==
"error");
699 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
700 BEAST_EXPECT(jrr[jss::error_message] ==
"tx_json.Signers array may not be empty.");
702 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
712 Env env{*
this, features};
717 env.
fund(
XRP(1000), alice, becky, cheri, daria);
723 env(
fset(alice, asfDisableMaster),
Sig(alice));
734 env(
fset(daria, asfDisableMaster),
Sig(daria));
738 env(
signers(alice, 1, {{becky, 1}, {cheri, 1}, {daria, 1}, {
jinni_, 1}}),
Sig(alie));
743 auto const baseFee = env.
current()->fees().base;
747 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
749 aliceSeq = env.
seq(alice);
752 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
754 aliceSeq = env.
seq(alice);
757 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
759 aliceSeq = env.
seq(alice);
762 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
764 aliceSeq = env.
seq(alice);
767 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
770 aliceSeq = env.
seq(alice);
773 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
779 {{becky, 0xFFFF}, {cheri, 0xFFFF}, {daria, 0xFFFF}, {
jinni_, 0xFFFF}}),
784 aliceSeq = env.
seq(alice);
787 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
790 aliceSeq = env.
seq(alice);
793 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
811 aliceSeq = env.
seq(alice);
817 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
820 aliceSeq = env.
seq(alice);
826 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
842 Env env{*
this, features};
871 env(
fset(alice, asfDisableMaster),
Sig(alice));
883 auto const baseFee = env.
current()->fees().base;
896 env(
fset(alice, asfDisableMaster),
Sig(alice));
905 env(
fclear(alice, asfDisableMaster),
Sig(alie));
919 Env env{*
this, features};
941 env(
signers(becky, 1, {{alice, 1}}),
Sig(becky));
956 Env env{*
this, features};
961 auto const usd = gw[
"USD"];
962 env.
fund(
XRP(1000), alice, becky, zelda, gw);
968 env(
fset(alice, asfDisableMaster),
Sig(alice));
976 auto const baseFee = env.
current()->fees().base;
980 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
983 aliceSeq = env.
seq(alice);
986 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
989 aliceSeq = env.
seq(alice);
993 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
996 env(
trust(
"alice", usd(100)),
1004 env(
pay(gw, alice, usd(50)));
1016 aliceSeq = env.
seq(alice);
1019 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1037 using namespace jtx;
1039 Env env{*
this, features};
1042 auto submitSTTx = [&env](
STTx const& stx) {
1044 jvResult[jss::tx_blob] =
strHex(stx.getSerializer().slice());
1053 auto const baseFee = env.
current()->fees().base;
1059 auto const info = submitSTTx(local);
1061 info[jss::result][jss::error_exception] ==
1062 "fails local checks: Empty SigningPubKey.");
1069 auto badSig = local.
getFieldVL(sfTxnSignature);
1073 auto const info = submitSTTx(local);
1075 info[jss::result][jss::error_exception] ==
1076 "fails local checks: Invalid signature.");
1086 auto const info = submitSTTx(local);
1088 info[jss::result][jss::error_exception] ==
1089 "fails local checks: Invalid signature.");
1095 local[sfSigningPubKey] = alice.
pk();
1096 auto const info = submitSTTx(local);
1098 info[jss::result][jss::error_exception] ==
1099 "fails local checks: Cannot both single- and multi-sign.");
1105 local.
sign(alice.
pk(), alice.
sk());
1107 auto const info = submitSTTx(local);
1109 info[jss::result][jss::error_exception] ==
1110 "fails local checks: Cannot both single- and multi-sign.");
1118 auto badSig = signer.
getFieldVL(sfTxnSignature);
1120 signer.setFieldVL(sfTxnSignature, badSig);
1122 auto const info = submitSTTx(local);
1124 info[jss::result][jss::error_exception].asString().contains(
1125 "Invalid signature on account r"));
1132 auto const info = submitSTTx(local);
1134 info[jss::result][jss::error_exception] ==
1135 "fails local checks: Invalid Signers array size.");
1138 JTx const tx = env.
jt(
1177 auto const info = submitSTTx(local);
1179 info[jss::result][jss::error_exception] ==
1180 "fails local checks: Invalid Signers array size.");
1186 auto const info = submitSTTx(local);
1188 info[jss::result][jss::error_exception] ==
1189 "fails local checks: Invalid multisigner.");
1195 auto const info = submitSTTx(local);
1197 info[jss::result][jss::error_exception] ==
1198 "fails local checks: Duplicate Signers not allowed.");
1208 auto const info = submitSTTx(local);
1210 info[jss::result][jss::error_exception] ==
1211 "fails local checks: Unsorted Signers array.");
1220 using namespace jtx;
1221 Env env{*
this, features};
1224 env.
fund(
XRP(1000), alice, becky);
1227 auto const baseFee = env.
current()->fees().base;
1234 testcase(
"Multisigning multisigner");
1241 using namespace jtx;
1242 Env env{*
this, features};
1245 env.
fund(
XRP(1000), alice, becky);
1249 env(
signers(alice, 1, {{becky, 1}}));
1258 auto const baseFee = env.
current()->fees().base;
1263 env(
fset(becky, asfDisableMaster));
1305 using namespace jtx;
1323 auto const baseFee = env.
current()->fees().base;
1325 jvSig1[jss::account] =
bogie_.human();
1326 jvSig1[jss::secret] =
bogie_.name();
1327 jvSig1[jss::tx_json][jss::Account] = alice.
human();
1328 jvSig1[jss::tx_json][jss::Amount] = 10000000;
1329 jvSig1[jss::tx_json][jss::Destination] = env.
master.
human();
1330 jvSig1[jss::tx_json][jss::Fee] = (3 * baseFee).jsonClipped();
1331 jvSig1[jss::tx_json][jss::Sequence] = env.
seq(alice);
1332 jvSig1[jss::tx_json][jss::TransactionType] = jss::Payment;
1335 BEAST_EXPECT(jvSig2[jss::result][jss::status].asString() ==
"success");
1341 jvSig2[jss::result][jss::account] =
ghost_.human();
1342 jvSig2[jss::result][jss::secret] =
ghost_.name();
1344 BEAST_EXPECT(jvSubmit[jss::result][jss::status].asString() ==
"success");
1348 BEAST_EXPECT(hash1 != hash2);
1352 env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit[jss::result]));
1353 BEAST_EXPECT(jvResult[jss::result][jss::status].asString() ==
"success");
1354 BEAST_EXPECT(jvResult[jss::result][jss::engine_result].asString() ==
"tesSUCCESS");
1358 BEAST_EXPECT(hash2 == jvResult[jss::result][jss::tx_json][jss::hash].asString());
1364 BEAST_EXPECT(jvTx[jss::result][jss::status].asString() ==
"success");
1365 BEAST_EXPECT(jvTx[jss::result][jss::validated].asString() ==
"true");
1367 jvTx[jss::result][jss::meta][sfTransactionResult.jsonName].
asString() ==
"tesSUCCESS");
1375 using namespace jtx;
1376 Env env{*
this, features};
1391 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1394 auto const baseFee = env.
current()->fees().base;
1398 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1404 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1412 using namespace jtx;
1413 Env env{*
this, features};
1417 uint8_t tag1[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03,
1418 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
1419 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
1421 uint8_t tag2[] =
"hello world some ascii 32b long";
1432 auto const baseFee = env.
current()->fees().base;
1436 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1439 aliceSeq = env.
seq(alice);
1442 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1444 aliceSeq = env.
seq(alice);
1447 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1450 aliceSeq = env.
seq(alice);
1454 Rpc(
"invalidTransaction",
"fails local checks: Duplicate Signers not allowed."));
1456 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1459 aliceSeq = env.
seq(alice);
1462 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1466 aliceSeq = env.
seq(alice);
1469 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1472 aliceSeq = env.
seq(alice);
1475 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1483 Env env{*
this, features};
1489 bool const enabled = features[fixInvalidTxFlags];
1503 using namespace jtx;
1504 Env env{*
this, features};
1516 BEAST_EXPECT(sle->getFieldArray(sfSignerEntries).size() == 2);
1517 if (features[fixIncludeKeyletFields])
1519 BEAST_EXPECT((*sle)[sfOwner] == alice.
id());
1523 BEAST_EXPECT(!sle->isFieldPresent(sfOwner));
1553 using namespace jtx;
TestcaseT testcase
Memberspace for declaring test cases.
std::string asString() const
Returns the unquoted string value.
static BaseUInt fromVoid(void const *data)
Blob getFieldVL(SField const &field) const
std::uint32_t getFieldU32(SField const &field) const
void setFieldVL(SField const &field, Blob const &)
void setFieldU32(SField const &field, std::uint32_t)
STArray & peekFieldArray(SField const &field)
void sign(PublicKey const &publicKey, SecretKey const &secretKey, std::optional< std::reference_wrapper< SField const > > signatureTarget={})
void testMultisigningMultisigner(FeatureBitset features)
jtx::Account const acc12_
jtx::Account const acc21_
void testRegKey(FeatureBitset features)
jtx::Account const acc32_
void testAll(FeatureBitset features)
jtx::Account const jinni_
jtx::Account const acc17_
void testPhantomSigners(FeatureBitset features)
jtx::Account const acc25_
jtx::Account const acc15_
void testBadSignatureText(FeatureBitset features)
jtx::Account const acc26_
jtx::Account const acc16_
jtx::Account const haunt_
void testSignForHash(FeatureBitset features)
void testTxTypes(FeatureBitset features)
jtx::Account const demon_
jtx::Account const acc18_
jtx::Account const ghost_
void testRegularSigners(FeatureBitset features)
void testKeyDisable(FeatureBitset features)
jtx::Account const acc23_
jtx::Account const acc29_
void testMisorderedSigners(FeatureBitset features)
jtx::Account const shade_
void testSignersWithTags(FeatureBitset features)
void testSignerListSet(FeatureBitset features)
jtx::Account const acc11_
void testSignerListSetFlags(FeatureBitset features)
jtx::Account const acc28_
jtx::Account const acc30_
void testRegularSignersUsingSubmitMulti(FeatureBitset features)
jtx::Account const acc33_
jtx::Account const acc24_
void testSignerListObject(FeatureBitset features)
jtx::Account const spook_
void testHeterogeneousSigners(FeatureBitset features)
jtx::Account const acc27_
void testMasterSigners(FeatureBitset features)
jtx::Account const acc13_
jtx::Account const acc31_
jtx::Account const acc14_
void testFee(FeatureBitset features)
void run() override
Runs the suite.
jtx::Account const acc10_
void testNoMultiSigners(FeatureBitset features)
jtx::Account const bogie_
jtx::Account const acc19_
jtx::Account const acc20_
jtx::Account const acc22_
void testNoReserve(FeatureBitset features)
jtx::Account const phase_
void testSignersWithTickets(FeatureBitset features)
Immutable cryptographic account descriptor.
SecretKey const & sk() const
Return the secret key.
std::string const & human() const
Returns the human readable public key.
std::string const & name() const
Return the name.
PublicKey const & pk() const
Return the public key.
AccountID id() const
Returns the Account ID.
A transaction testing environment.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
SLE::const_pointer le(Account const &account) const
Return an account root.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
JTx jt(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
void require(Args const &... args)
Check a set of requirements.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Set a multisignature on a JTx.
std::vector< Reg > signers
Match the number of items in the account's owner directory.
Check a set of conditions.
Set the expected result code for a JTx The test will fail if the code doesn't match.
Set the regular signature on a JTx.
Set the expected result code for a JTx The test will fail if the code doesn't match.
Set a ticket sequence on a JTx.
@ Array
array value (ordered list)
Keylet signerList(AccountID const &account) noexcept
A SignerList.
json::Value create(Account const &account, std::uint32_t count)
Create one of more tickets.
static DisabledT const kDisabled
json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
json::Value regkey(Account const &account, DisabledT)
Disable the regular key.
json::Value offerCancel(Account const &account, std::uint32_t offerSeq)
Cancel an offer.
XrpT const XRP
Converts to XRP Issue or STAmount.
json::Value noop(Account const &account)
The null transaction.
OwnerCount< ltRIPPLE_STATE > lines
Match the number of trust lines in the account's owner directory.
json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
FeatureBitset testableAmendments()
json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
json::Value signers(Account const &account, std::uint32_t quorum, std::vector< Signer > const &v)
OwnerCount< ltTICKET > tickets
Match the number of tickets on the account.
json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
BEAST_DEFINE_TESTSUITE(AMMClawback, app, xrpl)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string strHex(FwdIt begin, FwdIt end)
std::string to_string(BaseUInt< Bits, Tag > const &a)
TERSubset< CanCvtToTER > TER
@ tecINSUFFICIENT_RESERVE
std::vector< unsigned char > Blob
Storage for linear binary data.
static constexpr auto kSigningSupport
Execution context for applying a JSON transaction.
std::shared_ptr< STTx const > stx
Set the sequence number on a JTx.