106 testcase(
"LedgerStateFix error cases");
108 using namespace test::jtx;
110 Account
const alice(
"alice");
115 Env env{*
this, testable_amendments() - fixNFTokenPageLinks};
116 env.fund(XRP(1000), alice);
118 auto const linkFixFee = drops(env.current()->fees().increment);
119 env(ledgerStateFix::nftPageLinks(alice, alice), fee(linkFixFee), ter(
temDISABLED));
122 Env env{*
this, testable_amendments()};
123 env.fund(XRP(1000), alice);
125 env(ticket::create(alice, 1));
131 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
132 tx[sfAccountTxnID.jsonName] =
133 "00000000000000000000000000000000"
134 "00000000000000000000000000000000";
135 env(tx, ticket::use(ticketSeq), ter(
temINVALID));
138 env(ledgerStateFix::nftPageLinks(alice, alice), ter(
telINSUF_FEE_P));
141 auto const linkFixFee = drops(env.current()->fees().increment);
142 env(ledgerStateFix::nftPageLinks(alice, alice),
149 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
155 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
156 tx[sfLedgerFixType.jsonName] = 0;
159 tx[sfLedgerFixType.jsonName] = 200;
164 Account
const carol(
"carol");
166 env(ledgerStateFix::nftPageLinks(alice, carol), fee(linkFixFee), ter(
tecOBJECT_NOT_FOUND));
218 using namespace test::jtx;
220 Account
const alice(
"alice");
221 Account
const bob(
"bob");
222 Account
const carol(
"carol");
223 Account
const daria(
"daria");
225 Env env{*
this, testable_amendments() - fixNFTokenPageLinks};
226 env.fund(XRP(1000), alice, bob, carol, daria);
235 BEAST_EXPECT(
nftCount(env, alice) == 96);
236 BEAST_EXPECT(ownerCount(env, alice) == 3);
239 uint256 const aliceMiddleNFTokenPageIndex = [&env, &alice]() {
241 return lastNFTokenPage->at(sfPreviousPageMin);
245 for (
int i = 0; i < 32; ++i)
247 env(token::burn(alice, {aliceNFTs[i]}));
251 for (
int i = 0; i < 32; ++i)
253 env(token::burn(alice, {aliceNFTs.
back()}));
257 BEAST_EXPECT(ownerCount(env, alice) == 1);
258 BEAST_EXPECT(
nftCount(env, alice) == 32);
267 auto aliceMiddleNFTokenPage =
269 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
272 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
273 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
283 BEAST_EXPECT(
nftCount(env, bob) == 96);
284 BEAST_EXPECT(ownerCount(env, bob) == 3);
287 uint256 const bobMiddleNFTokenPageIndex = [&env, &bob]() {
289 return lastNFTokenPage->at(sfPreviousPageMin);
293 for (
int i = 0; i < 32; ++i)
295 env(token::burn(bob, {bobNFTs.
back()}));
299 BEAST_EXPECT(
nftCount(env, bob) == 64);
300 BEAST_EXPECT(ownerCount(env, bob) == 2);
310 auto bobMiddleNFTokenPage =
312 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
315 BEAST_EXPECT(bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
316 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
326 BEAST_EXPECT(
nftCount(env, carol) == 96);
327 BEAST_EXPECT(ownerCount(env, carol) == 3);
330 uint256 const carolMiddleNFTokenPageIndex = [&env, &carol]() {
332 return lastNFTokenPage->at(sfPreviousPageMin);
338 for (
int i = 0; i < 32; ++i)
341 env(token::createOffer(carol, carolNFTs.
back(), XRP(0)), txflags(tfSellNFToken));
344 env(token::acceptSellOffer(daria, offerIndex));
350 BEAST_EXPECT(
nftCount(env, carol) == 64);
351 BEAST_EXPECT(ownerCount(env, carol) == 2);
360 auto carolMiddleNFTokenPage =
362 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
365 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
366 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
372 for (
uint256 const& nft : dariaNFTs)
375 env(token::createOffer(carol, nft, drops(1)), token::owner(daria));
378 env(token::acceptBuyOffer(daria, offerIndex));
386 BEAST_EXPECT(
nftCount(env, carol) == 64);
387 BEAST_EXPECT(ownerCount(env, carol) == 3);
391 auto carolMiddleNFTokenPage =
393 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
396 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
397 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
403 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
404 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
411 auto const linkFixFee = drops(env.current()->fees().increment);
412 env(ledgerStateFix::nftPageLinks(daria, alice), fee(linkFixFee), ter(
temDISABLED));
416 for (
int i = 0; i < 15; ++i)
419 env.enableFeature(fixNFTokenPageLinks);
433 auto aliceMiddleNFTokenPage =
435 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
438 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
439 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
448 env(ledgerStateFix::nftPageLinks(daria, alice), fee(linkFixFee));
454 if (!BEAST_EXPECT(aliceLastNFTokenPage))
457 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
458 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfNextPageMin));
465 BEAST_EXPECT(
nftCount(env, alice) == 32);
466 BEAST_EXPECT(ownerCount(env, alice) == 1);
479 auto bobMiddleNFTokenPage =
481 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
484 BEAST_EXPECT(bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
485 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
489 env(ledgerStateFix::nftPageLinks(daria, bob), fee(linkFixFee));
496 auto const bobLastNFTokenPage = env.le(lastPageKeylet);
497 if (!BEAST_EXPECT(bobLastNFTokenPage))
500 BEAST_EXPECT(bobLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
501 BEAST_EXPECT(bobLastNFTokenPage->at(sfPreviousPageMin) != bobMiddleNFTokenPageIndex);
502 BEAST_EXPECT(!bobLastNFTokenPage->isFieldPresent(sfNextPageMin));
504 auto const bobNewFirstNFTokenPage = env.le(
507 if (!BEAST_EXPECT(bobNewFirstNFTokenPage))
511 bobNewFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
512 bobNewFirstNFTokenPage->at(sfNextPageMin) == lastPageKeylet.key);
513 BEAST_EXPECT(!bobNewFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
519 BEAST_EXPECT(
nftCount(env, bob) == 64);
520 BEAST_EXPECT(ownerCount(env, bob) == 2);
530 auto carolMiddleNFTokenPage =
532 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
535 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
536 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
542 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
543 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
547 env(ledgerStateFix::nftPageLinks(carol, carol), fee(linkFixFee));
553 auto carolMiddleNFTokenPage =
555 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
558 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
560 carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin) &&
561 carolMiddleNFTokenPage->at(sfNextPageMin) == lastPageKeylet.key);
564 auto carolLastNFTokenPage = env.le(lastPageKeylet);
565 if (!BEAST_EXPECT(carolLastNFTokenPage))
569 carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin) &&
570 carolLastNFTokenPage->at(sfPreviousPageMin) == carolMiddleNFTokenPageIndex);
571 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
574 auto carolFirstNFTokenPage = env.le(
577 if (!BEAST_EXPECT(carolFirstNFTokenPage))
581 carolFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
582 carolFirstNFTokenPage->at(sfNextPageMin) == carolMiddleNFTokenPageIndex);
583 BEAST_EXPECT(!carolFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
587 BEAST_EXPECT(
nftCount(env, carol) == 96);
588 BEAST_EXPECT(ownerCount(env, carol) == 3);