130 testcase(
"LedgerStateFix error cases");
139 Env env{*
this, testableAmendments() - fixNFTokenPageLinks};
140 env.fund(XRP(1000), alice);
142 auto const linkFixFee = drops(env.current()->fees().increment);
143 env(ledger_state_fix::nftPageLinks(alice, alice), Fee(linkFixFee), Ter(
temDISABLED));
146 Env env{*
this, testableAmendments()};
147 env.fund(XRP(1000), alice);
149 env(ticket::create(alice, 1));
155 json::Value tx = ledger_state_fix::nftPageLinks(alice, alice);
156 tx[sfAccountTxnID.jsonName] =
157 "00000000000000000000000000000000"
158 "00000000000000000000000000000000";
159 env(tx, ticket::Use(ticketSeq), Ter(
temINVALID));
162 env(ledger_state_fix::nftPageLinks(alice, alice), Ter(
telINSUF_FEE_P));
165 auto const linkFixFee = drops(env.current()->fees().increment);
166 env(ledger_state_fix::nftPageLinks(alice, alice),
173 json::Value tx = ledger_state_fix::nftPageLinks(alice, alice);
180 json::Value tx = ledger_state_fix::nftPageLinks(alice, alice);
186 json::Value tx = ledger_state_fix::nftPageLinks(alice, alice);
187 tx[sfLedgerFixType.jsonName] = 0;
190 tx[sfLedgerFixType.jsonName] = 200;
197 env(ledger_state_fix::nftPageLinks(alice, carol),
264 Env env{*
this, testableAmendments() - fixNFTokenPageLinks};
265 env.fund(XRP(1000), alice, bob, carol, daria);
274 BEAST_EXPECT(
nftCount(env, alice) == 96);
278 uint256 const aliceMiddleNFTokenPageIndex = [&env, &alice]() {
280 return lastNFTokenPage->at(sfPreviousPageMin);
284 for (
int i = 0; i < 32; ++i)
286 env(token::burn(alice, {aliceNFTs[i]}));
290 for (
int i = 0; i < 32; ++i)
292 env(token::burn(alice, {aliceNFTs.
back()}));
297 BEAST_EXPECT(
nftCount(env, alice) == 32);
306 auto aliceMiddleNFTokenPage = env.le(
308 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
311 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
312 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
322 BEAST_EXPECT(
nftCount(env, bob) == 96);
326 uint256 const bobMiddleNFTokenPageIndex = [&env, &bob]() {
328 return lastNFTokenPage->at(sfPreviousPageMin);
332 for (
int i = 0; i < 32; ++i)
334 env(token::burn(bob, {bobNFTs.
back()}));
338 BEAST_EXPECT(
nftCount(env, bob) == 64);
349 auto bobMiddleNFTokenPage =
351 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
354 BEAST_EXPECT(bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
355 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
365 BEAST_EXPECT(
nftCount(env, carol) == 96);
369 uint256 const carolMiddleNFTokenPageIndex = [&env, &carol]() {
371 return lastNFTokenPage->at(sfPreviousPageMin);
377 for (
int i = 0; i < 32; ++i)
381 env(token::createOffer(carol, carolNFTs.
back(), XRP(0)), Txflags(tfSellNFToken));
384 env(token::acceptSellOffer(daria, offerIndex));
390 BEAST_EXPECT(
nftCount(env, carol) == 64);
400 auto carolMiddleNFTokenPage =
402 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
405 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
406 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
416 env(token::createOffer(carol,
nft, drops(1)), token::Owner(daria));
419 env(token::acceptBuyOffer(daria, offerIndex));
427 BEAST_EXPECT(
nftCount(env, carol) == 64);
432 auto carolMiddleNFTokenPage = env.le(
434 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
437 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
438 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
444 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
445 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
452 auto const linkFixFee = drops(env.current()->fees().increment);
453 env(ledger_state_fix::nftPageLinks(daria, alice), Fee(linkFixFee), Ter(
temDISABLED));
457 for (
int i = 0; i < 15; ++i)
460 env.enableFeature(fixNFTokenPageLinks);
474 auto aliceMiddleNFTokenPage = env.le(
476 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
479 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
480 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
489 env(ledger_state_fix::nftPageLinks(daria, alice), Fee(linkFixFee));
495 if (!BEAST_EXPECT(aliceLastNFTokenPage))
498 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
499 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfNextPageMin));
503 BEAST_EXPECT(!env.le(
506 BEAST_EXPECT(
nftCount(env, alice) == 32);
520 auto bobMiddleNFTokenPage =
522 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
525 BEAST_EXPECT(bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
526 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
530 env(ledger_state_fix::nftPageLinks(daria, bob), Fee(linkFixFee));
537 auto const bobLastNFTokenPage = env.le(lastPageKeylet);
538 if (!BEAST_EXPECT(bobLastNFTokenPage))
541 BEAST_EXPECT(bobLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
542 BEAST_EXPECT(bobLastNFTokenPage->at(sfPreviousPageMin) != bobMiddleNFTokenPageIndex);
543 BEAST_EXPECT(!bobLastNFTokenPage->isFieldPresent(sfNextPageMin));
545 auto const bobNewFirstNFTokenPage = env.le(
548 if (!BEAST_EXPECT(bobNewFirstNFTokenPage))
552 bobNewFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
553 bobNewFirstNFTokenPage->at(sfNextPageMin) == lastPageKeylet.key);
554 BEAST_EXPECT(!bobNewFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
561 BEAST_EXPECT(
nftCount(env, bob) == 64);
572 auto carolMiddleNFTokenPage = env.le(
574 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
576 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
577 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
583 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
584 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
588 env(ledger_state_fix::nftPageLinks(carol, carol), Fee(linkFixFee));
594 auto carolMiddleNFTokenPage = env.le(
596 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
599 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
601 carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin) &&
602 carolMiddleNFTokenPage->at(sfNextPageMin) == lastPageKeylet.key);
605 auto carolLastNFTokenPage = env.le(lastPageKeylet);
606 if (!BEAST_EXPECT(carolLastNFTokenPage))
610 carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin) &&
611 carolLastNFTokenPage->at(sfPreviousPageMin) == carolMiddleNFTokenPageIndex);
612 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
615 auto carolFirstNFTokenPage = env.le(
618 if (!BEAST_EXPECT(carolFirstNFTokenPage))
622 carolFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
623 carolFirstNFTokenPage->at(sfNextPageMin) == carolMiddleNFTokenPageIndex);
624 BEAST_EXPECT(!carolFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
628 BEAST_EXPECT(
nftCount(env, carol) == 96);