Skip to content

Commit a2c4101

Browse files
authored
add ticket tests (XRPLF#129)
1 parent 251a79e commit a2c4101

File tree

6 files changed

+127
-6
lines changed

6 files changed

+127
-6
lines changed

src/ripple/protocol/impl/TxFormats.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ TxFormats::TxFormats()
198198
{sfLedgerSequence, soeREQUIRED},
199199
{sfActiveValidator, soeOPTIONAL},
200200
{sfImportVLKey, soeOPTIONAL},
201-
202201
},
203202
commonFields);
204203

@@ -308,13 +307,15 @@ TxFormats::TxFormats()
308307
ttHOOK_SET,
309308
{
310309
{sfHooks, soeREQUIRED},
310+
{sfTicketSequence, soeOPTIONAL},
311311
},
312312
commonFields);
313313

314314
add(jss::ClaimReward,
315315
ttCLAIM_REWARD,
316316
{
317-
{sfIssuer, soeOPTIONAL}
317+
{sfIssuer, soeOPTIONAL},
318+
{sfTicketSequence, soeOPTIONAL},
318319
},
319320
commonFields);
320321

@@ -380,6 +381,7 @@ TxFormats::TxFormats()
380381
{
381382
{sfBlob, soeREQUIRED},
382383
{sfIssuer, soeOPTIONAL},
384+
{sfTicketSequence, soeOPTIONAL},
383385
},
384386
commonFields);
385387

@@ -390,6 +392,7 @@ TxFormats::TxFormats()
390392
{sfDestination, soeOPTIONAL},
391393
{sfInvoiceID, soeOPTIONAL},
392394
{sfDestinationTag, soeOPTIONAL},
395+
{sfTicketSequence, soeOPTIONAL},
393396
},
394397
commonFields);
395398

src/test/app/ClaimReward_test.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -351,13 +351,36 @@ struct ClaimReward_test : public beast::unit_test::suite
351351
BEAST_EXPECT(expectNoRewards(env, alice) == true);
352352
}
353353

354+
void
355+
testUsingTickets(FeatureBitset features)
356+
{
357+
testcase("using tickets");
358+
using namespace jtx;
359+
using namespace std::literals::chrono_literals;
360+
Env env{*this, features};
361+
auto const alice = Account("alice");
362+
auto const issuer = Account("issuer");
363+
env.fund(XRP(10000), alice, issuer);
364+
std::uint32_t aliceTicketSeq{env.seq(alice) + 1};
365+
env(ticket::create(alice, 10));
366+
std::uint32_t const aliceSeq{env.seq(alice)};
367+
env.require(owners(alice, 10));
368+
369+
env(claim(alice, issuer), ticket::use(aliceTicketSeq++), ter(tesSUCCESS));
370+
371+
env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
372+
BEAST_EXPECT(env.seq(alice) == aliceSeq);
373+
env.require(owners(alice, 9));
374+
}
375+
354376
void
355377
testWithFeats(FeatureBitset features)
356378
{
357379
testEnabled(features);
358380
testInvalidPreflight(features);
359381
testInvalidPreclaim(features);
360382
testValidNoHook(features);
383+
testUsingTickets(features);
361384
}
362385

363386
public:

src/test/app/Import_test.cpp

+47
Original file line numberDiff line numberDiff line change
@@ -4415,6 +4415,52 @@ class Import_test : public beast::unit_test::suite
44154415
}
44164416
}
44174417

