16 using namespace test::jtx;
17 auto const nftID{token::getNextID(env, account, 0u, tfTransferable, xfee)};
18 env(token::mint(account, 0), token::xferFee(xfee), txflags(tfTransferable));
22 env(token::createOffer(account, nftID, currency), txflags(tfSellNFToken));
32 testcase(
"Unauthorized seller tries to accept buy offer");
33 using namespace test::jtx;
35 Env env(*
this, features);
36 Account
const G1{
"G1"};
37 Account
const A1{
"A1"};
38 Account
const A2{
"A2"};
39 auto const USD{G1[
"USD"]};
41 env.fund(XRP(10000), G1, A1, A2);
42 env(fset(G1, asfRequireAuth));
45 auto const limit = USD(10000);
47 env(trust(A1, limit));
48 env(trust(G1, limit, A1, tfSetfAuth));
49 env(pay(G1, A1, USD(1000)));
56 env(token::createOffer(A1, nftID, USD(10)), token::owner(A2));
58 if (features[fixEnforceNFTokenTrustlineV2])
61 env(token::acceptBuyOffer(A2, buyIdx), ter(
tecNO_LINE));
65 env(trust(A2, limit));
68 env(token::acceptBuyOffer(A2, buyIdx), ter(
tecNO_AUTH));
75 env(token::acceptBuyOffer(A2, buyIdx));
78 BEAST_EXPECT(env.balance(A2, USD) == USD(10));
85 testcase(
"Unauthorized buyer tries to create buy offer");
86 using namespace test::jtx;
88 Env env(*
this, features);
91 Account
const A2{
"A2"};
92 auto const USD{G1[
"USD"]};
94 env.fund(XRP(10000), G1, A1, A2);
95 env(fset(G1, asfRequireAuth));
101 env(token::createOffer(A1, nftID, USD(10)), token::owner(A2), ter(
tecUNFUNDED_OFFER));
109 sleA1->setFieldAmount(sfBalance, A1[
"USD"](-1000));
113 env.app().getOpenLedger().modify(unauthTrustline);
115 if (features[fixEnforceNFTokenTrustlineV2])
118 env(token::createOffer(A1, nftID, USD(10)), token::owner(A2), ter(
tecNO_AUTH));
124 env(token::createOffer(A1, nftID, USD(10)), token::owner(A2));
131 testcase(
"Seller tries to accept buy offer from unauth buyer");
132 using namespace test::jtx;
134 Env env(*
this, features);
137 Account
const A2{
"A2"};
138 auto const USD{G1[
"USD"]};
140 env.fund(XRP(10000), G1, A1, A2);
141 env(fset(G1, asfRequireAuth));
144 auto const limit = USD(10000);
149 env(trust(A1, limit));
150 env(trust(G1, limit, A1, tfSetfAuth));
151 env(pay(G1, A1, USD(10)));
152 env(trust(A2, limit));
153 env(trust(G1, limit, A2, tfSetfAuth));
154 env(pay(G1, A2, USD(10)));
158 env(token::createOffer(A1, nftID, USD(10)), token::owner(A2));
161 env(pay(A1, G1, USD(10)));
162 env(trust(A1, USD(0)));
163 env(trust(G1, A1[
"USD"](0)));
172 sleA1->setFieldAmount(sfBalance, A1[
"USD"](-1000));
176 env.app().getOpenLedger().modify(unauthTrustline);
177 if (features[fixEnforceNFTokenTrustlineV2])
180 env(token::acceptBuyOffer(A2, buyIdx), ter(
tecNO_AUTH));
188 "Authorized buyer tries to accept sell offer from unauthorized "
190 using namespace test::jtx;
192 Env env(*
this, features);
193 Account
const G1{
"G1"};
194 Account
const A1{
"A1"};
195 Account
const A2{
"A2"};
196 auto const USD{G1[
"USD"]};
198 env.fund(XRP(10000), G1, A1, A2);
199 env(fset(G1, asfRequireAuth));
202 auto const limit = USD(10000);
204 env(trust(A1, limit));
205 env(trust(G1, limit, A1, tfSetfAuth));
206 env(pay(G1, A1, USD(1000)));
209 if (features[fixEnforceNFTokenTrustlineV2])
213 env(token::createOffer(A2, nftID, USD(10)), txflags(tfSellNFToken), ter(
tecNO_LINE));
215 env(trust(A2, limit));
217 env(token::createOffer(A2, nftID, USD(10)), txflags(tfSellNFToken), ter(
tecNO_AUTH));
220 env(trust(G1, USD(0), A2, tfSetfAuth));
223 env(token::createOffer(A2, nftID, USD(10)), txflags(tfSellNFToken));
229 env(trust(A2, USD(0)));
233 env(token::acceptSellOffer(A1, sellIdx), ter(
tecNO_LINE));
237 env(trust(A2, limit));
241 env(token::acceptSellOffer(A1, sellIdx), ter(
tecNO_AUTH));
249 env(token::createOffer(A2, nftID, USD(10)), txflags(tfSellNFToken));
254 env(token::acceptSellOffer(A1, sellIdx));
257 BEAST_EXPECT(env.balance(A2, USD) == USD(10));
264 testcase(
"Unauthorized buyer tries to accept sell offer");
265 using namespace test::jtx;
267 Env env(*
this, features);
270 Account
const A2{
"A2"};
271 auto const USD{G1[
"USD"]};
273 env.fund(XRP(10000), G1, A1, A2);
274 env(fset(G1, asfRequireAuth));
277 auto const limit = USD(10000);
279 env(trust(A2, limit));
280 env(trust(G1, limit, A2, tfSetfAuth));
292 sleA1->setFieldAmount(sfBalance, A1[
"USD"](-1000));
296 env.app().getOpenLedger().modify(unauthTrustline);
297 if (features[fixEnforceNFTokenTrustlineV2])
299 env(token::acceptSellOffer(A1, sellIdx), ter(
tecNO_AUTH));
306 testcase(
"Unauthorized broker bridges authorized buyer and seller.");
307 using namespace test::jtx;
309 Env env(*
this, features);
310 Account
const G1{
"G1"};
311 Account
const A1{
"A1"};
312 Account
const A2{
"A2"};
313 Account
const broker{
"broker"};
314 auto const USD{G1[
"USD"]};
316 env.fund(XRP(10000), G1, A1, A2, broker);
317 env(fset(G1, asfRequireAuth));
320 auto const limit = USD(10000);
322 env(trust(A1, limit));
323 env(trust(G1, limit, A1, tfSetfAuth));
324 env(pay(G1, A1, USD(1000)));
325 env(trust(A2, limit));
326 env(trust(G1, limit, A2, tfSetfAuth));
327 env(pay(G1, A2, USD(1000)));
332 env(token::createOffer(A1, nftID, USD(11)), token::owner(A2));
335 if (features[fixEnforceNFTokenTrustlineV2])
338 env(token::brokerOffers(broker, buyIdx, sellIdx),
339 token::brokerFee(USD(1)),
344 env(trust(broker, limit));
348 env(token::brokerOffers(broker, buyIdx, sellIdx),
349 token::brokerFee(USD(1)),
354 env(token::brokerOffers(broker, buyIdx, sellIdx));
360 env(token::brokerOffers(broker, buyIdx, sellIdx), token::brokerFee(USD(1)));
363 BEAST_EXPECT(env.balance(broker, USD) == USD(1));
371 "Authorized broker tries to bridge offers from unauthorized "
373 using namespace test::jtx;
375 Env env(*
this, features);
378 Account
const A2{
"A2"};
379 Account
const broker{
"broker"};
380 auto const USD{G1[
"USD"]};
382 env.fund(XRP(10000), G1, A1, A2, broker);
383 env(fset(G1, asfRequireAuth));
386 auto const limit = USD(10000);
388 env(trust(A1, limit));
389 env(trust(G1, USD(0), A1, tfSetfAuth));
390 env(pay(G1, A1, USD(1000)));
391 env(trust(A2, limit));
392 env(trust(G1, USD(0), A2, tfSetfAuth));
393 env(pay(G1, A2, USD(1000)));
394 env(trust(broker, limit));
395 env(trust(G1, USD(0), broker, tfSetfAuth));
396 env(pay(G1, broker, USD(1000)));
401 env(token::createOffer(A1, nftID, USD(11)), token::owner(A2));
405 env(pay(A1, G1, USD(1000)));
406 env(trust(A1, USD(0)));
411 sleA1->setFieldAmount(sfBalance, A1[
"USD"](-1000));
415 env.app().getOpenLedger().modify(unauthTrustline);
417 if (features[fixEnforceNFTokenTrustlineV2])
420 env(token::brokerOffers(broker, buyIdx, sellIdx),
421 token::brokerFee(USD(1)),
431 "Authorized broker tries to bridge offers from unauthorized "
433 using namespace test::jtx;
435 Env env(*
this, features);
436 Account
const G1{
"G1"};
437 Account
const A1{
"A1"};
438 Account
const A2{
"A2"};
439 Account
const broker{
"broker"};
440 auto const USD{G1[
"USD"]};
442 env.fund(XRP(10000), G1, A1, A2, broker);
443 env(fset(G1, asfRequireAuth));
446 auto const limit = USD(10000);
448 env(trust(A1, limit));
449 env(trust(G1, limit, A1, tfSetfAuth));
450 env(pay(G1, A1, USD(1000)));
451 env(trust(broker, limit));
452 env(trust(G1, limit, broker, tfSetfAuth));
453 env(pay(G1, broker, USD(1000)));
457 env(trust(G1, USD(0), A2, tfSetfAuth));
462 env(token::createOffer(A1, nftID, USD(11)), token::owner(A2));
467 env(trust(A2, USD(0)));
470 if (features[fixEnforceNFTokenTrustlineV2])
473 env(token::brokerOffers(broker, buyIdx, sellIdx),
474 token::brokerFee(USD(1)),
479 env(trust(A2, limit));
483 env(token::brokerOffers(broker, buyIdx, sellIdx),
484 token::brokerFee(USD(1)),
489 env(token::brokerOffers(broker, buyIdx, sellIdx), ter(
tecNO_AUTH));
495 env(token::brokerOffers(broker, buyIdx, sellIdx), token::brokerFee(USD(1)));
498 BEAST_EXPECT(env.balance(A2, USD) == USD(10));
506 testcase(
"Unauthorized minter receives transfer fee.");
507 using namespace test::jtx;
509 Env env(*
this, features);
510 Account
const G1{
"G1"};
511 Account
const minter{
"minter"};
512 Account
const A1{
"A1"};
513 Account
const A2{
"A2"};
514 auto const USD{G1[
"USD"]};
516 env.fund(XRP(10000), G1, minter, A1, A2);
517 env(fset(G1, asfRequireAuth));
520 auto const limit = USD(10000);
522 env(trust(A1, limit));
523 env(trust(G1, limit, A1, tfSetfAuth));
524 env(pay(G1, A1, USD(1000)));
525 env(trust(A2, limit));
526 env(trust(G1, limit, A2, tfSetfAuth));
527 env(pay(G1, A2, USD(1000)));
529 env(trust(minter, limit));
534 auto const [nftID, minterSellIdx] =
mintAndOfferNFT(env, minter, drops(1), 1);
535 env(token::acceptSellOffer(A1, minterSellIdx));
538 env(token::createOffer(A1, nftID, USD(100)), txflags(tfSellNFToken));
540 if (features[fixEnforceNFTokenTrustlineV2])
543 env(token::acceptSellOffer(A2, sellIdx), ter(
tecNO_AUTH));
549 env(token::acceptSellOffer(A2, sellIdx));
552 BEAST_EXPECT(env.balance(minter, USD) == USD(0.001));