112 testcase(
"LedgerStateFix error cases");
114 using namespace test::jtx;
116 Account
const alice(
"alice");
121 Env env{*
this, testable_amendments() - fixNFTokenPageLinks};
122 env.fund(XRP(1000), alice);
124 auto const linkFixFee = drops(env.current()->fees().increment);
125 env(ledgerStateFix::nftPageLinks(alice, alice),
130 Env env{*
this, testable_amendments()};
131 env.fund(XRP(1000), alice);
133 env(ticket::create(alice, 1));
139 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
140 tx[sfAccountTxnID.jsonName] =
141 "00000000000000000000000000000000"
142 "00000000000000000000000000000000";
143 env(tx, ticket::use(ticketSeq), ter(
temINVALID));
146 env(ledgerStateFix::nftPageLinks(alice, alice), ter(
telINSUF_FEE_P));
149 auto const linkFixFee = drops(env.current()->fees().increment);
150 env(ledgerStateFix::nftPageLinks(alice, alice),
157 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
163 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
164 tx[sfLedgerFixType.jsonName] = 0;
167 tx[sfLedgerFixType.jsonName] = 200;
172 Account
const carol(
"carol");
174 env(ledgerStateFix::nftPageLinks(alice, carol),
234 using namespace test::jtx;
236 Account
const alice(
"alice");
237 Account
const bob(
"bob");
238 Account
const carol(
"carol");
239 Account
const daria(
"daria");
241 Env env{*
this, testable_amendments() - fixNFTokenPageLinks};
242 env.fund(XRP(1000), alice, bob, carol, daria);
251 BEAST_EXPECT(
nftCount(env, alice) == 96);
252 BEAST_EXPECT(ownerCount(env, alice) == 3);
255 uint256 const aliceMiddleNFTokenPageIndex = [&env, &alice]() {
257 return lastNFTokenPage->at(sfPreviousPageMin);
261 for (
int i = 0; i < 32; ++i)
263 env(token::burn(alice, {aliceNFTs[i]}));
267 for (
int i = 0; i < 32; ++i)
269 env(token::burn(alice, {aliceNFTs.
back()}));
273 BEAST_EXPECT(ownerCount(env, alice) == 1);
274 BEAST_EXPECT(
nftCount(env, alice) == 32);
285 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
289 !aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
291 !aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
301 BEAST_EXPECT(
nftCount(env, bob) == 96);
302 BEAST_EXPECT(ownerCount(env, bob) == 3);
305 uint256 const bobMiddleNFTokenPageIndex = [&env, &bob]() {
307 return lastNFTokenPage->at(sfPreviousPageMin);
311 for (
int i = 0; i < 32; ++i)
313 env(token::burn(bob, {bobNFTs.
back()}));
317 BEAST_EXPECT(
nftCount(env, bob) == 64);
318 BEAST_EXPECT(ownerCount(env, bob) == 2);
330 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
334 bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
335 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
345 BEAST_EXPECT(
nftCount(env, carol) == 96);
346 BEAST_EXPECT(ownerCount(env, carol) == 3);
349 uint256 const carolMiddleNFTokenPageIndex = [&env, &carol]() {
351 return lastNFTokenPage->at(sfPreviousPageMin);
357 for (
int i = 0; i < 32; ++i)
361 env(token::createOffer(carol, carolNFTs.
back(), XRP(0)),
365 env(token::acceptSellOffer(daria, offerIndex));
371 BEAST_EXPECT(
nftCount(env, carol) == 64);
372 BEAST_EXPECT(ownerCount(env, carol) == 2);
383 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
386 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
387 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
393 for (
uint256 const& nft : dariaNFTs)
397 env(token::createOffer(carol, nft, drops(1)), token::owner(daria));
400 env(token::acceptBuyOffer(daria, offerIndex));
408 BEAST_EXPECT(
nftCount(env, carol) == 64);
409 BEAST_EXPECT(ownerCount(env, carol) == 3);
415 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
419 carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
421 !carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
428 !carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
429 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
436 auto const linkFixFee = drops(env.current()->fees().increment);
437 env(ledgerStateFix::nftPageLinks(daria, alice),
443 for (
int i = 0; i < 15; ++i)
446 env.enableFeature(fixNFTokenPageLinks);
462 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
466 !aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
468 !aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
477 env(ledgerStateFix::nftPageLinks(daria, alice), fee(linkFixFee));
483 if (!BEAST_EXPECT(aliceLastNFTokenPage))
487 !aliceLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
488 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfNextPageMin));
495 BEAST_EXPECT(
nftCount(env, alice) == 32);
496 BEAST_EXPECT(ownerCount(env, alice) == 1);
511 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
515 bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
516 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
520 env(ledgerStateFix::nftPageLinks(daria, bob), fee(linkFixFee));
527 auto const bobLastNFTokenPage = env.le(lastPageKeylet);
528 if (!BEAST_EXPECT(bobLastNFTokenPage))
531 BEAST_EXPECT(bobLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
533 bobLastNFTokenPage->at(sfPreviousPageMin) !=
534 bobMiddleNFTokenPageIndex);
535 BEAST_EXPECT(!bobLastNFTokenPage->isFieldPresent(sfNextPageMin));
539 bobLastNFTokenPage->at(sfPreviousPageMin)));
540 if (!BEAST_EXPECT(bobNewFirstNFTokenPage))
544 bobNewFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
545 bobNewFirstNFTokenPage->at(sfNextPageMin) ==
548 !bobNewFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
555 BEAST_EXPECT(
nftCount(env, bob) == 64);
556 BEAST_EXPECT(ownerCount(env, bob) == 2);
568 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
572 carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
574 !carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
581 !carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
582 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
586 env(ledgerStateFix::nftPageLinks(carol, carol), fee(linkFixFee));
594 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
598 carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
600 carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin) &&
601 carolMiddleNFTokenPage->at(sfNextPageMin) ==
605 auto carolLastNFTokenPage = env.le(lastPageKeylet);
606 if (!BEAST_EXPECT(carolLastNFTokenPage))
610 carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin) &&
611 carolLastNFTokenPage->at(sfPreviousPageMin) ==
612 carolMiddleNFTokenPageIndex);
613 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
618 carolMiddleNFTokenPage->at(sfPreviousPageMin)));
619 if (!BEAST_EXPECT(carolFirstNFTokenPage))
623 carolFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
624 carolFirstNFTokenPage->at(sfNextPageMin) ==
625 carolMiddleNFTokenPageIndex);
627 !carolFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
631 BEAST_EXPECT(
nftCount(env, carol) == 96);
632 BEAST_EXPECT(ownerCount(env, carol) == 3);