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/STArray.h>
39#include <xrpl/protocol/STTx.h>
40#include <xrpl/protocol/TER.h>
41#include <xrpl/protocol/TxFlags.h>
42#include <xrpl/protocol/jss.h>
94 Env env{*
this, features};
99 auto const fee = env.
current()->fees().base;
109 env.require(
Owners(alice, 0));
112 env(
pay(env.master, alice, fee +
drops(1)));
116 env.require(
Owners(alice, 1));
137 env.require(
Owners(alice, 1));
140 env(
pay(env.master, alice, fee +
drops(1)));
144 env.require(
Owners(alice, 1));
158 Env env{*
this, features};
212 {
bogie_, 1}, {
demon_, 1}, {
ghost_, 1}, {
haunt_, 1}, {
jinni_, 1}, {
phase_, 1},
213 {
shade_, 1}, {
spook_, 1}, {spare, 1}, {
acc10_, 1}, {
acc11_, 1}, {
acc12_, 1},
214 {
acc13_, 1}, {
acc14_, 1}, {
acc15_, 1}, {
acc16_, 1}, {
acc17_, 1}, {
acc18_, 1},
215 {
acc19_, 1}, {
acc20_, 1}, {
acc21_, 1}, {
acc22_, 1}, {
acc23_, 1}, {
acc24_, 1},
216 {
acc25_, 1}, {
acc26_, 1}, {
acc27_, 1}, {
acc28_, 1}, {
acc29_, 1}, {
acc30_, 1},
231 Env env{*
this, features};
242 auto const baseFee = env.
current()->fees().base;
246 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
249 aliceSeq = env.
seq(alice);
252 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
254 aliceSeq = env.
seq(alice);
257 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
260 aliceSeq = env.
seq(alice);
264 Rpc(
"invalidTransaction",
"fails local checks: Duplicate Signers not allowed."));
266 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
269 aliceSeq = env.
seq(alice);
272 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
276 aliceSeq = env.
seq(alice);
279 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
282 aliceSeq = env.
seq(alice);
285 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
294 Env env{*
this, features};
315 auto const baseFee = env.
current()->fees().base;
320 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
323 aliceSeq = env.
seq(alice);
327 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
330 aliceSeq = env.
seq(alice);
336 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
339 aliceSeq = env.
seq(alice);
342 Fee((9 * baseFee) - 1),
346 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
355 Env env{*
this, features};
371 Rpc(
"invalidTransaction",
"fails local checks: Unsorted Signers array."));
373 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
382 Env env{*
this, features};
386 env.
fund(
XRP(1000), alice, becky, cheri);
397 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 2);
400 env(
signers(alice, 4, {{becky, 3}, {cheri, 4}}),
Sig(alice));
405 auto const baseFee = env.
current()->fees().base;
406 aliceSeq = env.
seq(alice);
409 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
412 aliceSeq = env.
seq(alice);
415 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
425 aliceSeq = env.
seq(alice);
426 env(
noop(alice),
Msig(becky, cheri),
Fee(3 * baseFee));
428 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
437 Env env{*
this, features};
441 env.
fund(
XRP(1000), alice, becky, cheri);
445 env(
signers(alice, 1, {{becky, 1}, {cheri, 1}}),
Sig(alice));
457 env(
fset(cheri, asfDisableMaster),
Sig(cheri));
461 auto const baseFee = env.
current()->fees().base;
465 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
468 aliceSeq = env.
seq(alice);
471 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
474 aliceSeq = env.
seq(alice);
477 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
479 aliceSeq = env.
seq(alice);
482 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
485 aliceSeq = env.
seq(alice);
488 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
494 testcase(
"Regular Signers Using submit_multisigned");
507 env.
fund(
XRP(1000), alice, becky, cheri);
511 env(
signers(alice, 2, {{becky, 1}, {cheri, 1}}),
Sig(alice));
521 env(
fset(cheri, asfDisableMaster),
Sig(cheri));
524 auto const baseFee = env.
current()->fees().base;
530 jv[jss::tx_json][jss::Account] = alice.human();
531 jv[jss::tx_json][jss::TransactionType] = jss::AccountSet;
532 jv[jss::tx_json][jss::Fee] = (8 * baseFee).jsonClipped();
533 jv[jss::tx_json][jss::Sequence] = env.
seq(alice);
534 jv[jss::tx_json][jss::SigningPubKey] =
"";
538 jv[jss::account] = cheri.
human();
539 jv[jss::key_type] =
"ed25519";
540 jv[jss::passphrase] = cher.
name();
543 jv[jss::account] = becky.
human();
544 jv[jss::secret] = beck.name();
550 aliceSeq = env.
seq(alice);
553 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
554 BEAST_EXPECT(jrr[jss::status] ==
"success");
559 jvTwo[jss::tx_json] = jrr[jss::tx_json];
561 jrr = env.
rpc(
"json",
"sign_for",
to_string(jvTwo))[jss::result];
562 BEAST_EXPECT(jrr[jss::status] ==
"success");
565 jvSubmit[jss::tx_json] = jrr[jss::tx_json];
566 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit))[jss::result];
567 BEAST_EXPECT(jrr[jss::status] ==
"success");
569 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
574 aliceSeq = env.
seq(alice);
576 jvOne[jss::tx_json][jss::SigningPubKey] =
strHex(alice.pk().slice());
578 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
579 BEAST_EXPECT(jrr[jss::status] ==
"error");
580 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
582 jrr[jss::error_message] ==
583 "When multi-signing 'tx_json.SigningPubKey' must be empty.");
588 aliceSeq = env.
seq(alice);
590 jvOne[jss::tx_json][jss::Fee] = -1;
592 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
593 BEAST_EXPECT(jrr[jss::status] ==
"success");
598 jvTwo[jss::tx_json] = jrr[jss::tx_json];
600 jrr = env.
rpc(
"json",
"sign_for",
to_string(jvTwo))[jss::result];
601 BEAST_EXPECT(jrr[jss::status] ==
"success");
604 jvSubmit[jss::tx_json] = jrr[jss::tx_json];
605 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit))[jss::result];
606 BEAST_EXPECT(jrr[jss::status] ==
"error");
607 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
609 jrr[jss::error_message] ==
"Invalid Fee field. Fees must be greater than zero.");
614 aliceSeq = env.
seq(alice);
616 jvOne[jss::tx_json][jss::Fee] = alice[
"USD"](10).value().getFullText();
618 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
619 BEAST_EXPECT(jrr[jss::status] ==
"success");
624 jvTwo[jss::tx_json] = jrr[jss::tx_json];
626 jrr = env.
rpc(
"json",
"sign_for",
to_string(jvTwo))[jss::result];
627 BEAST_EXPECT(jrr[jss::status] ==
"success");
630 jvSubmit[jss::tx_json] = jrr[jss::tx_json];
631 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit))[jss::result];
632 BEAST_EXPECT(jrr[jss::status] ==
"error");
633 BEAST_EXPECT(jrr[jss::error] ==
"internal");
634 BEAST_EXPECT(jrr[jss::error_message] ==
"Internal error.");
639 aliceSeq = env.
seq(alice);
641 jv[jss::account] = cheri.
human();
642 jv[jss::secret] = cheri.
name();
643 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
644 BEAST_EXPECT(jrr[jss::status] ==
"error");
645 BEAST_EXPECT(jrr[jss::error] ==
"masterDisabled");
647 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
653 aliceSeq = env.
seq(alice);
656 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jvOne))[jss::result];
657 BEAST_EXPECT(jrr[jss::status] ==
"success");
662 jvTwo[jss::tx_json] = jrr[jss::tx_json];
663 jvTwo[jss::account] = becky.
human();
664 jvTwo[jss::key_type] =
"ed25519";
665 jvTwo[jss::passphrase] = becky.
name();
666 jrr = env.
rpc(
"json",
"sign_for",
to_string(jvTwo))[jss::result];
667 BEAST_EXPECT(jrr[jss::status] ==
"success");
670 jvSubmit[jss::tx_json] = jrr[jss::tx_json];
671 jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit))[jss::result];
672 BEAST_EXPECT(jrr[jss::status] ==
"success");
674 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
680 jv[jss::tx_json][jss::Account] =
"DEADBEEF";
682 auto jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
683 BEAST_EXPECT(jrr[jss::status] ==
"error");
684 BEAST_EXPECT(jrr[jss::error] ==
"srcActMalformed");
687 jv[jss::tx_json][jss::Account] = jimmy.
human();
688 jrr = env.
rpc(
"json",
"sign_for",
to_string(jv))[jss::result];
689 BEAST_EXPECT(jrr[jss::status] ==
"error");
690 BEAST_EXPECT(jrr[jss::error] ==
"srcActNotFound");
694 aliceSeq = env.
seq(alice);
698 auto jrr = env.
rpc(
"json",
"submit_multisigned",
to_string(jv))[jss::result];
699 BEAST_EXPECT(jrr[jss::status] ==
"error");
700 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
701 BEAST_EXPECT(jrr[jss::error_message] ==
"tx_json.Signers array may not be empty.");
703 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
713 Env env{*
this, features};
718 env.
fund(
XRP(1000), alice, becky, cheri, daria);
724 env(
fset(alice, asfDisableMaster),
Sig(alice));
735 env(
fset(daria, asfDisableMaster),
Sig(daria));
739 env(
signers(alice, 1, {{becky, 1}, {cheri, 1}, {daria, 1}, {
jinni_, 1}}),
Sig(alie));
744 auto const baseFee = env.
current()->fees().base;
748 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
750 aliceSeq = env.
seq(alice);
753 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
755 aliceSeq = env.
seq(alice);
758 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
760 aliceSeq = env.
seq(alice);
763 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
765 aliceSeq = env.
seq(alice);
768 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
771 aliceSeq = env.
seq(alice);
774 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
780 {{becky, 0xFFFF}, {cheri, 0xFFFF}, {daria, 0xFFFF}, {
jinni_, 0xFFFF}}),
785 aliceSeq = env.
seq(alice);
788 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
791 aliceSeq = env.
seq(alice);
794 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
812 aliceSeq = env.
seq(alice);
818 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
821 aliceSeq = env.
seq(alice);
827 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
843 Env env{*
this, features};
872 env(
fset(alice, asfDisableMaster),
Sig(alice));
884 auto const baseFee = env.
current()->fees().base;
897 env(
fset(alice, asfDisableMaster),
Sig(alice));
906 env(
fclear(alice, asfDisableMaster),
Sig(alie));
920 Env env{*
this, features};
942 env(
signers(becky, 1, {{alice, 1}}),
Sig(becky));
957 Env env{*
this, features};
962 auto const usd = gw[
"USD"];
963 env.
fund(
XRP(1000), alice, becky, zelda, gw);
969 env(
fset(alice, asfDisableMaster),
Sig(alice));
977 auto const baseFee = env.
current()->fees().base;
981 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
984 aliceSeq = env.
seq(alice);
987 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
990 aliceSeq = env.
seq(alice);
994 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
997 env(
trust(
"alice", usd(100)),
1005 env(
pay(gw, alice, usd(50)));
1017 aliceSeq = env.
seq(alice);
1020 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1038 using namespace jtx;
1040 Env env{*
this, features};
1043 auto submitSTTx = [&env](
STTx const& stx) {
1045 jvResult[jss::tx_blob] =
strHex(stx.getSerializer().slice());
1054 auto const baseFee = env.
current()->fees().base;
1060 auto const info = submitSTTx(local);
1062 info[jss::result][jss::error_exception] ==
1063 "fails local checks: Empty SigningPubKey.");
1070 auto badSig = local.
getFieldVL(sfTxnSignature);
1074 auto const info = submitSTTx(local);
1076 info[jss::result][jss::error_exception] ==
1077 "fails local checks: Invalid signature.");
1087 auto const info = submitSTTx(local);
1089 info[jss::result][jss::error_exception] ==
1090 "fails local checks: Invalid signature.");
1096 local[sfSigningPubKey] = alice.
pk();
1097 auto const info = submitSTTx(local);
1099 info[jss::result][jss::error_exception] ==
1100 "fails local checks: Cannot both single- and multi-sign.");
1106 local.
sign(alice.
pk(), alice.
sk());
1108 auto const info = submitSTTx(local);
1110 info[jss::result][jss::error_exception] ==
1111 "fails local checks: Cannot both single- and multi-sign.");
1119 auto badSig = signer.
getFieldVL(sfTxnSignature);
1121 signer.setFieldVL(sfTxnSignature, badSig);
1123 auto const info = submitSTTx(local);
1125 info[jss::result][jss::error_exception].asString().contains(
1126 "Invalid signature on account r"));
1133 auto const info = submitSTTx(local);
1135 info[jss::result][jss::error_exception] ==
1136 "fails local checks: Invalid Signers array size.");
1139 JTx const tx = env.
jt(
1178 auto const info = submitSTTx(local);
1180 info[jss::result][jss::error_exception] ==
1181 "fails local checks: Invalid Signers array size.");
1187 auto const info = submitSTTx(local);
1189 info[jss::result][jss::error_exception] ==
1190 "fails local checks: Invalid multisigner.");
1196 auto const info = submitSTTx(local);
1198 info[jss::result][jss::error_exception] ==
1199 "fails local checks: Duplicate Signers not allowed.");
1209 auto const info = submitSTTx(local);
1211 info[jss::result][jss::error_exception] ==
1212 "fails local checks: Unsorted Signers array.");
1221 using namespace jtx;
1222 Env env{*
this, features};
1225 env.
fund(
XRP(1000), alice, becky);
1228 auto const baseFee = env.
current()->fees().base;
1235 testcase(
"Multisigning multisigner");
1242 using namespace jtx;
1243 Env env{*
this, features};
1246 env.
fund(
XRP(1000), alice, becky);
1250 env(
signers(alice, 1, {{becky, 1}}));
1259 auto const baseFee = env.
current()->fees().base;
1264 env(
fset(becky, asfDisableMaster));
1306 using namespace jtx;
1324 auto const baseFee = env.
current()->fees().base;
1326 jvSig1[jss::account] =
bogie_.human();
1327 jvSig1[jss::secret] =
bogie_.name();
1328 jvSig1[jss::tx_json][jss::Account] = alice.
human();
1329 jvSig1[jss::tx_json][jss::Amount] = 10000000;
1330 jvSig1[jss::tx_json][jss::Destination] = env.
master.
human();
1331 jvSig1[jss::tx_json][jss::Fee] = (3 * baseFee).jsonClipped();
1332 jvSig1[jss::tx_json][jss::Sequence] = env.
seq(alice);
1333 jvSig1[jss::tx_json][jss::TransactionType] = jss::Payment;
1336 BEAST_EXPECT(jvSig2[jss::result][jss::status].asString() ==
"success");
1342 jvSig2[jss::result][jss::account] =
ghost_.human();
1343 jvSig2[jss::result][jss::secret] =
ghost_.name();
1345 BEAST_EXPECT(jvSubmit[jss::result][jss::status].asString() ==
"success");
1349 BEAST_EXPECT(hash1 != hash2);
1353 env.
rpc(
"json",
"submit_multisigned",
to_string(jvSubmit[jss::result]));
1354 BEAST_EXPECT(jvResult[jss::result][jss::status].asString() ==
"success");
1355 BEAST_EXPECT(jvResult[jss::result][jss::engine_result].asString() ==
"tesSUCCESS");
1359 BEAST_EXPECT(hash2 == jvResult[jss::result][jss::tx_json][jss::hash].asString());
1365 BEAST_EXPECT(jvTx[jss::result][jss::status].asString() ==
"success");
1366 BEAST_EXPECT(jvTx[jss::result][jss::validated].asString() ==
"true");
1368 jvTx[jss::result][jss::meta][sfTransactionResult.jsonName].
asString() ==
"tesSUCCESS");
1376 using namespace jtx;
1377 Env env{*
this, features};
1392 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1395 auto const baseFee = env.
current()->fees().base;
1399 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1405 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1413 using namespace jtx;
1414 Env env{*
this, features};
1418 uint8_t tag1[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03,
1419 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
1420 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
1422 uint8_t tag2[] =
"hello world some ascii 32b long";
1433 auto const baseFee = env.
current()->fees().base;
1437 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1440 aliceSeq = env.
seq(alice);
1443 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1445 aliceSeq = env.
seq(alice);
1448 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1451 aliceSeq = env.
seq(alice);
1455 Rpc(
"invalidTransaction",
"fails local checks: Duplicate Signers not allowed."));
1457 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1460 aliceSeq = env.
seq(alice);
1463 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1467 aliceSeq = env.
seq(alice);
1470 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1473 aliceSeq = env.
seq(alice);
1476 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
1484 Env env{*
this, features};
1490 bool const enabled = features[fixInvalidTxFlags];
1504 using namespace jtx;
1505 Env env{*
this, features};
1517 BEAST_EXPECT(sle->getFieldArray(sfSignerEntries).size() == 2);
1518 if (features[fixIncludeKeyletFields])
1520 BEAST_EXPECT((*sle)[sfOwner] == alice.
id());
1524 BEAST_EXPECT(!sle->isFieldPresent(sfOwner));
1554 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.