20 #include <ripple/protocol/Feature.h>
21 #include <ripple/protocol/jss.h>
22 #include <ripple/protocol/nftPageMask.h>
44 jvParams[jss::ledger_index] =
"current";
45 jvParams[jss::binary] =
false;
50 boost::lexical_cast<std::string>(jvParams));
54 !jrr[jss::result].
isMember(jss::state))
72 std::cout << tokenCount <<
" NFtokens in page "
102 testcase(
"Lopsided splits");
104 using namespace test::jtx;
117 auto exerciseLopsided =
120 Env env{*
this, features};
123 Account
const buyer{
"buyer"};
124 env.fund(XRP(10000), buyer);
129 accounts.
reserve(seeds.size());
134 env.fund(XRP(10000), account);
142 offers.reserve(accounts.
size());
143 for (Account
const& account : accounts)
154 env(token::createOffer(account, nftID, XRP(0)),
155 token::destination(buyer),
161 for (
uint256 const& offer : offers)
163 env(token::acceptSellOffer(buyer, offer));
174 for (
uint256 const& nftID : nftIDs)
178 env(token::createOffer(buyer, nftID, XRP(100)),
182 env(token::cancelOffer(buyer, {offerID}));
188 params[jss::account] = buyer.human();
189 params[jss::type] =
"state";
190 return env.rpc(
"json",
"account_nfts",
to_string(params));
194 buyerNFTs[jss::result][jss::account_nfts].size() ==
197 buyerNFTs[jss::result][jss::account_nfts])
202 auto const foundIter =
203 std::find(nftIDs.begin(), nftIDs.end(), ownedID);
207 if (BEAST_EXPECT(foundIter != nftIDs.end()))
208 nftIDs.erase(foundIter);
213 BEAST_EXPECT(nftIDs.empty());
220 "sp6JS7f14BuwFY8Mw5p3b8jjQBBTK",
221 "sp6JS7f14BuwFY8Mw6F7X3EiGKazu",
222 "sp6JS7f14BuwFY8Mw6FxjntJJfKXq",
223 "sp6JS7f14BuwFY8Mw6eSF1ydEozJg",
224 "sp6JS7f14BuwFY8Mw6koPB91um2ej",
225 "sp6JS7f14BuwFY8Mw6m6D64iwquSe",
227 "sp6JS7f14BuwFY8Mw5rC43sN4adC2",
228 "sp6JS7f14BuwFY8Mw65L9DDQqgebz",
229 "sp6JS7f14BuwFY8Mw65nKvU8pPQNn",
230 "sp6JS7f14BuwFY8Mw6bxZLyTrdipw",
231 "sp6JS7f14BuwFY8Mw6d5abucntSoX",
232 "sp6JS7f14BuwFY8Mw6qXK5awrRRP8",
235 "sp6JS7f14BuwFY8Mw66EBtMxoMcCa",
236 "sp6JS7f14BuwFY8Mw66dGfE9jVfGv",
237 "sp6JS7f14BuwFY8Mw6APdZa7PH566",
238 "sp6JS7f14BuwFY8Mw6C3QX5CZyET5",
239 "sp6JS7f14BuwFY8Mw6CSysFf8GvaR",
240 "sp6JS7f14BuwFY8Mw6c7QSDmoAeRV",
241 "sp6JS7f14BuwFY8Mw6mvonveaZhW7",
242 "sp6JS7f14BuwFY8Mw6vtHHG7dYcXi",
244 "sp6JS7f14BuwFY8Mw66yppUNxESaw",
245 "sp6JS7f14BuwFY8Mw6ATYQvobXiDT",
246 "sp6JS7f14BuwFY8Mw6bis8D1Wa9Uy",
247 "sp6JS7f14BuwFY8Mw6cTiGCWA8Wfa",
248 "sp6JS7f14BuwFY8Mw6eAy2fpXmyYf",
249 "sp6JS7f14BuwFY8Mw6icn58TRs8YG",
251 "sp6JS7f14BuwFY8Mw68tj2eQEWoJt",
252 "sp6JS7f14BuwFY8Mw6AjnAinNnMHT",
253 "sp6JS7f14BuwFY8Mw6CKDUwB4LrhL",
254 "sp6JS7f14BuwFY8Mw6d2yPszEFA6J",
255 "sp6JS7f14BuwFY8Mw6jcBQBH3PfnB",
256 "sp6JS7f14BuwFY8Mw6qxx19KSnN1w",
260 "sp6JS7f14BuwFY8Mw6ut1hFrqWoY5",
267 "sp6JS7f14BuwFY8Mw5p3b8jjQBBTK",
268 "sp6JS7f14BuwFY8Mw6F7X3EiGKazu",
269 "sp6JS7f14BuwFY8Mw6FxjntJJfKXq",
270 "sp6JS7f14BuwFY8Mw6eSF1ydEozJg",
271 "sp6JS7f14BuwFY8Mw6koPB91um2ej",
272 "sp6JS7f14BuwFY8Mw6m6D64iwquSe",
274 "sp6JS7f14BuwFY8Mw5rC43sN4adC2",
275 "sp6JS7f14BuwFY8Mw65L9DDQqgebz",
276 "sp6JS7f14BuwFY8Mw65nKvU8pPQNn",
277 "sp6JS7f14BuwFY8Mw6bxZLyTrdipw",
278 "sp6JS7f14BuwFY8Mw6d5abucntSoX",
279 "sp6JS7f14BuwFY8Mw6qXK5awrRRP8",
282 "sp6JS7f14BuwFY8Mw66EBtMxoMcCa",
283 "sp6JS7f14BuwFY8Mw66dGfE9jVfGv",
284 "sp6JS7f14BuwFY8Mw6APdZa7PH566",
285 "sp6JS7f14BuwFY8Mw6C3QX5CZyET5",
286 "sp6JS7f14BuwFY8Mw6CSysFf8GvaR",
287 "sp6JS7f14BuwFY8Mw6c7QSDmoAeRV",
288 "sp6JS7f14BuwFY8Mw6mvonveaZhW7",
289 "sp6JS7f14BuwFY8Mw6vtHHG7dYcXi",
291 "sp6JS7f14BuwFY8Mw66yppUNxESaw",
292 "sp6JS7f14BuwFY8Mw6ATYQvobXiDT",
293 "sp6JS7f14BuwFY8Mw6bis8D1Wa9Uy",
294 "sp6JS7f14BuwFY8Mw6cTiGCWA8Wfa",
295 "sp6JS7f14BuwFY8Mw6eAy2fpXmyYf",
296 "sp6JS7f14BuwFY8Mw6icn58TRs8YG",
298 "sp6JS7f14BuwFY8Mw68tj2eQEWoJt",
299 "sp6JS7f14BuwFY8Mw6AjnAinNnMHT",
300 "sp6JS7f14BuwFY8Mw6CKDUwB4LrhL",
301 "sp6JS7f14BuwFY8Mw6d2yPszEFA6J",
302 "sp6JS7f14BuwFY8Mw6jcBQBH3PfnB",
303 "sp6JS7f14BuwFY8Mw6qxx19KSnN1w",
307 "sp6JS7f14BuwFY8Mw6xCigaMwC6Dp",
319 exerciseLopsided(splitAndAddToHi);
320 exerciseLopsided(splitAndAddToLo);
328 testcase(
"NFToken too many same");
330 using namespace test::jtx;
332 Env env{*
this, features};
335 Account
const buyer{
"buyer"};
336 env.fund(XRP(10000), buyer);
346 "sp6JS7f14BuwFY8Mw5G5vCrbxB3TZ",
347 "sp6JS7f14BuwFY8Mw5H6qyXhorcip",
348 "sp6JS7f14BuwFY8Mw5suWxsBQRqLx",
349 "sp6JS7f14BuwFY8Mw66gtwamvGgSg",
350 "sp6JS7f14BuwFY8Mw66iNV4PPcmyt",
351 "sp6JS7f14BuwFY8Mw68Qz2P58ybfE",
352 "sp6JS7f14BuwFY8Mw6AYtLXKzi2Bo",
353 "sp6JS7f14BuwFY8Mw6boCES4j62P2",
354 "sp6JS7f14BuwFY8Mw6kv7QDDv7wjw",
355 "sp6JS7f14BuwFY8Mw6mHXMvpBjjwg",
356 "sp6JS7f14BuwFY8Mw6qfGbznyYvVp",
357 "sp6JS7f14BuwFY8Mw6zg6qHKDfSoU",
362 accounts.
reserve(seeds.size());
365 Account
const& account =
367 env.fund(XRP(10000), account);
374 offers.reserve(accounts.
size());
375 for (Account
const& account : accounts)
386 env(token::createOffer(account, nftID, XRP(0)),
387 token::destination(buyer),
394 for (
uint256 const& nftID : nftIDs)
400 for (
uint256 const& offer : offers)
402 env(token::acceptSellOffer(buyer, offer));
410 for (
uint256 const& nftID : nftIDs)
413 env(token::createOffer(buyer, nftID, XRP(100)),
417 env(token::cancelOffer(buyer, {offerID}));
423 params[jss::account] = buyer.human();
424 params[jss::type] =
"state";
425 return env.rpc(
"json",
"account_nfts",
to_string(params));
429 buyerNFTs[jss::result][jss::account_nfts].size() == nftIDs.size());
431 buyerNFTs[jss::result][jss::account_nfts])
436 auto const foundIter =
437 std::find(nftIDs.begin(), nftIDs.end(), ownedID);
441 if (BEAST_EXPECT(foundIter != nftIDs.end()))
442 nftIDs.erase(foundIter);
446 BEAST_EXPECT(nftIDs.empty());
460 using namespace test::jtx;
461 auto const sa = supported_amendments();