105 testcase(
"LedgerStateFix error cases");
107 using namespace test::jtx;
109 Account
const alice(
"alice");
114 Env env{*
this, testable_amendments() - fixNFTokenPageLinks};
115 env.fund(XRP(1000), alice);
117 auto const linkFixFee = drops(env.current()->fees().increment);
118 env(ledgerStateFix::nftPageLinks(alice, alice), fee(linkFixFee), ter(
temDISABLED));
121 Env env{*
this, testable_amendments()};
122 env.fund(XRP(1000), alice);
124 env(ticket::create(alice, 1));
130 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
131 tx[sfAccountTxnID.jsonName] =
132 "00000000000000000000000000000000"
133 "00000000000000000000000000000000";
134 env(tx, ticket::use(ticketSeq), ter(
temINVALID));
137 env(ledgerStateFix::nftPageLinks(alice, alice), ter(
telINSUF_FEE_P));
140 auto const linkFixFee = drops(env.current()->fees().increment);
145 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
151 Json::Value tx = ledgerStateFix::nftPageLinks(alice, alice);
152 tx[sfLedgerFixType.jsonName] = 0;
155 tx[sfLedgerFixType.jsonName] = 200;
160 Account
const carol(
"carol");
162 env(ledgerStateFix::nftPageLinks(alice, carol), fee(linkFixFee), ter(
tecOBJECT_NOT_FOUND));
214 using namespace test::jtx;
216 Account
const alice(
"alice");
217 Account
const bob(
"bob");
218 Account
const carol(
"carol");
219 Account
const daria(
"daria");
221 Env env{*
this, testable_amendments() - fixNFTokenPageLinks};
222 env.fund(XRP(1000), alice, bob, carol, daria);
231 BEAST_EXPECT(
nftCount(env, alice) == 96);
232 BEAST_EXPECT(ownerCount(env, alice) == 3);
235 uint256 const aliceMiddleNFTokenPageIndex = [&env, &alice]() {
237 return lastNFTokenPage->at(sfPreviousPageMin);
241 for (
int i = 0; i < 32; ++i)
243 env(token::burn(alice, {aliceNFTs[i]}));
247 for (
int i = 0; i < 32; ++i)
249 env(token::burn(alice, {aliceNFTs.
back()}));
253 BEAST_EXPECT(ownerCount(env, alice) == 1);
254 BEAST_EXPECT(
nftCount(env, alice) == 32);
263 auto aliceMiddleNFTokenPage =
265 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
268 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
269 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
279 BEAST_EXPECT(
nftCount(env, bob) == 96);
280 BEAST_EXPECT(ownerCount(env, bob) == 3);
283 uint256 const bobMiddleNFTokenPageIndex = [&env, &bob]() {
285 return lastNFTokenPage->at(sfPreviousPageMin);
289 for (
int i = 0; i < 32; ++i)
291 env(token::burn(bob, {bobNFTs.
back()}));
295 BEAST_EXPECT(
nftCount(env, bob) == 64);
296 BEAST_EXPECT(ownerCount(env, bob) == 2);
307 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
310 BEAST_EXPECT(bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
311 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
321 BEAST_EXPECT(
nftCount(env, carol) == 96);
322 BEAST_EXPECT(ownerCount(env, carol) == 3);
325 uint256 const carolMiddleNFTokenPageIndex = [&env, &carol]() {
327 return lastNFTokenPage->at(sfPreviousPageMin);
333 for (
int i = 0; i < 32; ++i)
336 env(token::createOffer(carol, carolNFTs.
back(), XRP(0)), txflags(
tfSellNFToken));
339 env(token::acceptSellOffer(daria, offerIndex));
345 BEAST_EXPECT(
nftCount(env, carol) == 64);
346 BEAST_EXPECT(ownerCount(env, carol) == 2);
356 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
359 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
360 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
366 for (
uint256 const& nft : dariaNFTs)
369 env(token::createOffer(carol, nft, drops(1)), token::owner(daria));
372 env(token::acceptBuyOffer(daria, offerIndex));
380 BEAST_EXPECT(
nftCount(env, carol) == 64);
381 BEAST_EXPECT(ownerCount(env, carol) == 3);
385 auto carolMiddleNFTokenPage =
387 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
390 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
391 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
397 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
398 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
405 auto const linkFixFee = drops(env.current()->fees().increment);
406 env(ledgerStateFix::nftPageLinks(daria, alice), fee(linkFixFee), ter(
temDISABLED));
410 for (
int i = 0; i < 15; ++i)
413 env.enableFeature(fixNFTokenPageLinks);
427 auto aliceMiddleNFTokenPage =
429 if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
432 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
433 BEAST_EXPECT(!aliceMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
442 env(ledgerStateFix::nftPageLinks(daria, alice), fee(linkFixFee));
448 if (!BEAST_EXPECT(aliceLastNFTokenPage))
451 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
452 BEAST_EXPECT(!aliceLastNFTokenPage->isFieldPresent(sfNextPageMin));
458 BEAST_EXPECT(
nftCount(env, alice) == 32);
459 BEAST_EXPECT(ownerCount(env, alice) == 1);
473 if (!BEAST_EXPECT(bobMiddleNFTokenPage))
476 BEAST_EXPECT(bobMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
477 BEAST_EXPECT(!bobMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
481 env(ledgerStateFix::nftPageLinks(daria, bob), fee(linkFixFee));
488 auto const bobLastNFTokenPage = env.le(lastPageKeylet);
489 if (!BEAST_EXPECT(bobLastNFTokenPage))
492 BEAST_EXPECT(bobLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
493 BEAST_EXPECT(bobLastNFTokenPage->at(sfPreviousPageMin) != bobMiddleNFTokenPageIndex);
494 BEAST_EXPECT(!bobLastNFTokenPage->isFieldPresent(sfNextPageMin));
496 auto const bobNewFirstNFTokenPage =
498 if (!BEAST_EXPECT(bobNewFirstNFTokenPage))
502 bobNewFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
503 bobNewFirstNFTokenPage->at(sfNextPageMin) == lastPageKeylet.key);
504 BEAST_EXPECT(!bobNewFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
510 BEAST_EXPECT(
nftCount(env, bob) == 64);
511 BEAST_EXPECT(ownerCount(env, bob) == 2);
521 auto carolMiddleNFTokenPage =
523 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
526 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
527 BEAST_EXPECT(!carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin));
533 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
534 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
538 env(ledgerStateFix::nftPageLinks(carol, carol), fee(linkFixFee));
544 auto carolMiddleNFTokenPage =
546 if (!BEAST_EXPECT(carolMiddleNFTokenPage))
549 BEAST_EXPECT(carolMiddleNFTokenPage->isFieldPresent(sfPreviousPageMin));
551 carolMiddleNFTokenPage->isFieldPresent(sfNextPageMin) &&
552 carolMiddleNFTokenPage->at(sfNextPageMin) == lastPageKeylet.key);
555 auto carolLastNFTokenPage = env.le(lastPageKeylet);
556 if (!BEAST_EXPECT(carolLastNFTokenPage))
560 carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin) &&
561 carolLastNFTokenPage->at(sfPreviousPageMin) == carolMiddleNFTokenPageIndex);
562 BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
565 auto carolFirstNFTokenPage =
567 if (!BEAST_EXPECT(carolFirstNFTokenPage))
571 carolFirstNFTokenPage->isFieldPresent(sfNextPageMin) &&
572 carolFirstNFTokenPage->at(sfNextPageMin) == carolMiddleNFTokenPageIndex);
573 BEAST_EXPECT(!carolFirstNFTokenPage->isFieldPresent(sfPreviousPageMin));
577 BEAST_EXPECT(
nftCount(env, carol) == 96);
578 BEAST_EXPECT(ownerCount(env, carol) == 3);