131 testcase(
"LedgerStateFix error cases");
133 using namespace test::jtx;
135 Account
const alice(
"alice");
140 Env env{*
this, testable_amendments() - fixNFTokenPageLinks};
141 env.fund(XRP(1000), alice);
143 auto const linkFixFee = drops(env.current()->fees().increment);
144 env(ledgerStateFix::nftPageLinks(alice, alice),
149 Env env{*
this, testable_amendments()};
150 env.fund(XRP(1000), alice);
152 env(ticket::create(alice, 1));
158 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
159 tx[sfAccountTxnID.jsonName] =
160 "00000000000000000000000000000000"
161 "00000000000000000000000000000000";
162 env(tx, ticket::use(ticketSeq), ter(
temINVALID));
165 env(ledgerStateFix::nftPageLinks(alice, alice), ter(
telINSUF_FEE_P));
168 auto const linkFixFee = drops(env.current()->fees().increment);
169 env(ledgerStateFix::nftPageLinks(alice, alice),
176 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
182 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
183 tx[sfLedgerFixType.jsonName] = 0;
186 tx[sfLedgerFixType.jsonName] = 200;
191 Account
const carol(
"carol");
193 env(ledgerStateFix::nftPageLinks(alice, carol),
253 using namespace test::jtx;
255 Account
const alice(
"alice");
256 Account
const bob(
"bob");
257 Account
const carol(
"carol");
258 Account
const daria(
"daria");
260 Env env{*
this, testable_amendments() - fixNFTokenPageLinks};
261 env.fund(XRP(1000), alice, bob, carol, daria);
270 BEAST_EXPECT(
nftCount(env, alice) == 96);
271 BEAST_EXPECT(ownerCount(env, alice) == 3);
274 uint256 const aliceMiddleNFTokenPageIndex = [&env, &alice]() {
276 return lastNFTokenPage->at(sfPreviousPageMin);
280 for (
int i = 0; i < 32; ++i)
282 env(token::burn(alice, {aliceNFTs[i]}));
286 for (
int i = 0; i < 32; ++i)
288 env(token::burn(alice, {aliceNFTs.
back()}));
292 BEAST_EXPECT(ownerCount(env, alice) == 1);
293 BEAST_EXPECT(
nftCount(env, alice) == 32);
304 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
308 !aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
310 !aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
320 BEAST_EXPECT(
nftCount(env, bob) == 96);
321 BEAST_EXPECT(ownerCount(env, bob) == 3);
324 uint256 const bobMiddleNFTokenPageIndex = [&env, &bob]() {
326 return lastNFTokenPage->at(sfPreviousPageMin);
330 for (
int i = 0; i < 32; ++i)
332 env(token::burn(bob, {bobNFTs.
back()}));
336 BEAST_EXPECT(
nftCount(env, bob) == 64);
337 BEAST_EXPECT(ownerCount(env, bob) == 2);
349 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
353 bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
354 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
364 BEAST_EXPECT(
nftCount(env, carol) == 96);
365 BEAST_EXPECT(ownerCount(env, carol) == 3);
368 uint256 const carolMiddleNFTokenPageIndex = [&env, &carol]() {
370 return lastNFTokenPage->at(sfPreviousPageMin);
376 for (
int i = 0; i < 32; ++i)
380 env(token::createOffer(carol, carolNFTs.
back(), XRP(0)),
384 env(token::acceptSellOffer(daria, offerIndex));
390 BEAST_EXPECT(
nftCount(env, carol) == 64);
391 BEAST_EXPECT(ownerCount(env, carol) == 2);
402 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
405 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
406 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
412 for (
uint256 const& nft : dariaNFTs)
416 env(token::createOffer(carol, nft, drops(1)), token::owner(daria));
419 env(token::acceptBuyOffer(daria, offerIndex));
427 BEAST_EXPECT(
nftCount(env, carol) == 64);
428 BEAST_EXPECT(ownerCount(env, carol) == 3);
434 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
438 carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
440 !carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
447 !carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
448 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
455 auto const linkFixFee = drops(env.current()->fees().increment);
456 env(ledgerStateFix::nftPageLinks(daria, alice),
462 for (
int i = 0; i < 15; ++i)
465 env.enableFeature(fixNFTokenPageLinks);
481 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
485 !aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
487 !aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
496 env(ledgerStateFix::nftPageLinks(daria, alice), fee(linkFixFee));
502 if (!BEAST_EXPECT(aliceLastNFTokenPage))
506 !aliceLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
507 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfNextPageMin));
514 BEAST_EXPECT(
nftCount(env, alice) == 32);
515 BEAST_EXPECT(ownerCount(env, alice) == 1);
530 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
534 bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
535 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
539 env(ledgerStateFix::nftPageLinks(daria, bob), fee(linkFixFee));
546 auto const bobLastNFTokenPage = env.le(lastPageKeylet);
547 if (!BEAST_EXPECT(bobLastNFTokenPage))
550 BEAST_EXPECT(bobLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
552 bobLastNFTokenPage->at(sfPreviousPageMin) !=
553 bobMiddleNFTokenPageIndex);
554 BEAST_EXPECT(!bobLastNFTokenPage->isFieldPresent(sfNextPageMin));
558 bobLastNFTokenPage->at(sfPreviousPageMin)));
559 if (!BEAST_EXPECT(bobNewFirstNFTokenPage))
563 bobNewFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
564 bobNewFirstNFTokenPage->at(sfNextPageMin) ==
567 !bobNewFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
574 BEAST_EXPECT(
nftCount(env, bob) == 64);
575 BEAST_EXPECT(ownerCount(env, bob) == 2);
587 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
591 carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
593 !carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
600 !carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
601 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
605 env(ledgerStateFix::nftPageLinks(carol, carol), fee(linkFixFee));
613 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
617 carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
619 carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin) &&
620 carolMiddleNFTokenPage->at(sfNextPageMin) ==
624 auto carolLastNFTokenPage = env.le(lastPageKeylet);
625 if (!BEAST_EXPECT(carolLastNFTokenPage))
629 carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin) &&
630 carolLastNFTokenPage->at(sfPreviousPageMin) ==
631 carolMiddleNFTokenPageIndex);
632 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
637 carolMiddleNFTokenPage->at(sfPreviousPageMin)));
638 if (!BEAST_EXPECT(carolFirstNFTokenPage))
642 carolFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
643 carolFirstNFTokenPage->at(sfNextPageMin) ==
644 carolMiddleNFTokenPageIndex);
646 !carolFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
650 BEAST_EXPECT(
nftCount(env, carol) == 96);
651 BEAST_EXPECT(ownerCount(env, carol) == 3);