129 testcase(
"LedgerStateFix error cases");
138 Env env{*
this, testableAmendments() - fixNFTokenPageLinks};
139 env.fund(XRP(1000), alice);
141 auto const linkFixFee = drops(env.current()->fees().increment);
142 env(ledgerStateFix::nftPageLinks(alice, alice), Fee(linkFixFee), Ter(
temDISABLED));
145 Env env{*
this, testableAmendments()};
146 env.fund(XRP(1000), alice);
148 env(ticket::create(alice, 1));
154 json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
155 tx[sfAccountTxnID.jsonName] =
156 "00000000000000000000000000000000"
157 "00000000000000000000000000000000";
158 env(tx, ticket::Use(ticketSeq), Ter(
temINVALID));
161 env(ledgerStateFix::nftPageLinks(alice, alice), Ter(
telINSUF_FEE_P));
164 auto const linkFixFee = drops(env.current()->fees().increment);
165 env(ledgerStateFix::nftPageLinks(alice, alice),
172 json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
179 json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
185 json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
186 tx[sfLedgerFixType.jsonName] = 0;
189 tx[sfLedgerFixType.jsonName] = 200;
196 env(ledgerStateFix::nftPageLinks(alice, carol), Fee(linkFixFee), Ter(
tecOBJECT_NOT_FOUND));
255 Env env{*
this, testableAmendments() - fixNFTokenPageLinks};
256 env.fund(XRP(1000), alice, bob, carol, daria);
265 BEAST_EXPECT(
nftCount(env, alice) == 96);
266 BEAST_EXPECT(ownerCount(env, alice) == 3);
269 uint256 const aliceMiddleNFTokenPageIndex = [&env, &alice]() {
271 return lastNFTokenPage->at(sfPreviousPageMin);
275 for (
int i = 0; i < 32; ++i)
277 env(token::burn(alice, {aliceNFTs[i]}));
281 for (
int i = 0; i < 32; ++i)
283 env(token::burn(alice, {aliceNFTs.
back()}));
287 BEAST_EXPECT(ownerCount(env, alice) == 1);
288 BEAST_EXPECT(
nftCount(env, alice) == 32);
297 auto aliceMiddleNFTokenPage = env.le(
299 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
302 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
303 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
313 BEAST_EXPECT(
nftCount(env, bob) == 96);
314 BEAST_EXPECT(ownerCount(env, bob) == 3);
317 uint256 const bobMiddleNFTokenPageIndex = [&env, &bob]() {
319 return lastNFTokenPage->at(sfPreviousPageMin);
323 for (
int i = 0; i < 32; ++i)
325 env(token::burn(bob, {bobNFTs.
back()}));
329 BEAST_EXPECT(
nftCount(env, bob) == 64);
330 BEAST_EXPECT(ownerCount(env, bob) == 2);
340 auto bobMiddleNFTokenPage =
342 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
345 BEAST_EXPECT(bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
346 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
356 BEAST_EXPECT(
nftCount(env, carol) == 96);
357 BEAST_EXPECT(ownerCount(env, carol) == 3);
360 uint256 const carolMiddleNFTokenPageIndex = [&env, &carol]() {
362 return lastNFTokenPage->at(sfPreviousPageMin);
368 for (
int i = 0; i < 32; ++i)
371 env(token::createOffer(carol, carolNFTs.
back(), XRP(0)), Txflags(tfSellNFToken));
374 env(token::acceptSellOffer(daria, offerIndex));
380 BEAST_EXPECT(
nftCount(env, carol) == 64);
381 BEAST_EXPECT(ownerCount(env, carol) == 2);
390 auto carolMiddleNFTokenPage =
392 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
395 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
396 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
405 env(token::createOffer(carol,
nft, drops(1)), token::Owner(daria));
408 env(token::acceptBuyOffer(daria, offerIndex));
416 BEAST_EXPECT(
nftCount(env, carol) == 64);
417 BEAST_EXPECT(ownerCount(env, carol) == 3);
421 auto carolMiddleNFTokenPage = env.le(
423 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
426 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
427 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
433 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
434 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
441 auto const linkFixFee = drops(env.current()->fees().increment);
442 env(ledgerStateFix::nftPageLinks(daria, alice), Fee(linkFixFee), Ter(
temDISABLED));
446 for (
int i = 0; i < 15; ++i)
449 env.enableFeature(fixNFTokenPageLinks);
463 auto aliceMiddleNFTokenPage = env.le(
465 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
468 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
469 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
478 env(ledgerStateFix::nftPageLinks(daria, alice), Fee(linkFixFee));
484 if (!BEAST_EXPECT(aliceLastNFTokenPage))
487 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
488 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfNextPageMin));
492 BEAST_EXPECT(!env.le(
495 BEAST_EXPECT(
nftCount(env, alice) == 32);
496 BEAST_EXPECT(ownerCount(env, alice) == 1);
509 auto bobMiddleNFTokenPage =
511 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
514 BEAST_EXPECT(bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
515 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
519 env(ledgerStateFix::nftPageLinks(daria, bob), Fee(linkFixFee));
526 auto const bobLastNFTokenPage = env.le(lastPageKeylet);
527 if (!BEAST_EXPECT(bobLastNFTokenPage))
530 BEAST_EXPECT(bobLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
531 BEAST_EXPECT(bobLastNFTokenPage->at(sfPreviousPageMin) != bobMiddleNFTokenPageIndex);
532 BEAST_EXPECT(!bobLastNFTokenPage->isFieldPresent(sfNextPageMin));
534 auto const bobNewFirstNFTokenPage = env.le(
537 if (!BEAST_EXPECT(bobNewFirstNFTokenPage))
541 bobNewFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
542 bobNewFirstNFTokenPage->at(sfNextPageMin) == lastPageKeylet.key);
543 BEAST_EXPECT(!bobNewFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
550 BEAST_EXPECT(
nftCount(env, bob) == 64);
551 BEAST_EXPECT(ownerCount(env, bob) == 2);
561 auto carolMiddleNFTokenPage = env.le(
563 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
565 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
566 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
572 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
573 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
577 env(ledgerStateFix::nftPageLinks(carol, carol), Fee(linkFixFee));
583 auto carolMiddleNFTokenPage = env.le(
585 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
588 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
590 carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin) &&
591 carolMiddleNFTokenPage->at(sfNextPageMin) == lastPageKeylet.key);
594 auto carolLastNFTokenPage = env.le(lastPageKeylet);
595 if (!BEAST_EXPECT(carolLastNFTokenPage))
599 carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin) &&
600 carolLastNFTokenPage->at(sfPreviousPageMin) == carolMiddleNFTokenPageIndex);
601 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
604 auto carolFirstNFTokenPage = env.le(
607 if (!BEAST_EXPECT(carolFirstNFTokenPage))
611 carolFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
612 carolFirstNFTokenPage->at(sfNextPageMin) == carolMiddleNFTokenPageIndex);
613 BEAST_EXPECT(!carolFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
617 BEAST_EXPECT(
nftCount(env, carol) == 96);
618 BEAST_EXPECT(ownerCount(env, carol) == 3);