19#include <test/jtx/CaptureLogs.h>
20#include <test/jtx/delegate.h>
22#include <xrpl/protocol/Feature.h>
23#include <xrpl/protocol/Permissions.h>
32 testcase(
"test featurePermissionDelegation not enabled");
39 env.fund(
XRP(1000000), gw, alice, bob);
52 testcase(
"test valid request creating, updating, deleting permissions");
58 env.
fund(
XRP(100000), gw, alice);
66 BEAST_EXPECT(entry[jss::result][jss::error] ==
"entryNotFound");
79 auto comparePermissions =
85 !jle[jss::result].isMember(jss::error) &&
86 jle[jss::result].isMember(jss::node));
88 jle[jss::result][jss::node][
"LedgerEntryType"] ==
91 jle[jss::result][jss::node][jss::Account] ==
94 jle[jss::result][jss::node][sfAuthorize.jsonName] ==
97 auto const& jPermissions =
98 jle[jss::result][jss::node][sfPermissions.jsonName];
100 for (
auto const& permission : permissions)
103 jPermissions[i][sfPermission.jsonName]
104 [sfPermissionValue.jsonName] == permission);
115 "Payment",
"AMMCreate",
"AMMDeposit",
"AMMWithdraw"};
130 BEAST_EXPECT(jle[jss::result][jss::error] ==
"entryNotFound");
139 BEAST_EXPECT(response[jss::result][jss::error] ==
"entryNotFound");
145 testcase(
"test invalid DelegateSet");
148 Env env(*
this, features);
152 env.
fund(
XRP(100000), gw, alice, bob);
183 jv[jss::TransactionType] = jss::DelegateSet;
184 jv[jss::Account] = gw.human();
185 jv[sfAuthorize.jsonName] = alice.human();
188 permissionValue[sfPermissionValue.jsonName] =
"Payment";
190 permissionObj[sfPermission.jsonName] = permissionValue;
191 permissionsJson.
append(permissionObj);
192 jv[sfPermissions.jsonName] = permissionsJson;
193 jv[sfFee.jsonName] = -1;
206 "TrustlineAuthorize",
208 "TrustlineAuthorize"}),
249 drops(env.
current()->fees().accountReserve(1)), bob, carol);
303 env.
fund(
XRP(10000), alice, carol);
312 auto aliceBalance = env.
balance(alice);
313 auto bobBalance = env.
balance(bob);
314 auto carolBalance = env.
balance(carol);
316 env(
pay(alice, carol,
XRP(100)),
321 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
322 BEAST_EXPECT(env.
balance(bob) == bobBalance);
323 BEAST_EXPECT(env.
balance(carol) == carolBalance);
331 auto aliceBalance = env.
balance(alice);
332 auto bobBalance = env.
balance(bob);
333 auto carolBalance = env.
balance(carol);
335 auto const sendAmt =
XRP(100);
336 auto const feeAmt =
XRP(10);
339 BEAST_EXPECT(env.
balance(alice) == aliceBalance - sendAmt);
340 BEAST_EXPECT(env.
balance(bob) == bobBalance - feeAmt);
341 BEAST_EXPECT(env.
balance(carol) == carolBalance + sendAmt);
346 auto aliceBalance = env.
balance(alice);
347 auto bobBalance = env.
balance(bob);
348 auto carolBalance = env.
balance(carol);
350 env(
pay(alice, carol,
XRP(100)),
355 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
356 BEAST_EXPECT(env.
balance(bob) == bobBalance);
357 BEAST_EXPECT(env.
balance(carol) == carolBalance);
363 auto aliceBalance = env.
balance(alice);
364 auto bobBalance = env.
balance(bob);
365 auto carolBalance = env.
balance(carol);
366 auto const feeAmt =
XRP(10);
368 env(
pay(alice, carol,
XRP(20000)),
373 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
374 BEAST_EXPECT(env.
balance(bob) == bobBalance - feeAmt);
375 BEAST_EXPECT(env.
balance(carol) == carolBalance);
389 env.
fund(
XRP(10000), alice, bob, carol);
392 auto aliceSeq = env.
seq(alice);
393 auto bobSeq = env.
seq(bob);
397 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
398 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
399 aliceSeq = env.
seq(alice);
400 bobSeq = env.
seq(bob);
402 for (
auto i = 0; i < 20; ++i)
407 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
408 BEAST_EXPECT(env.
seq(bob) == bobSeq);
409 aliceSeq = env.
seq(alice);
413 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
414 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
415 bobSeq = env.
seq(bob);
420 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
421 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
422 bobSeq = env.
seq(bob);
426 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
427 BEAST_EXPECT(env.
seq(bob) == bobSeq);
428 aliceSeq = env.
seq(alice);
441 env.
fund(
XRP(100000), alice, bob);
452 auto const aliceBalance = env.
balance(alice);
453 auto const bobBalance = env.
balance(bob);
456 auto const deleteFee =
drops(env.
current()->fees().increment);
462 BEAST_EXPECT(env.
balance(bob) == bobBalance + aliceBalance - deleteFee);
471 testcase(
"test delegate transaction");
547 auto const USD = gw[
"USD"];
548 auto const EUR = gw2[
"EUR"];
553 env.
trust(USD(200), alice);
554 env.
trust(EUR(400), gw);
564 env(
pay(gw, alice, USD(50)),
577 env(
pay(gw, alice, USD(50)),
594 env(
pay(gw, alice,
XRP(50)),
608 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
618 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
636 env(
pay(gw2, gw, EUR(200)));
660 auto const USD = gw[
"USD"];
665 env.
trust(USD(200), alice);
682 env(
pay(gw, alice, USD(50)),
703 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
709 Env env(*
this, features);
714 auto const USD = gw[
"USD"];
716 env.
fund(
XRP(10000), alice, bob, carol, gw);
718 env.
trust(USD(50000), alice);
719 env.
trust(USD(50000), bob);
720 env.
trust(USD(50000), carol);
721 env(
pay(gw, alice, USD(10000)));
722 env(
pay(gw, bob, USD(10000)));
723 env(
pay(gw, carol, USD(10000)));
726 auto const result = features[fixDelegateV1_1]
729 auto const offerCount = features[fixDelegateV1_1] ? 1 : 0;
733 env(
offer(carol,
XRP(100), USD(501)));
741 env(
pay(gw, alice, USD(5000)),
756 env(
offer(bob,
XRP(100), USD(501)));
764 env(
pay(alice, gw, USD(5000)),
786 MPTTester mpt(env, gw, {.holders = {alice, bob}});
790 mpt.authorize({.account = alice});
791 mpt.authorize({.account = bob});
793 auto const MPT = mpt[
"MPT"];
794 env(
pay(gw, alice,
MPT(500)));
795 env(
pay(gw, bob,
MPT(500)));
805 if (!features[fixDelegateV1_1])
808 env(
pay(gw, alice,
MPT(50)),
816 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
826 if (!features[fixDelegateV1_1])
829 env(
pay(alice, gw,
MPT(50)),
837 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
846 alice, bob, {
"PaymentBurn",
"PaymentMint",
"Payment"}));
850 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
853 BEAST_EXPECT(env.
balance(alice,
MPT) == aliceMPT -
MPT(100));
862 testcase(
"test TrustSet granular permissions");
871 env.
fund(
XRP(10000), gw, alice, bob);
879 env(
trust(alice, gw[
"USD"](50)),
885 env(
trust(alice, gw[
"USD"](50)));
933 gw, bob, {
"TrustlineAuthorize",
"TrustlineFreeze"}));
938 gw, bob, {
"TrustlineAuthorize",
"TrustlineUnfreeze"}));
951 env(
trust(alice, gw[
"USD"](100)),
954 env(
trust(gw, alice[
"USD"](100)),
959 auto tx =
trust(alice, gw[
"USD"](50));
960 tx[
"QualityIn"] =
"1000";
962 auto tx2 =
trust(alice, gw[
"USD"](50));
963 tx2[
"QualityOut"] =
"1000";
965 auto tx3 =
trust(gw, alice[
"USD"](50));
966 tx3[
"QualityIn"] =
"1000";
968 auto tx4 =
trust(gw, alice[
"USD"](50));
969 tx4[
"QualityOut"] =
"1000";
975 auto tx5 =
trust(gw, alice[
"USD"](50));
976 tx5[
"QualityOut"] =
"1000";
978 auto tx6 =
trust(alice, gw[
"USD"](50));
979 tx6[
"QualityOut"] =
"1000";
992 env.
fund(
XRP(10000), gw, alice, bob);
997 env(
trust(alice, gw[
"USD"](50)),
1001 alice, bob, {
"TrustlineUnfreeze",
"NFTokenCreateOffer"}));
1004 env(
trust(alice, gw[
"USD"](50)),
1012 {
"TrustlineUnfreeze",
1013 "NFTokenCreateOffer",
1015 "AccountTransferRateSet"}));
1023 {
"TrustlineUnfreeze",
1024 "NFTokenCreateOffer",
1026 "AccountTransferRateSet"}));
1052 env.
fund(
XRP(10000), gw, alice, bob);
1055 env(
trust(alice, gw[
"USD"](50)));
1069 testcase(
"test AccountSet granular permissions");
1070 using namespace jtx;
1077 auto const alice =
Account{
"alice"};
1078 auto const bob =
Account{
"bob"};
1079 env.
fund(
XRP(10000), alice, bob);
1090 auto jt =
noop(alice);
1092 jt[sfDelegate] = bob.human();
1097 alice, bob, {
"TrustlineUnfreeze",
"AccountEmailHashSet"}));
1112 BEAST_EXPECT(!env.
le(alice)->isFieldPresent(sfDomain));
1115 std::string const failDomain =
"fail_domain_update";
1117 jt[sfDomain] =
strHex(failDomain);
1125 std::string const mh(
"5F31A79367DC3137FADA860C05742EE6");
1126 jt[sfEmailHash] = mh;
1131 alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet"}));
1134 BEAST_EXPECT(
to_string((*env.
le(alice))[sfEmailHash]) == mh);
1139 jt[sfMessageKey] =
strHex(rkp.first.slice());
1146 {
"AccountDomainSet",
1147 "AccountEmailHashSet",
1148 "AccountMessageKeySet"}));
1154 strHex((*env.
le(alice))[sfMessageKey]) ==
1155 strHex(rkp.first.slice()));
1156 jt[sfMessageKey] =
"";
1158 BEAST_EXPECT(!env.
le(alice)->isFieldPresent(sfMessageKey));
1161 env(
rate(alice, 2.0),
1169 {
"AccountDomainSet",
1170 "AccountEmailHashSet",
1171 "AccountMessageKeySet",
1172 "AccountTransferRateSet"}));
1174 auto jtRate =
rate(alice, 2.0);
1175 jtRate[sfDelegate] = bob.human();
1177 BEAST_EXPECT((*env.
le(alice))[sfTransferRate] == 2000000000);
1187 {
"AccountDomainSet",
1188 "AccountEmailHashSet",
1189 "AccountMessageKeySet",
1190 "AccountTransferRateSet",
1191 "AccountTickSizeSet"}));
1194 BEAST_EXPECT((*env.
le(alice))[sfTickSize] == 8);
1221 {
"AccountDomainSet",
1222 "AccountEmailHashSet",
1223 "AccountMessageKeySet"}));
1228 "9633EC8AF54F16B5286DB1D7B519EF49EEFC050C0C8AC4384F1D88ACD1BFDF"
1230 auto jv2 =
noop(alice);
1232 jv2[sfDelegate] = bob.human();
1233 jv2[sfWalletLocator] = locator;
1240 auto const alice =
Account{
"alice"};
1241 auto const bob =
Account{
"bob"};
1242 env.
fund(
XRP(10000), alice, bob);
1247 env(
fset(alice, flag),
1251 env(
fset(alice, flag));
1268 {
"AccountDomainSet",
1269 "AccountEmailHashSet",
1270 "AccountMessageKeySet"}));
1289 BEAST_EXPECT(env.
le(alice)->isFieldPresent(sfAccountTxnID));
1296 jt[sfDelegate] = bob.human();
1297 jt[sfNFTokenMinter] = bob.human();
1304 {
"AccountDomainSet",
1305 "AccountEmailHashSet",
1306 "AccountMessageKeySet"}));
1325 env(
regkey(bob, bobKey));
1338 env.
fund(
XRP(10000), alice, bob);
1342 alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet"}));
1346 auto jt =
noop(alice);
1348 jt[sfDelegate] = bob.human();
1359 testcase(
"test MPTokenIssuanceSet granular");
1360 using namespace jtx;
1367 env.
fund(
XRP(100000), alice, bob);
1394 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1403 alice, bob, {
"MPTokenIssuanceLock",
"MPTokenIssuanceUnlock"}));
1405 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1406 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1415 env.
fund(
XRP(100000), alice, bob);
1426 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1439 {
"NFTokenMint",
"MPTokenIssuanceLock",
"NFTokenBurn"}));
1453 "MPTokenIssuanceLock",
1455 "MPTokenIssuanceSet"}));
1456 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1458 mpt.set({.account = alice, .flags =
tfMPTLock});
1459 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1460 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1468 env.
fund(
XRP(100000), alice, bob);
1490 using namespace jtx;
1496 env.
fund(
XRP(100000), alice, bob, carol);
1502 auto aliceBalance = env.
balance(alice);
1503 auto bobBalance = env.
balance(bob);
1504 auto carolBalance = env.
balance(carol);
1506 env(
pay(alice, carol,
XRP(100)),
1511 BEAST_EXPECT(env.
balance(alice) == aliceBalance -
XRP(100));
1512 BEAST_EXPECT(env.
balance(bob) == bobBalance -
XRP(10));
1513 BEAST_EXPECT(env.
balance(carol) == carolBalance +
XRP(100));
1519 testcase(
"test single sign with bad secret");
1520 using namespace jtx;
1526 env.
fund(
XRP(100000), alice, bob, carol);
1532 auto aliceBalance = env.
balance(alice);
1533 auto bobBalance = env.
balance(bob);
1534 auto carolBalance = env.
balance(carol);
1536 env(
pay(alice, carol,
XRP(100)),
1542 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1543 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1544 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1551 using namespace jtx;
1559 env.
fund(
XRP(100000), alice, bob, carol, daria, edward);
1562 env(
signers(bob, 2, {{daria, 1}, {edward, 1}}));
1568 auto aliceBalance = env.
balance(alice);
1569 auto bobBalance = env.
balance(bob);
1570 auto carolBalance = env.
balance(carol);
1571 auto dariaBalance = env.
balance(daria);
1572 auto edwardBalance = env.
balance(edward);
1574 env(
pay(alice, carol,
XRP(100)),
1577 msig(daria, edward));
1579 BEAST_EXPECT(env.
balance(alice) == aliceBalance -
XRP(100));
1580 BEAST_EXPECT(env.
balance(bob) == bobBalance -
XRP(10));
1581 BEAST_EXPECT(env.
balance(carol) == carolBalance +
XRP(100));
1582 BEAST_EXPECT(env.
balance(daria) == dariaBalance);
1583 BEAST_EXPECT(env.
balance(edward) == edwardBalance);
1589 testcase(
"test multi sign which does not meet quorum");
1590 using namespace jtx;
1599 env.
fund(
XRP(100000), alice, bob, carol, daria, edward, fred);
1602 env(
signers(bob, 3, {{daria, 1}, {edward, 1}, {fred, 1}}));
1608 auto aliceBalance = env.
balance(alice);
1609 auto bobBalance = env.
balance(bob);
1610 auto carolBalance = env.
balance(carol);
1611 auto dariaBalance = env.
balance(daria);
1612 auto edwardBalance = env.
balance(edward);
1614 env(
pay(alice, carol,
XRP(100)),
1617 msig(daria, edward),
1620 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1621 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1622 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1623 BEAST_EXPECT(env.
balance(daria) == dariaBalance);
1624 BEAST_EXPECT(env.
balance(edward) == edwardBalance);
1631 using namespace jtx;
1633 Env env(*
this, features);
1637 env.
fund(
XRP(100000), alice, bob);
1640 auto buildRequest = [&](
auto value) ->
Json::Value {
1642 jv[jss::TransactionType] = jss::DelegateSet;
1643 jv[jss::Account] = alice.human();
1644 jv[sfAuthorize.jsonName] = bob.human();
1648 permissionValue[sfPermissionValue.jsonName] = value;
1650 permissionObj[sfPermission.jsonName] = permissionValue;
1651 permissionsJson.
append(permissionObj);
1652 jv[sfPermissions.jsonName] = permissionsJson;
1659 for (
auto value : {0, 100000, 54321})
1661 auto jv = buildRequest(value);
1662 if (!features[fixDelegateV1_1])
1672 testcase(
"test delegate disabled tx");
1673 using namespace jtx;
1680 {
"TicketCreate", featureTicketBatch},
1681 {
"CheckCreate", featureChecks},
1682 {
"CheckCash", featureChecks},
1683 {
"CheckCancel", featureChecks},
1684 {
"DepositPreauth", featureDepositPreauth},
1685 {
"Clawback", featureClawback},
1686 {
"AMMClawback", featureAMMClawback},
1687 {
"AMMCreate", featureAMM},
1688 {
"AMMDeposit", featureAMM},
1689 {
"AMMWithdraw", featureAMM},
1690 {
"AMMVote", featureAMM},
1691 {
"AMMBid", featureAMM},
1692 {
"AMMDelete", featureAMM},
1693 {
"XChainCreateClaimID", featureXChainBridge},
1694 {
"XChainCommit", featureXChainBridge},
1695 {
"XChainClaim", featureXChainBridge},
1696 {
"XChainAccountCreateCommit", featureXChainBridge},
1697 {
"XChainAddClaimAttestation", featureXChainBridge},
1698 {
"XChainAddAccountCreateAttestation", featureXChainBridge},
1699 {
"XChainModifyBridge", featureXChainBridge},
1700 {
"XChainCreateBridge", featureXChainBridge},
1701 {
"DIDSet", featureDID},
1702 {
"DIDDelete", featureDID},
1703 {
"OracleSet", featurePriceOracle},
1704 {
"OracleDelete", featurePriceOracle},
1705 {
"LedgerStateFix", fixNFTokenPageLinks},
1706 {
"MPTokenIssuanceCreate", featureMPTokensV1},
1707 {
"MPTokenIssuanceDestroy", featureMPTokensV1},
1708 {
"MPTokenIssuanceSet", featureMPTokensV1},
1709 {
"MPTokenAuthorize", featureMPTokensV1},
1710 {
"CredentialCreate", featureCredentials},
1711 {
"CredentialAccept", featureCredentials},
1712 {
"CredentialDelete", featureCredentials},
1713 {
"NFTokenModify", featureDynamicNFT},
1714 {
"PermissionedDomainSet", featurePermissionedDomains},
1715 {
"PermissionedDomainDelete", featurePermissionedDomains},
1716 {
"VaultCreate", featureSingleAssetVault},
1717 {
"VaultSet", featureSingleAssetVault},
1718 {
"VaultDelete", featureSingleAssetVault},
1719 {
"VaultDeposit", featureSingleAssetVault},
1720 {
"VaultWithdraw", featureSingleAssetVault},
1721 {
"VaultClawback", featureSingleAssetVault}};
1728 BEAST_EXPECT(txRequiredFeatures.contains(tx));
1730 Env env(*
this, features - txRequiredFeatures[tx]);
1734 env.
fund(
XRP(100000), alice, bob);
1737 if (!features[fixDelegateV1_1])
1743 for (
auto const& tx : txRequiredFeatures)
1744 txAmendmentDisabled(features, tx.first);
1750 auto txAmendmentEnabled = [&](
std::string const& tx) {
1751 Env env(*
this, features);
1755 env.
fund(
XRP(100000), alice, bob);
1761 for (
auto const& tx : txRequiredFeatures)
1762 txAmendmentEnabled(tx.first);
1774 features - featureNonFungibleTokensV1 -
1775 featureNonFungibleTokensV1_1);
1779 env.
fund(
XRP(100000), alice, bob);
1782 for (
auto const tx :
1785 "NFTokenCreateOffer",
1786 "NFTokenCancelOffer",
1787 "NFTokenAcceptOffer"})
1789 if (!features[fixDelegateV1_1])
1801 for (
auto const feature :
1802 {featureNonFungibleTokensV1, featureNonFungibleTokensV1_1})
1804 Env env(*
this, features - feature);
1807 env.
fund(
XRP(100000), alice, bob);
1810 for (
auto const tx :
1813 "NFTokenCreateOffer",
1814 "NFTokenCancelOffer",
1815 "NFTokenAcceptOffer"})
1850BEAST_DEFINE_TESTSUITE(Delegate, app,
ripple);
Value & append(Value const &value)
Append value to array at the end.
testcase_t testcase
Memberspace for declaring test cases.
void testFeatureDisabled()
void testTrustSetGranular()
void run() override
Runs the suite.
void testMPTokenIssuanceSetGranular()
void testSingleSignBadSecret()
void testPermissionValue(FeatureBitset features)
void testDelegateTransaction()
void testTxReqireFeatures(FeatureBitset features)
void testInvalidRequest(FeatureBitset features)
void testMultiSignQuorumNotMet()
void testPaymentGranular(FeatureBitset features)
void testAccountSetGranular()
Immutable cryptographic account descriptor.
A transaction testing environment.
std::shared_ptr< ReadView const > closed()
Returns the last closed ledger.
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
void require(Args const &... args)
Check a set of requirements.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
PrettyAmount balance(Account const &account) const
Returns the XRP balance on an account.
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
void create(MPTCreate const &arg=MPTCreate{})
Converts to MPT Issue or STAmount.
Sets the optional URI on a DIDSet.
Set a multisignature on a JTx.
Sets the SendMax on a JTx.
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.
@ arrayValue
array value (ordered list)
Keylet delegate(AccountID const &account, AccountID const &authorizedAccount) noexcept
A keylet for Delegate object.
Keylet account(AccountID const &id) noexcept
AccountID root.
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
Json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
Json::Value entry(jtx::Env &env, jtx::Account const &account, jtx::Account const &authorize)
Json::Value set(jtx::Account const &account, jtx::Account const &authorize, std::vector< std::string > const &permissions)
Json::Value set(jtx::Account const &account)
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
Json::Value regkey(Account const &account, disabled_t)
Disable the regular key.
Json::Value signers(Account const &account, std::uint32_t quorum, std::vector< signer > const &v)
bool expectOffers(Env &env, AccountID const &account, std::uint16_t size, std::vector< Amounts > const &toMatch)
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
FeatureBitset testable_amendments()
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
Json::Value acctdelete(Account const &account, Account const &dest)
Delete account.
XRP_t const XRP
Converts to XRP Issue or STAmount.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t asfGlobalFreeze
constexpr std::uint32_t asfDepositAuth
constexpr std::uint32_t asfDisallowIncomingNFTokenOffer
constexpr std::uint32_t tfSetDeepFreeze
constexpr std::uint32_t const tfMPTCanTransfer
constexpr std::uint32_t asfRequireDest
constexpr std::uint32_t const tfMPTUnlock
constexpr std::uint32_t asfAuthorizedNFTokenMinter
constexpr std::uint32_t asfNoFreeze
constexpr std::uint32_t asfDisableMaster
constexpr std::uint32_t asfDisallowIncomingTrustline
constexpr std::uint32_t tfPartialPayment
constexpr std::uint32_t tfClearNoRipple
std::string strHex(FwdIt begin, FwdIt end)
constexpr std::uint32_t tfSetfAuth
constexpr std::uint32_t asfAccountTxnID
constexpr std::uint32_t asfDefaultRipple
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
constexpr std::uint32_t asfDisallowIncomingCheck
constexpr std::uint32_t tfClearFreeze
constexpr std::uint32_t tfRequireAuth
@ tecNO_DELEGATE_PERMISSION
@ tecINSUFFICIENT_RESERVE
constexpr std::uint32_t const tfMPTLock
constexpr std::uint32_t tfClearDeepFreeze
std::string to_string(base_uint< Bits, Tag > const &a)
constexpr std::uint32_t asfDisallowIncomingPayChan
std::pair< PublicKey, SecretKey > randomKeyPair(KeyType type)
Create a key pair using secure random numbers.
constexpr std::uint32_t tfFullyCanonicalSig
Transaction flags.
constexpr std::uint32_t asfAllowTrustLineClawback
constexpr std::uint32_t asfRequireAuth
constexpr std::uint32_t tfSetFreeze
constexpr std::uint32_t tfSetNoRipple
constexpr std::uint32_t const tfMPTCanLock
constexpr std::uint32_t asfDisallowXRP