42 auto const nftID{token::getNextID(env, account, 0u, tfTransferable, xfee)};
43 env(token::mint(account, 0), token::XferFee(xfee), Txflags(tfTransferable));
47 env(token::createOffer(account, nftID, currency), Txflags(tfSellNFToken));
57 testcase(
"Unauthorized seller tries to accept buy offer");
60 Env env(*
this, features);
64 auto const usd{g1[
"USD"]};
66 env.fund(XRP(10000), g1, a1, a2);
67 env(fset(g1, asfRequireAuth));
70 auto const limit = usd(10000);
72 env(trust(a1, limit));
73 env(trust(g1, limit, a1, tfSetfAuth));
74 env(pay(g1, a1, usd(1000)));
81 env(token::createOffer(a1, nftID, usd(10)), token::Owner(a2));
83 if (features[fixEnforceNFTokenTrustlineV2])
86 env(token::acceptBuyOffer(a2, buyIdx), Ter(
tecNO_LINE));
90 env(trust(a2, limit));
93 env(token::acceptBuyOffer(a2, buyIdx), Ter(
tecNO_AUTH));
100 env(token::acceptBuyOffer(a2, buyIdx));
103 BEAST_EXPECT(env.balance(a2, usd) == usd(10));
110 testcase(
"Unauthorized buyer tries to create buy offer");
113 Env env(*
this, features);
117 auto const usd{g1[
"USD"]};
119 env.fund(XRP(10000), g1, a1, a2);
120 env(fset(g1, asfRequireAuth));
126 env(token::createOffer(a1, nftID, usd(10)), token::Owner(a2), Ter(
tecUNFUNDED_OFFER));
134 sleA1->setFieldAmount(sfBalance, a1[
"USD"](-1000));
138 env.app().getOpenLedger().modify(unauthTrustline);
140 if (features[fixEnforceNFTokenTrustlineV2])
143 env(token::createOffer(a1, nftID, usd(10)), token::Owner(a2), Ter(
tecNO_AUTH));
149 env(token::createOffer(a1, nftID, usd(10)), token::Owner(a2));
156 testcase(
"Seller tries to accept buy offer from unauth buyer");
159 Env env(*
this, features);
163 auto const usd{g1[
"USD"]};
165 env.fund(XRP(10000), g1, a1, a2);
166 env(fset(g1, asfRequireAuth));
169 auto const limit = usd(10000);
174 env(trust(a1, limit));
175 env(trust(g1, limit, a1, tfSetfAuth));
176 env(pay(g1, a1, usd(10)));
177 env(trust(a2, limit));
178 env(trust(g1, limit, a2, tfSetfAuth));
179 env(pay(g1, a2, usd(10)));
183 env(token::createOffer(a1, nftID, usd(10)), token::Owner(a2));
186 env(pay(a1, g1, usd(10)));
187 env(trust(a1, usd(0)));
188 env(trust(g1, a1[
"USD"](0)));
197 sleA1->setFieldAmount(sfBalance, a1[
"USD"](-1000));
201 env.app().getOpenLedger().modify(unauthTrustline);
202 if (features[fixEnforceNFTokenTrustlineV2])
205 env(token::acceptBuyOffer(a2, buyIdx), Ter(
tecNO_AUTH));
213 "Authorized buyer tries to accept sell offer from unauthorized "
217 Env env(*
this, features);
221 auto const usd{g1[
"USD"]};
223 env.fund(XRP(10000), g1, a1, a2);
224 env(fset(g1, asfRequireAuth));
227 auto const limit = usd(10000);
229 env(trust(a1, limit));
230 env(trust(g1, limit, a1, tfSetfAuth));
231 env(pay(g1, a1, usd(1000)));
234 if (features[fixEnforceNFTokenTrustlineV2])
238 env(token::createOffer(a2, nftID, usd(10)), Txflags(tfSellNFToken), Ter(
tecNO_LINE));
240 env(trust(a2, limit));
242 env(token::createOffer(a2, nftID, usd(10)), Txflags(tfSellNFToken), Ter(
tecNO_AUTH));
245 env(trust(g1, usd(0), a2, tfSetfAuth));
248 env(token::createOffer(a2, nftID, usd(10)), Txflags(tfSellNFToken));
254 env(trust(a2, usd(0)));
258 env(token::acceptSellOffer(a1, sellIdx), Ter(
tecNO_LINE));
262 env(trust(a2, limit));
266 env(token::acceptSellOffer(a1, sellIdx), Ter(
tecNO_AUTH));
274 env(token::createOffer(a2, nftID, usd(10)), Txflags(tfSellNFToken));
279 env(token::acceptSellOffer(a1, sellIdx));
282 BEAST_EXPECT(env.balance(a2, usd) == usd(10));
289 testcase(
"Unauthorized buyer tries to accept sell offer");
292 Env env(*
this, features);
296 auto const usd{g1[
"USD"]};
298 env.fund(XRP(10000), g1, a1, a2);
299 env(fset(g1, asfRequireAuth));
302 auto const limit = usd(10000);
304 env(trust(a2, limit));
305 env(trust(g1, limit, a2, tfSetfAuth));
317 sleA1->setFieldAmount(sfBalance, a1[
"USD"](-1000));
321 env.app().getOpenLedger().modify(unauthTrustline);
322 if (features[fixEnforceNFTokenTrustlineV2])
324 env(token::acceptSellOffer(a1, sellIdx), Ter(
tecNO_AUTH));
331 testcase(
"Unauthorized broker bridges authorized buyer and seller.");
334 Env env(*
this, features);
338 Account const broker{
"broker"};
339 auto const usd{g1[
"USD"]};
341 env.fund(XRP(10000), g1, a1, a2, broker);
342 env(fset(g1, asfRequireAuth));
345 auto const limit = usd(10000);
347 env(trust(a1, limit));
348 env(trust(g1, limit, a1, tfSetfAuth));
349 env(pay(g1, a1, usd(1000)));
350 env(trust(a2, limit));
351 env(trust(g1, limit, a2, tfSetfAuth));
352 env(pay(g1, a2, usd(1000)));
357 env(token::createOffer(a1, nftID, usd(11)), token::Owner(a2));
360 if (features[fixEnforceNFTokenTrustlineV2])
363 env(token::brokerOffers(broker, buyIdx, sellIdx),
364 token::BrokerFee(usd(1)),
369 env(trust(broker, limit));
373 env(token::brokerOffers(broker, buyIdx, sellIdx),
374 token::BrokerFee(usd(1)),
379 env(token::brokerOffers(broker, buyIdx, sellIdx));
385 env(token::brokerOffers(broker, buyIdx, sellIdx), token::BrokerFee(usd(1)));
388 BEAST_EXPECT(env.balance(broker, usd) == usd(1));
396 "Authorized broker tries to bridge offers from unauthorized "
400 Env env(*
this, features);
404 Account const broker{
"broker"};
405 auto const usd{g1[
"USD"]};
407 env.fund(XRP(10000), g1, a1, a2, broker);
408 env(fset(g1, asfRequireAuth));
411 auto const limit = usd(10000);
413 env(trust(a1, limit));
414 env(trust(g1, usd(0), a1, tfSetfAuth));
415 env(pay(g1, a1, usd(1000)));
416 env(trust(a2, limit));
417 env(trust(g1, usd(0), a2, tfSetfAuth));
418 env(pay(g1, a2, usd(1000)));
419 env(trust(broker, limit));
420 env(trust(g1, usd(0), broker, tfSetfAuth));
421 env(pay(g1, broker, usd(1000)));
426 env(token::createOffer(a1, nftID, usd(11)), token::Owner(a2));
430 env(pay(a1, g1, usd(1000)));
431 env(trust(a1, usd(0)));
436 sleA1->setFieldAmount(sfBalance, a1[
"USD"](-1000));
440 env.app().getOpenLedger().modify(unauthTrustline);
442 if (features[fixEnforceNFTokenTrustlineV2])
445 env(token::brokerOffers(broker, buyIdx, sellIdx),
446 token::BrokerFee(usd(1)),
456 "Authorized broker tries to bridge offers from unauthorized "
460 Env env(*
this, features);
464 Account const broker{
"broker"};
465 auto const usd{g1[
"USD"]};
467 env.fund(XRP(10000), g1, a1, a2, broker);
468 env(fset(g1, asfRequireAuth));
471 auto const limit = usd(10000);
473 env(trust(a1, limit));
474 env(trust(g1, limit, a1, tfSetfAuth));
475 env(pay(g1, a1, usd(1000)));
476 env(trust(broker, limit));
477 env(trust(g1, limit, broker, tfSetfAuth));
478 env(pay(g1, broker, usd(1000)));
482 env(trust(g1, usd(0), a2, tfSetfAuth));
487 env(token::createOffer(a1, nftID, usd(11)), token::Owner(a2));
492 env(trust(a2, usd(0)));
495 if (features[fixEnforceNFTokenTrustlineV2])
498 env(token::brokerOffers(broker, buyIdx, sellIdx),
499 token::BrokerFee(usd(1)),
504 env(trust(a2, limit));
508 env(token::brokerOffers(broker, buyIdx, sellIdx),
509 token::BrokerFee(usd(1)),
514 env(token::brokerOffers(broker, buyIdx, sellIdx), Ter(
tecNO_AUTH));
520 env(token::brokerOffers(broker, buyIdx, sellIdx), token::BrokerFee(usd(1)));
523 BEAST_EXPECT(env.balance(a2, usd) == usd(10));
531 testcase(
"Unauthorized minter receives transfer fee.");
534 Env env(*
this, features);
536 Account const minter{
"minter"};
539 auto const usd{g1[
"USD"]};
541 env.fund(XRP(10000), g1, minter, a1, a2);
542 env(fset(g1, asfRequireAuth));
545 auto const limit = usd(10000);
547 env(trust(a1, limit));
548 env(trust(g1, limit, a1, tfSetfAuth));
549 env(pay(g1, a1, usd(1000)));
550 env(trust(a2, limit));
551 env(trust(g1, limit, a2, tfSetfAuth));
552 env(pay(g1, a2, usd(1000)));
554 env(trust(minter, limit));
559 auto const [nftID, minterSellIdx] =
mintAndOfferNFT(env, minter, drops(1), 1);
560 env(token::acceptSellOffer(a1, minterSellIdx));
563 env(token::createOffer(a1, nftID, usd(100)), Txflags(tfSellNFToken));
565 if (features[fixEnforceNFTokenTrustlineV2])
568 env(token::acceptSellOffer(a2, sellIdx), Ter(
tecNO_AUTH));
574 env(token::acceptSellOffer(a2, sellIdx));
577 BEAST_EXPECT(env.balance(minter, usd) == usd(0.001));