mirror of
https://github.com/XRPLF/rippled.git
synced 2026-07-30 18:40:28 +00:00
Merge remote-tracking branch 'ripple/develop' into dev_rename_merge
This commit is contained in:
@@ -46,7 +46,7 @@
|
||||
|
||||
namespace xrpl {
|
||||
|
||||
class Ticket_test : public beast::unit_test::suite
|
||||
class Ticket_test : public beast::unit_test::Suite
|
||||
{
|
||||
/// @brief Validate metadata for a successful TicketCreate transaction.
|
||||
///
|
||||
@@ -56,7 +56,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
{
|
||||
using namespace std::string_literals;
|
||||
|
||||
Json::Value const& tx{env.tx()->getJson(JsonOptions::none)};
|
||||
json::Value const& tx{env.tx()->getJson(JsonOptions::KNone)};
|
||||
{
|
||||
std::string const txType = tx[sfTransactionType.jsonName].asString();
|
||||
|
||||
@@ -72,7 +72,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
std::uint32_t const txSeq = {tx[sfSequence.jsonName].asUInt()};
|
||||
std::string const account = tx[sfAccount.jsonName].asString();
|
||||
|
||||
Json::Value const& metadata = env.meta()->getJson(JsonOptions::none);
|
||||
json::Value const& metadata = env.meta()->getJson(JsonOptions::KNone);
|
||||
if (!BEAST_EXPECTS(
|
||||
metadata.isMember(sfTransactionResult.jsonName) &&
|
||||
metadata[sfTransactionResult.jsonName].asString() == "tesSUCCESS",
|
||||
@@ -86,11 +86,11 @@ class Ticket_test : public beast::unit_test::suite
|
||||
std::uint32_t acctRootFinalSeq = {0};
|
||||
std::vector<std::uint32_t> ticketSeqs;
|
||||
ticketSeqs.reserve(count);
|
||||
for (Json::Value const& node : metadata[sfAffectedNodes.jsonName])
|
||||
for (json::Value const& node : metadata[sfAffectedNodes.jsonName])
|
||||
{
|
||||
if (node.isMember(sfModifiedNode.jsonName))
|
||||
{
|
||||
Json::Value const& modified = node[sfModifiedNode.jsonName];
|
||||
json::Value const& modified = node[sfModifiedNode.jsonName];
|
||||
std::string const entryType = modified[sfLedgerEntryType.jsonName].asString();
|
||||
if (entryType == jss::AccountRoot)
|
||||
{
|
||||
@@ -182,7 +182,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
}
|
||||
else if (node.isMember(sfCreatedNode.jsonName))
|
||||
{
|
||||
Json::Value const& created = node[sfCreatedNode.jsonName];
|
||||
json::Value const& created = node[sfCreatedNode.jsonName];
|
||||
std::string const entryType = created[sfLedgerEntryType.jsonName].asString();
|
||||
if (entryType == jss::Ticket)
|
||||
{
|
||||
@@ -202,7 +202,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
}
|
||||
else if (node.isMember(sfDeletedNode.jsonName))
|
||||
{
|
||||
Json::Value const& deleted = node[sfDeletedNode.jsonName];
|
||||
json::Value const& deleted = node[sfDeletedNode.jsonName];
|
||||
std::string const entryType = deleted[sfLedgerEntryType.jsonName].asString();
|
||||
|
||||
if (entryType == jss::Ticket)
|
||||
@@ -242,7 +242,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
void
|
||||
checkTicketConsumeMeta(test::jtx::Env& env)
|
||||
{
|
||||
Json::Value const& tx{env.tx()->getJson(JsonOptions::none)};
|
||||
json::Value const& tx{env.tx()->getJson(JsonOptions::KNone)};
|
||||
|
||||
// Verify that the transaction includes a TicketSequence.
|
||||
|
||||
@@ -275,7 +275,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
|
||||
std::uint32_t const ticketSeq{tx[sfTicketSequence.jsonName].asUInt()};
|
||||
|
||||
Json::Value const& metadata{env.meta()->getJson(JsonOptions::none)};
|
||||
json::Value const& metadata{env.meta()->getJson(JsonOptions::KNone)};
|
||||
if (!BEAST_EXPECTS(
|
||||
metadata.isMember(sfTransactionResult.jsonName),
|
||||
"Metadata is missing TransactionResult."))
|
||||
@@ -296,11 +296,11 @@ class Ticket_test : public beast::unit_test::suite
|
||||
bool acctRootFound{false};
|
||||
std::uint32_t acctRootSeq{0};
|
||||
int ticketsRemoved{0};
|
||||
for (Json::Value const& node : metadata[sfAffectedNodes.jsonName])
|
||||
for (json::Value const& node : metadata[sfAffectedNodes.jsonName])
|
||||
{
|
||||
if (node.isMember(sfModifiedNode.jsonName))
|
||||
{
|
||||
Json::Value const& modified{node[sfModifiedNode.jsonName]};
|
||||
json::Value const& modified{node[sfModifiedNode.jsonName]};
|
||||
std::string const entryType = modified[sfLedgerEntryType.jsonName].asString();
|
||||
if (entryType == "AccountRoot" &&
|
||||
modified[sfFinalFields.jsonName][sfAccount.jsonName].asString() == account)
|
||||
@@ -338,7 +338,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
}
|
||||
else if (node.isMember(sfDeletedNode.jsonName))
|
||||
{
|
||||
Json::Value const& deleted{node[sfDeletedNode.jsonName]};
|
||||
json::Value const& deleted{node[sfDeletedNode.jsonName]};
|
||||
std::string const entryType{deleted[sfLedgerEntryType.jsonName].asString()};
|
||||
|
||||
if (entryType == jss::Ticket)
|
||||
@@ -372,40 +372,40 @@ class Ticket_test : public beast::unit_test::suite
|
||||
Account const master{env.master};
|
||||
|
||||
// Exercise boundaries on count.
|
||||
env(ticket::create(master, 0), ter(temINVALID_COUNT));
|
||||
env(ticket::create(master, 251), ter(temINVALID_COUNT));
|
||||
env(ticket::create(master, 0), Ter(temINVALID_COUNT));
|
||||
env(ticket::create(master, 251), Ter(temINVALID_COUNT));
|
||||
|
||||
// Exercise fees.
|
||||
std::uint32_t const ticketSeq_A{env.seq(master) + 1};
|
||||
env(ticket::create(master, 1), fee(XRP(10)));
|
||||
std::uint32_t const ticketSeqA{env.seq(master) + 1};
|
||||
env(ticket::create(master, 1), Fee(XRP(10)));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(master, 1), tickets(master, 1));
|
||||
env.require(Owners(master, 1), tickets(master, 1));
|
||||
|
||||
env(ticket::create(master, 1), fee(XRP(-1)), ter(temBAD_FEE));
|
||||
env(ticket::create(master, 1), Fee(XRP(-1)), Ter(temBAD_FEE));
|
||||
|
||||
// Exercise flags.
|
||||
std::uint32_t const ticketSeq_B{env.seq(master) + 1};
|
||||
env(ticket::create(master, 1), txflags(tfFullyCanonicalSig));
|
||||
std::uint32_t const ticketSeqB{env.seq(master) + 1};
|
||||
env(ticket::create(master, 1), Txflags(tfFullyCanonicalSig));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(master, 2), tickets(master, 2));
|
||||
env.require(Owners(master, 2), tickets(master, 2));
|
||||
|
||||
env(ticket::create(master, 1), txflags(tfSell), ter(temINVALID_FLAG));
|
||||
env(ticket::create(master, 1), Txflags(tfSell), Ter(temINVALID_FLAG));
|
||||
env.close();
|
||||
env.require(owners(master, 2), tickets(master, 2));
|
||||
env.require(Owners(master, 2), tickets(master, 2));
|
||||
|
||||
// We successfully created 1 ticket earlier. Verify that we can
|
||||
// create 250 tickets in one shot. We must consume one ticket first.
|
||||
env(noop(master), ticket::use(ticketSeq_A));
|
||||
env(noop(master), ticket::Use(ticketSeqA));
|
||||
checkTicketConsumeMeta(env);
|
||||
env.close();
|
||||
env.require(owners(master, 1), tickets(master, 1));
|
||||
env.require(Owners(master, 1), tickets(master, 1));
|
||||
|
||||
env(ticket::create(master, 250), ticket::use(ticketSeq_B));
|
||||
env(ticket::create(master, 250), ticket::Use(ticketSeqB));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(master, 250), tickets(master, 250));
|
||||
env.require(Owners(master, 250), tickets(master, 250));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -420,7 +420,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
Account const alice{"alice"};
|
||||
env.memoize(alice);
|
||||
|
||||
env(ticket::create(alice, 1), json(jss::Sequence, 1), ter(terNO_ACCOUNT));
|
||||
env(ticket::create(alice, 1), Json(jss::Sequence, 1), Ter(terNO_ACCOUNT));
|
||||
}
|
||||
{
|
||||
// Exceed the threshold where tickets can no longer be
|
||||
@@ -434,31 +434,31 @@ class Ticket_test : public beast::unit_test::suite
|
||||
env(ticket::create(alice, 250));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 250), tickets(alice, 250));
|
||||
env.require(Owners(alice, 250), tickets(alice, 250));
|
||||
|
||||
// Note that we can add one more ticket while consuming a ticket
|
||||
// because the final result is still 250 tickets.
|
||||
env(ticket::create(alice, 1), ticket::use(ticketSeq + 0));
|
||||
env(ticket::create(alice, 1), ticket::Use(ticketSeq + 0));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 250), tickets(alice, 250));
|
||||
env.require(Owners(alice, 250), tickets(alice, 250));
|
||||
|
||||
// Adding one more ticket will exceed the threshold.
|
||||
env(ticket::create(alice, 2), ticket::use(ticketSeq + 1), ter(tecDIR_FULL));
|
||||
env(ticket::create(alice, 2), ticket::Use(ticketSeq + 1), Ter(tecDIR_FULL));
|
||||
env.close();
|
||||
env.require(owners(alice, 249), tickets(alice, 249));
|
||||
env.require(Owners(alice, 249), tickets(alice, 249));
|
||||
|
||||
// Now we can successfully add one more ticket.
|
||||
env(ticket::create(alice, 2), ticket::use(ticketSeq + 2));
|
||||
env(ticket::create(alice, 2), ticket::Use(ticketSeq + 2));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 250), tickets(alice, 250));
|
||||
env.require(Owners(alice, 250), tickets(alice, 250));
|
||||
|
||||
// Since we're at 250, we can't add another ticket using a
|
||||
// sequence.
|
||||
env(ticket::create(alice, 1), ter(tecDIR_FULL));
|
||||
env(ticket::create(alice, 1), Ter(tecDIR_FULL));
|
||||
env.close();
|
||||
env.require(owners(alice, 250), tickets(alice, 250));
|
||||
env.require(Owners(alice, 250), tickets(alice, 250));
|
||||
}
|
||||
{
|
||||
// Explore exceeding the ticket threshold from another angle.
|
||||
@@ -468,29 +468,29 @@ class Ticket_test : public beast::unit_test::suite
|
||||
env.fund(XRP(100000), alice);
|
||||
env.close();
|
||||
|
||||
std::uint32_t const ticketSeq_AB{env.seq(alice) + 1};
|
||||
std::uint32_t const ticketSeqAb{env.seq(alice) + 1};
|
||||
env(ticket::create(alice, 2));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 2), tickets(alice, 2));
|
||||
env.require(Owners(alice, 2), tickets(alice, 2));
|
||||
|
||||
// Adding 250 tickets (while consuming one) will exceed the
|
||||
// threshold.
|
||||
env(ticket::create(alice, 250), ticket::use(ticketSeq_AB + 0), ter(tecDIR_FULL));
|
||||
env(ticket::create(alice, 250), ticket::Use(ticketSeqAb + 0), Ter(tecDIR_FULL));
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 1));
|
||||
env.require(Owners(alice, 1), tickets(alice, 1));
|
||||
|
||||
// Adding 250 tickets (without consuming one) will exceed the
|
||||
// threshold.
|
||||
env(ticket::create(alice, 250), ter(tecDIR_FULL));
|
||||
env(ticket::create(alice, 250), Ter(tecDIR_FULL));
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 1));
|
||||
env.require(Owners(alice, 1), tickets(alice, 1));
|
||||
|
||||
// Alice can now add 250 tickets while consuming one.
|
||||
env(ticket::create(alice, 250), ticket::use(ticketSeq_AB + 1));
|
||||
env(ticket::create(alice, 250), ticket::Use(ticketSeqAb + 1));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 250), tickets(alice, 250));
|
||||
env.require(Owners(alice, 250), tickets(alice, 250));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -507,9 +507,9 @@ class Ticket_test : public beast::unit_test::suite
|
||||
env.fund(baseAccountReserve(*env.current(), 1) - drops(1), alice);
|
||||
env.close();
|
||||
|
||||
env(ticket::create(alice, 1), ter(tecINSUFFICIENT_RESERVE));
|
||||
env(ticket::create(alice, 1), Ter(tecINSUFFICIENT_RESERVE));
|
||||
env.close();
|
||||
env.require(owners(alice, 0), tickets(alice, 0));
|
||||
env.require(Owners(alice, 0), tickets(alice, 0));
|
||||
|
||||
// Give alice enough to exactly meet the reserve for one Ticket.
|
||||
env(pay(env.master, alice, baseAccountReserve(*env.current(), 1) - env.balance(alice)));
|
||||
@@ -518,7 +518,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
env(ticket::create(alice, 1));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 1));
|
||||
env.require(Owners(alice, 1), tickets(alice, 1));
|
||||
|
||||
// Give alice not quite enough to make the reserve for a total of
|
||||
// 250 Tickets.
|
||||
@@ -530,9 +530,9 @@ class Ticket_test : public beast::unit_test::suite
|
||||
|
||||
// alice doesn't quite have the reserve for a total of 250
|
||||
// Tickets, so the transaction fails.
|
||||
env(ticket::create(alice, 249), ter(tecINSUFFICIENT_RESERVE));
|
||||
env(ticket::create(alice, 249), Ter(tecINSUFFICIENT_RESERVE));
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 1));
|
||||
env.require(Owners(alice, 1), tickets(alice, 1));
|
||||
|
||||
// Give alice enough so she can make the reserve for all 250
|
||||
// Tickets.
|
||||
@@ -543,7 +543,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
env(ticket::create(alice, 249));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 250), tickets(alice, 250));
|
||||
env.require(Owners(alice, 250), tickets(alice, 250));
|
||||
BEAST_EXPECT(ticketSeq + 249 == env.seq(alice));
|
||||
}
|
||||
|
||||
@@ -560,77 +560,77 @@ class Ticket_test : public beast::unit_test::suite
|
||||
env.close();
|
||||
|
||||
// Successfully create tickets (using a sequence)
|
||||
std::uint32_t const ticketSeq_AB{env.seq(alice) + 1};
|
||||
std::uint32_t const ticketSeqAb{env.seq(alice) + 1};
|
||||
env(ticket::create(alice, 2));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 2), tickets(alice, 2));
|
||||
BEAST_EXPECT(ticketSeq_AB + 2 == env.seq(alice));
|
||||
env.require(Owners(alice, 2), tickets(alice, 2));
|
||||
BEAST_EXPECT(ticketSeqAb + 2 == env.seq(alice));
|
||||
|
||||
// You can use a ticket to create one ticket ...
|
||||
std::uint32_t const ticketSeq_C{env.seq(alice)};
|
||||
env(ticket::create(alice, 1), ticket::use(ticketSeq_AB + 0));
|
||||
std::uint32_t const ticketSeqC{env.seq(alice)};
|
||||
env(ticket::create(alice, 1), ticket::Use(ticketSeqAb + 0));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 2), tickets(alice, 2));
|
||||
BEAST_EXPECT(ticketSeq_C + 1 == env.seq(alice));
|
||||
env.require(Owners(alice, 2), tickets(alice, 2));
|
||||
BEAST_EXPECT(ticketSeqC + 1 == env.seq(alice));
|
||||
|
||||
// ... you can use a ticket to create multiple tickets ...
|
||||
std::uint32_t const ticketSeq_DE{env.seq(alice)};
|
||||
env(ticket::create(alice, 2), ticket::use(ticketSeq_AB + 1));
|
||||
std::uint32_t const ticketSeqDe{env.seq(alice)};
|
||||
env(ticket::create(alice, 2), ticket::Use(ticketSeqAb + 1));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 3), tickets(alice, 3));
|
||||
BEAST_EXPECT(ticketSeq_DE + 2 == env.seq(alice));
|
||||
env.require(Owners(alice, 3), tickets(alice, 3));
|
||||
BEAST_EXPECT(ticketSeqDe + 2 == env.seq(alice));
|
||||
|
||||
// ... and you can use a ticket for other things.
|
||||
env(noop(alice), ticket::use(ticketSeq_DE + 0));
|
||||
env(noop(alice), ticket::Use(ticketSeqDe + 0));
|
||||
checkTicketConsumeMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 2), tickets(alice, 2));
|
||||
BEAST_EXPECT(ticketSeq_DE + 2 == env.seq(alice));
|
||||
env.require(Owners(alice, 2), tickets(alice, 2));
|
||||
BEAST_EXPECT(ticketSeqDe + 2 == env.seq(alice));
|
||||
|
||||
env(pay(alice, env.master, XRP(20)), ticket::use(ticketSeq_DE + 1));
|
||||
env(pay(alice, env.master, XRP(20)), ticket::Use(ticketSeqDe + 1));
|
||||
checkTicketConsumeMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 1));
|
||||
BEAST_EXPECT(ticketSeq_DE + 2 == env.seq(alice));
|
||||
env.require(Owners(alice, 1), tickets(alice, 1));
|
||||
BEAST_EXPECT(ticketSeqDe + 2 == env.seq(alice));
|
||||
|
||||
env(trust(alice, env.master["USD"](20)), ticket::use(ticketSeq_C));
|
||||
env(trust(alice, env.master["USD"](20)), ticket::Use(ticketSeqC));
|
||||
checkTicketConsumeMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 0));
|
||||
BEAST_EXPECT(ticketSeq_DE + 2 == env.seq(alice));
|
||||
env.require(Owners(alice, 1), tickets(alice, 0));
|
||||
BEAST_EXPECT(ticketSeqDe + 2 == env.seq(alice));
|
||||
|
||||
// Attempt to use a ticket that has already been used.
|
||||
env(noop(alice), ticket::use(ticketSeq_C), ter(tefNO_TICKET));
|
||||
env(noop(alice), ticket::Use(ticketSeqC), Ter(tefNO_TICKET));
|
||||
env.close();
|
||||
|
||||
// Attempt to use a ticket from the future.
|
||||
std::uint32_t const ticketSeq_F{env.seq(alice) + 1};
|
||||
env(noop(alice), ticket::use(ticketSeq_F), ter(terPRE_TICKET));
|
||||
std::uint32_t const ticketSeqF{env.seq(alice) + 1};
|
||||
env(noop(alice), ticket::Use(ticketSeqF), Ter(terPRE_TICKET));
|
||||
env.close();
|
||||
|
||||
// Now create the ticket. The retry will consume the new ticket.
|
||||
env(ticket::create(alice, 1));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 0));
|
||||
BEAST_EXPECT(ticketSeq_F + 1 == env.seq(alice));
|
||||
env.require(Owners(alice, 1), tickets(alice, 0));
|
||||
BEAST_EXPECT(ticketSeqF + 1 == env.seq(alice));
|
||||
|
||||
// Try a transaction that combines consuming a ticket with
|
||||
// AccountTxnID.
|
||||
std::uint32_t const ticketSeq_G{env.seq(alice) + 1};
|
||||
std::uint32_t const ticketSeqG{env.seq(alice) + 1};
|
||||
env(ticket::create(alice, 1));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
|
||||
env(noop(alice),
|
||||
ticket::use(ticketSeq_G),
|
||||
json(R"({"AccountTxnID": "0"})"),
|
||||
ter(temINVALID));
|
||||
ticket::Use(ticketSeqG),
|
||||
Json(R"({"AccountTxnID": "0"})"),
|
||||
Ter(temINVALID));
|
||||
env.close();
|
||||
env.require(owners(alice, 2), tickets(alice, 1));
|
||||
env.require(Owners(alice, 2), tickets(alice, 1));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -674,36 +674,36 @@ class Ticket_test : public beast::unit_test::suite
|
||||
|
||||
// Successfully create several tickets (using a sequence).
|
||||
std::uint32_t ticketSeq{env.seq(alice)};
|
||||
static constexpr std::uint32_t ticketCount{10};
|
||||
env(ticket::create(alice, ticketCount));
|
||||
uint256 const txHash_1{getTxID()};
|
||||
static constexpr std::uint32_t kTICKET_COUNT{10};
|
||||
env(ticket::create(alice, kTICKET_COUNT));
|
||||
uint256 const txHash1{getTxID()};
|
||||
|
||||
// Just for grins use the tickets in reverse from largest to smallest.
|
||||
ticketSeq += ticketCount;
|
||||
env(noop(alice), ticket::use(--ticketSeq));
|
||||
uint256 const txHash_2{getTxID()};
|
||||
ticketSeq += kTICKET_COUNT;
|
||||
env(noop(alice), ticket::Use(--ticketSeq));
|
||||
uint256 const txHash2{getTxID()};
|
||||
|
||||
env(pay(alice, env.master, XRP(200)), ticket::use(--ticketSeq));
|
||||
uint256 const txHash_3{getTxID()};
|
||||
env(pay(alice, env.master, XRP(200)), ticket::Use(--ticketSeq));
|
||||
uint256 const txHash3{getTxID()};
|
||||
|
||||
env(deposit::auth(alice, env.master), ticket::use(--ticketSeq));
|
||||
uint256 const txHash_4{getTxID()};
|
||||
env(deposit::auth(alice, env.master), ticket::Use(--ticketSeq));
|
||||
uint256 const txHash4{getTxID()};
|
||||
|
||||
// Close the ledger so we look at transactions from a couple of
|
||||
// different ledgers.
|
||||
env.close();
|
||||
|
||||
env(pay(alice, env.master, XRP(300)), ticket::use(--ticketSeq));
|
||||
uint256 const txHash_5{getTxID()};
|
||||
env(pay(alice, env.master, XRP(300)), ticket::Use(--ticketSeq));
|
||||
uint256 const txHash5{getTxID()};
|
||||
|
||||
env(pay(alice, env.master, XRP(400)), ticket::use(--ticketSeq));
|
||||
uint256 const txHash_6{getTxID()};
|
||||
env(pay(alice, env.master, XRP(400)), ticket::Use(--ticketSeq));
|
||||
uint256 const txHash6{getTxID()};
|
||||
|
||||
env(deposit::unauth(alice, env.master), ticket::use(--ticketSeq));
|
||||
uint256 const txHash_7{getTxID()};
|
||||
env(deposit::unauth(alice, env.master), ticket::Use(--ticketSeq));
|
||||
uint256 const txHash7{getTxID()};
|
||||
|
||||
env(noop(alice), ticket::use(--ticketSeq));
|
||||
uint256 const txHash_8{getTxID()};
|
||||
env(noop(alice), ticket::Use(--ticketSeq));
|
||||
uint256 const txHash8{getTxID()};
|
||||
|
||||
env.close();
|
||||
|
||||
@@ -719,13 +719,13 @@ class Ticket_test : public beast::unit_test::suite
|
||||
std::uint32_t txSeq,
|
||||
std::optional<std::uint32_t> ticketSeq,
|
||||
TxType txType) {
|
||||
error_code_i txErrCode{rpcSUCCESS};
|
||||
ErrorCodeI txErrCode{RpcSuccess};
|
||||
|
||||
using TxPair = std::pair<std::shared_ptr<Transaction>, std::shared_ptr<TxMeta>>;
|
||||
std::variant<TxPair, TxSearched> maybeTx =
|
||||
Transaction::load(txID, env.app(), txErrCode);
|
||||
|
||||
BEAST_EXPECT(txErrCode == rpcSUCCESS);
|
||||
BEAST_EXPECT(txErrCode == RpcSuccess);
|
||||
if (auto txPtr = std::get_if<TxPair>(&maybeTx))
|
||||
{
|
||||
std::shared_ptr<Transaction> const& tx = txPtr->first;
|
||||
@@ -743,22 +743,22 @@ class Ticket_test : public beast::unit_test::suite
|
||||
};
|
||||
|
||||
// txID ledgerSeq txSeq ticketSeq txType
|
||||
checkTxFromDB(txHash_1, 4, 4, {}, ttTICKET_CREATE);
|
||||
checkTxFromDB(txHash_2, 4, 0, 13, ttACCOUNT_SET);
|
||||
checkTxFromDB(txHash_3, 4, 0, 12, ttPAYMENT);
|
||||
checkTxFromDB(txHash_4, 4, 0, 11, ttDEPOSIT_PREAUTH);
|
||||
checkTxFromDB(txHash1, 4, 4, {}, ttTICKET_CREATE);
|
||||
checkTxFromDB(txHash2, 4, 0, 13, ttACCOUNT_SET);
|
||||
checkTxFromDB(txHash3, 4, 0, 12, ttPAYMENT);
|
||||
checkTxFromDB(txHash4, 4, 0, 11, ttDEPOSIT_PREAUTH);
|
||||
|
||||
checkTxFromDB(txHash_5, 5, 0, 10, ttPAYMENT);
|
||||
checkTxFromDB(txHash_6, 5, 0, 9, ttPAYMENT);
|
||||
checkTxFromDB(txHash_7, 5, 0, 8, ttDEPOSIT_PREAUTH);
|
||||
checkTxFromDB(txHash_8, 5, 0, 7, ttACCOUNT_SET);
|
||||
checkTxFromDB(txHash5, 5, 0, 10, ttPAYMENT);
|
||||
checkTxFromDB(txHash6, 5, 0, 9, ttPAYMENT);
|
||||
checkTxFromDB(txHash7, 5, 0, 8, ttDEPOSIT_PREAUTH);
|
||||
checkTxFromDB(txHash8, 5, 0, 7, ttACCOUNT_SET);
|
||||
}
|
||||
|
||||
void
|
||||
testSignWithTicketSequence()
|
||||
{
|
||||
// The sign and the submit RPC commands automatically fill in the
|
||||
// Sequence field of a transaction if none is provided. If a
|
||||
// Sequence field of a transaction if kNONE is provided. If a
|
||||
// TicketSequence is provided in the transaction, then the
|
||||
// auto-filled Sequence should be zero.
|
||||
testcase("Sign with TicketSequence");
|
||||
@@ -775,16 +775,16 @@ class Ticket_test : public beast::unit_test::suite
|
||||
env(ticket::create(alice, 2));
|
||||
checkTicketCreateMeta(env);
|
||||
env.close();
|
||||
env.require(owners(alice, 2), tickets(alice, 2));
|
||||
env.require(Owners(alice, 2), tickets(alice, 2));
|
||||
BEAST_EXPECT(ticketSeq + 2 == env.seq(alice));
|
||||
|
||||
{
|
||||
// Test that the "sign" RPC command fills in a "Sequence": 0 field
|
||||
// if none is provided.
|
||||
// if kNONE is provided.
|
||||
|
||||
// Create a noop transaction using a TicketSequence but don't fill
|
||||
// in the Sequence field.
|
||||
Json::Value tx = Json::objectValue;
|
||||
json::Value tx = json::ObjectValue;
|
||||
tx[jss::tx_json] = noop(alice);
|
||||
tx[jss::tx_json][sfTicketSequence.jsonName] = ticketSeq;
|
||||
tx[jss::secret] = toBase58(generateSeed("alice"));
|
||||
@@ -794,7 +794,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
|
||||
// Call the "sign" RPC command and see the "Sequence": 0 field
|
||||
// filled in.
|
||||
Json::Value jr = env.rpc("json", "sign", to_string(tx));
|
||||
json::Value jr = env.rpc("json", "sign", to_string(tx));
|
||||
|
||||
// Verify that "sign" inserted a "Sequence": 0 field.
|
||||
if (BEAST_EXPECT(jr[jss::result][jss::tx_json].isMember(sfSequence.jsonName)))
|
||||
@@ -804,20 +804,20 @@ class Ticket_test : public beast::unit_test::suite
|
||||
|
||||
// "sign" should not have consumed any of alice's tickets.
|
||||
env.close();
|
||||
env.require(owners(alice, 2), tickets(alice, 2));
|
||||
env.require(Owners(alice, 2), tickets(alice, 2));
|
||||
|
||||
// "submit" the signed blob and see one of alice's tickets consumed.
|
||||
env.rpc("submit", jr[jss::result][jss::tx_blob].asString());
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 1));
|
||||
env.require(Owners(alice, 1), tickets(alice, 1));
|
||||
}
|
||||
{
|
||||
// Test that the "submit" RPC command fills in a "Sequence": 0
|
||||
// field if none is provided.
|
||||
// field if kNONE is provided.
|
||||
|
||||
// Create a noop transaction using a TicketSequence but don't fill
|
||||
// in the Sequence field.
|
||||
Json::Value tx = Json::objectValue;
|
||||
json::Value tx = json::ObjectValue;
|
||||
tx[jss::tx_json] = noop(alice);
|
||||
tx[jss::tx_json][sfTicketSequence.jsonName] = ticketSeq + 1;
|
||||
tx[jss::secret] = toBase58(generateSeed("alice"));
|
||||
@@ -827,7 +827,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
|
||||
// Call the "submit" RPC command and see the "Sequence": 0 field
|
||||
// filled in.
|
||||
Json::Value jr = env.rpc("json", "submit", to_string(tx));
|
||||
json::Value jr = env.rpc("json", "submit", to_string(tx));
|
||||
|
||||
// Verify that "submit" inserted a "Sequence": 0 field.
|
||||
if (BEAST_EXPECT(jr[jss::result][jss::tx_json].isMember(sfSequence.jsonName)))
|
||||
@@ -837,7 +837,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
|
||||
// "submit" should have consumed the last of alice's tickets.
|
||||
env.close();
|
||||
env.require(owners(alice, 0), tickets(alice, 0));
|
||||
env.require(Owners(alice, 0), tickets(alice, 0));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -850,7 +850,7 @@ class Ticket_test : public beast::unit_test::suite
|
||||
// and a TicketSequence field. Verify that the error is detected.
|
||||
testcase("Fix both Seq and Ticket");
|
||||
|
||||
Env env{*this, testable_amendments()};
|
||||
Env env{*this, testableAmendments()};
|
||||
Account const alice{"alice"};
|
||||
|
||||
env.fund(XRP(10000), alice);
|
||||
@@ -860,17 +860,17 @@ class Ticket_test : public beast::unit_test::suite
|
||||
std::uint32_t const ticketSeq = env.seq(alice) + 1;
|
||||
env(ticket::create(alice, 1));
|
||||
env.close();
|
||||
env.require(owners(alice, 1), tickets(alice, 1));
|
||||
env.require(Owners(alice, 1), tickets(alice, 1));
|
||||
BEAST_EXPECT(ticketSeq + 1 == env.seq(alice));
|
||||
|
||||
// Create a transaction that includes both a ticket and a non-zero
|
||||
// sequence number. The transaction fails with temSEQ_AND_TICKET.
|
||||
env(noop(alice), ticket::use(ticketSeq), seq(env.seq(alice)), ter(temSEQ_AND_TICKET));
|
||||
env(noop(alice), ticket::Use(ticketSeq), Seq(env.seq(alice)), Ter(temSEQ_AND_TICKET));
|
||||
env.close();
|
||||
|
||||
// Verify that the transaction failed by looking at alice's
|
||||
// sequence number and tickets.
|
||||
env.require(owners(alice, 1), tickets(alice, 1));
|
||||
env.require(Owners(alice, 1), tickets(alice, 1));
|
||||
BEAST_EXPECT(ticketSeq + 1 == env.seq(alice));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user