mirror of
https://github.com/XRPLF/rippled.git
synced 2026-04-29 15:37:57 +00:00
featureDisallowIncoming: Opt-out of incoming Checks, PayChans, NFTokenOffers and Trustlines (#4336)
featureDisallowIncoming is a new amendment that would allow users to opt-out of incoming Checks, Payment Channels, NFTokenOffers, and trust lines. This commit includes tests. Adds four new AccountSet Flags: 1. asfDisallowIncomingNFTOffer 2. asfDisallowIncomingCheck 3. asfDisallowIncomingPayChan 4. asfDisallowIncomingTrustline
This commit is contained in:
@@ -29,6 +29,8 @@ namespace ripple {
|
||||
|
||||
class NFToken_test : public beast::unit_test::suite
|
||||
{
|
||||
FeatureBitset const disallowIncoming{featureDisallowIncoming};
|
||||
|
||||
// Helper function that returns the owner count of an account root.
|
||||
static std::uint32_t
|
||||
ownerCount(test::jtx::Env const& env, test::jtx::Account const& acct)
|
||||
@@ -2975,6 +2977,135 @@ class NFToken_test : public beast::unit_test::suite
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
testCreateOfferDestinationDisallowIncoming(FeatureBitset features)
|
||||
{
|
||||
testcase("Create offer destination disallow incoming");
|
||||
|
||||
using namespace test::jtx;
|
||||
|
||||
// test flag doesn't set unless amendment enabled
|
||||
{
|
||||
Env env{*this, features - disallowIncoming};
|
||||
Account const alice{"alice"};
|
||||
env.fund(XRP(10000), alice);
|
||||
env(fset(alice, asfDisallowIncomingNFTOffer));
|
||||
env.close();
|
||||
auto const sle = env.le(alice);
|
||||
uint32_t flags = sle->getFlags();
|
||||
BEAST_EXPECT(!(flags & lsfDisallowIncomingNFTOffer));
|
||||
}
|
||||
|
||||
Env env{*this, features | disallowIncoming};
|
||||
|
||||
Account const issuer{"issuer"};
|
||||
Account const minter{"minter"};
|
||||
Account const buyer{"buyer"};
|
||||
Account const alice{"alice"};
|
||||
|
||||
env.fund(XRP(1000), issuer, minter, buyer, alice);
|
||||
|
||||
env(token::setMinter(issuer, minter));
|
||||
env.close();
|
||||
|
||||
uint256 const nftokenID =
|
||||
token::getNextID(env, issuer, 0, tfTransferable);
|
||||
env(token::mint(minter, 0),
|
||||
token::issuer(issuer),
|
||||
txflags(tfTransferable));
|
||||
env.close();
|
||||
|
||||
// enable flag
|
||||
env(fset(buyer, asfDisallowIncomingNFTOffer));
|
||||
env.close();
|
||||
|
||||
// a sell offer from the minter to the buyer should be rejected
|
||||
{
|
||||
env(token::createOffer(minter, nftokenID, drops(1)),
|
||||
token::destination(buyer),
|
||||
txflags(tfSellNFToken),
|
||||
ter(tecNO_PERMISSION));
|
||||
env.close();
|
||||
BEAST_EXPECT(ownerCount(env, issuer) == 0);
|
||||
BEAST_EXPECT(ownerCount(env, minter) == 1);
|
||||
BEAST_EXPECT(ownerCount(env, buyer) == 0);
|
||||
}
|
||||
|
||||
// disable the flag
|
||||
env(fclear(buyer, asfDisallowIncomingNFTOffer));
|
||||
env.close();
|
||||
|
||||
// create offer (allowed now) then cancel
|
||||
{
|
||||
uint256 const offerIndex =
|
||||
keylet::nftoffer(minter, env.seq(minter)).key;
|
||||
|
||||
env(token::createOffer(minter, nftokenID, drops(1)),
|
||||
token::destination(buyer),
|
||||
txflags(tfSellNFToken));
|
||||
env.close();
|
||||
|
||||
env(token::cancelOffer(minter, {offerIndex}));
|
||||
env.close();
|
||||
}
|
||||
|
||||
// create offer, enable flag, then cancel
|
||||
{
|
||||
uint256 const offerIndex =
|
||||
keylet::nftoffer(minter, env.seq(minter)).key;
|
||||
|
||||
env(token::createOffer(minter, nftokenID, drops(1)),
|
||||
token::destination(buyer),
|
||||
txflags(tfSellNFToken));
|
||||
env.close();
|
||||
|
||||
env(fset(buyer, asfDisallowIncomingNFTOffer));
|
||||
env.close();
|
||||
|
||||
env(token::cancelOffer(minter, {offerIndex}));
|
||||
env.close();
|
||||
|
||||
env(fclear(buyer, asfDisallowIncomingNFTOffer));
|
||||
env.close();
|
||||
}
|
||||
|
||||
// create offer then transfer
|
||||
{
|
||||
uint256 const offerIndex =
|
||||
keylet::nftoffer(minter, env.seq(minter)).key;
|
||||
|
||||
env(token::createOffer(minter, nftokenID, drops(1)),
|
||||
token::destination(buyer),
|
||||
txflags(tfSellNFToken));
|
||||
env.close();
|
||||
|
||||
env(token::acceptSellOffer(buyer, offerIndex));
|
||||
env.close();
|
||||
}
|
||||
|
||||
// buyer now owns the token
|
||||
|
||||
// enable flag again
|
||||
env(fset(buyer, asfDisallowIncomingNFTOffer));
|
||||
env.close();
|
||||
|
||||
// a random offer to buy the token
|
||||
{
|
||||
env(token::createOffer(alice, nftokenID, drops(1)),
|
||||
token::owner(buyer),
|
||||
ter(tecNO_PERMISSION));
|
||||
env.close();
|
||||
}
|
||||
|
||||
// minter offer to buy the token
|
||||
{
|
||||
env(token::createOffer(minter, nftokenID, drops(1)),
|
||||
token::owner(buyer),
|
||||
ter(tecNO_PERMISSION));
|
||||
env.close();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
testCreateOfferExpiration(FeatureBitset features)
|
||||
{
|
||||
@@ -4929,6 +5060,7 @@ class NFToken_test : public beast::unit_test::suite
|
||||
testMintTaxon(features);
|
||||
testMintURI(features);
|
||||
testCreateOfferDestination(features);
|
||||
testCreateOfferDestinationDisallowIncoming(features);
|
||||
testCreateOfferExpiration(features);
|
||||
testCancelOffers(features);
|
||||
testCancelTooManyOffers(features);
|
||||
@@ -4949,6 +5081,7 @@ public:
|
||||
FeatureBitset const fixNFTDir{fixNFTokenDirV1};
|
||||
|
||||
testWithFeats(all - fixNFTDir);
|
||||
testWithFeats(all - disallowIncoming);
|
||||
testWithFeats(all);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user