4418+
void
4419+
testUsingTickets(FeatureBitset features)
4420+
{
4421+
testcase("using tickets");
4422+
4423+
using namespace test::jtx;
4424+
using namespace std::literals;
4425+
4426+
{
4427+
test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)};
4428+
auto const feeDrops = env.current()->fees().base;
4429+
4430+
// confirm total coins header
4431+
auto const initCoins = env.current()->info().drops;
4432+
BEAST_EXPECT(initCoins == 100'000'000'000'000'000);
4433+
4434+
// burn 10'000 xrp
4435+
auto const master = Account("masterpassphrase");
4436+
env(noop(master), fee(10'000'000'000), ter(tesSUCCESS));
4437+
env.close();
4438+
4439+
// confirm total coins header
4440+
auto const burnCoins = env.current()->info().drops;
4441+
BEAST_EXPECT(burnCoins == initCoins - 10'000'000'000);
4442+
4443+
auto const alice = Account("alice");
4444+
env.fund(XRP(1000), alice);
4445+
env.close();
4446+
4447+
std::uint32_t aliceTicketSeq{env.seq(alice) + 1};
4448+
env(ticket::create(alice, 10));
4449+
std::uint32_t const aliceSeq{env.seq(alice)};
4450+
env.require(owners(alice, 10));
4451+
4452+
env(import(alice, loadXpop(ImportTCAccountSet::w_seed)),
4453+
fee(feeDrops * 10),
4454+
ticket::use(aliceTicketSeq++),
4455+
ter(tesSUCCESS));
4456+
env.close();
4457+
4458+
env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
4459+
BEAST_EXPECT(env.seq(alice) == aliceSeq);
4460+
env.require(owners(alice, 9));
4461+
}
4462+
}
4463+
44184464
void
44194465
testAccountIndex(FeatureBitset features)
44204466
{
@@ -5581,6 +5627,7 @@ class Import_test : public beast::unit_test::suite
55815627
testSetRegularKey(features);
55825628
testSetRegularKeyFlags(features);
55835629
testSignersListSet(features);
5630+
testUsingTickets(features);
55845631
testAccountIndex(features);
55855632
testHookIssuer(features);
55865633
testImportSequence(features);

src/test/app/Invoke_test.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,28 @@ class Invoke_test : public beast::unit_test::suite
232232
}
233233
}
234234

235+
void
236+
testUsingTickets(FeatureBitset features)
237+
{
238+
testcase("invoke using tickets");
239+
using namespace jtx;
240+
using namespace std::literals::chrono_literals;
241+
Env env{*this, features};
242+
auto const alice = Account("alice");
243+
env.fund(XRP(10000), alice);
244+
std::uint32_t aliceTicketSeq{env.seq(alice) + 1};
245+
env(ticket::create(alice, 10));
246+
std::uint32_t const aliceSeq{env.seq(alice)};
247+
env.require(owners(alice, 10));
248+
249+
env(invoke(alice), ticket::use(aliceTicketSeq++), ter(tesSUCCESS));
250+
env(invoke(alice), ticket::use(aliceTicketSeq++), ter(tesSUCCESS));
251+
252+
env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
253+
BEAST_EXPECT(env.seq(alice) == aliceSeq);
254+
env.require(owners(alice, 8));
255+
}
256+
235257
public:
236258
void
237259
run() override
@@ -247,6 +269,7 @@ class Invoke_test : public beast::unit_test::suite
247269
testInvalidPreflight(features);
248270
testInvalidPreclaim(features);
249271
testInvoke(features);
272+
testUsingTickets(features);
250273
}
251274
};
252275

src/test/app/SetHook_test.cpp

+28-2
Original file line numberDiff line numberDiff line change
@@ -1540,6 +1540,32 @@ class SetHook_test : public beast::unit_test::suite
15401540
}
15411541
}
15421542

1543+
void
1544+
testWithTickets()
1545+
{
1546+
testcase("with tickets");
1547+
using namespace jtx;
1548+
1549+
Env env{*this, supported_amendments()};
1550+
1551+
auto const alice = Account{"alice"};
1552+
env.fund(XRP(10000), alice);
1553+
1554+
std::uint32_t aliceTicketSeq{env.seq(alice) + 1};
1555+
env(ticket::create(alice, 10));
1556+
std::uint32_t const aliceSeq{env.seq(alice)};
1557+
env.require(owners(alice, 10));
1558+
1559+
env(ripple::test::jtx::hook(alice, {{hso(accept_wasm)}}, 0),
1560+
HSFEE,
1561+
ticket::use(aliceTicketSeq++),
1562+
ter(tesSUCCESS));
1563+
1564+
env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1565+
BEAST_EXPECT(env.seq(alice) == aliceSeq);
1566+
env.require(owners(alice, 9 + 1));
1567+
}
1568+
15431569
void
15441570
testInferHookSetOperation()
15451571
{
@@ -11400,7 +11426,6 @@ class SetHook_test : public beast::unit_test::suite
1140011426
void
1140111427
run() override
1140211428
{
11403-
// testTicketSetHook(); // RH TODO
1140411429

1140511430
testHooksDisabled();
1140611431
testTxStructure();
@@ -11411,6 +11436,7 @@ class SetHook_test : public beast::unit_test::suite
1141111436
testDelete();
1141211437
testInstall();
1141311438
testCreate();
11439+
testWithTickets();
1141411440

1141511441
testUpdate();
1141611442

@@ -11644,7 +11670,7 @@ class SetHook_test : public beast::unit_test::suite
1164411670

1164511671
HASH_WASM(accept2);
1164611672
};
11647-
BEAST_DEFINE_TESTSUITE(SetHook, tx, ripple);
11673+
BEAST_DEFINE_TESTSUITE(SetHook, app, ripple);
1164811674
} // namespace test
1164911675
} // namespace ripple
1165011676
#undef M

src/test/app/URIToken_test.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -1444,10 +1444,9 @@ struct URIToken_test : public beast::unit_test::suite
14441444
env(buy(bob, hexid, USD(1500)),
14451445
ticket::use(bobTicketSeq++),
14461446
ter(tecINSUFFICIENT_FUNDS));
1447-
env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1447+
env.require(tickets(bob, env.seq(bob) - bobTicketSeq));
14481448

14491449
env(buy(bob, hexid, USD(1000)), ticket::use(bobTicketSeq++));
1450-
14511450
env.require(tickets(bob, env.seq(bob) - bobTicketSeq));
14521451
BEAST_EXPECT(env.seq(bob) == bobSeq);
14531452
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));

0 commit comments

Comments
 (0)