Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
shawnxie999 committed Oct 12, 2023
1 parent c915984 commit 19fa8cd
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 3 deletions.
54 changes: 52 additions & 2 deletions src/ripple/app/tx/impl/NFTokenAcceptOffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,21 @@ NFTokenAcceptOffer::pay(
return tesSUCCESS;
}

TER
NFTokenAcceptOffer::checkBuyerReserve(std::shared_ptr<SLE const> const& sleBuyer, std::uint32_t const buyerOwnerCountBefore, bool const buyerSubmittedTx){
auto const buyerReserve = buyerSubmittedTx? mPriorBalance : sleBuyer->getFieldAmount(sfBalance);

auto const buyerOwnerCountAfter = sleBuyer->getFieldU32(sfOwnerCount);
if (buyerOwnerCountAfter > buyerOwnerCountBefore)
{
if (auto const reserve = view().fees().accountReserve(buyerOwnerCountAfter);
buyerReserve < reserve)
return tecINSUFFICIENT_RESERVE;
}

return tesSUCCESS;
}

TER
NFTokenAcceptOffer::acceptOffer(std::shared_ptr<SLE> const& offer)
{
Expand Down Expand Up @@ -343,7 +358,25 @@ NFTokenAcceptOffer::acceptOffer(std::shared_ptr<SLE> const& offer)
!isTesSuccess(ret))
return ret;

return nft::insertToken(view(), buyer, std::move(tokenAndPage->token));
auto const sleBuyer = view().read(keylet::account(buyer));
std::uint32_t const buyerOwnerCountBefore = sleBuyer->getFieldU32(sfOwnerCount);

auto const insertRet = nft::insertToken(view(), buyer, std::move(tokenAndPage->token));

if (view().rules().enabled(fixNFTokenReserve)){
if(auto const ret = checkBuyerReserve(sleBuyer, buyerOwnerCountBefore, buyer == account_);
!isTesSuccess(ret))
return ret;
// if (auto const buyerOwnerCountAfter = sleBuyer->getFieldU32(sfOwnerCount);
// buyerOwnerCountAfter > buyerOwnerCountBefore)
// {
// if (auto const reserve = view().fees().accountReserve(buyerOwnerCountAfter);
// sleBuyer->getFieldAmount(sfBalance) < reserve)
// return tecINSUFFICIENT_RESERVE;
// }
}

return insertRet;
}

TER
Expand Down Expand Up @@ -441,7 +474,24 @@ NFTokenAcceptOffer::doApply()
!isTesSuccess(ret))
return ret;

return nft::insertToken(view(), buyer, std::move(tokenAndPage->token));
auto const sleBuyer = view().read(keylet::account(buyer));
std::uint32_t const buyerOwnerCountBefore = sleBuyer->getFieldU32(sfOwnerCount);

auto const insertRet = nft::insertToken(view(), buyer, std::move(tokenAndPage->token));

if (view().rules().enabled(fixNFTokenReserve)){
if(auto const ret = checkBuyerReserve(sleBuyer, buyerOwnerCountBefore, buyer == account_);
!isTesSuccess(ret))
return ret;
// if (auto const buyerOwnerCountAfter = sleBuyer->getFieldU32(sfOwnerCount);
// buyerOwnerCountAfter > buyerOwnerCountBefore)
// {
// if (auto const reserve = view().fees().accountReserve(buyerOwnerCountAfter);
// sleBuyer->getFieldAmount(sfBalance) < reserve)
// return tecINSUFFICIENT_RESERVE;
// }
}
return insertRet;
}

if (bo)
Expand Down
3 changes: 3 additions & 0 deletions src/ripple/app/tx/impl/NFTokenAcceptOffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ class NFTokenAcceptOffer : public Transactor
std::shared_ptr<SLE> const& buy,
std::shared_ptr<SLE> const& sell);

TER
checkBuyerReserve(std::shared_ptr<SLE const> const& sleBuyer, std::uint32_t const buyerOwnerCountBefore, bool const buyerSubmittedTx);

public:
static constexpr ConsequencesFactoryType ConsequencesFactory{Normal};

Expand Down
3 changes: 2 additions & 1 deletion src/ripple/protocol/Feature.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ namespace detail {
// Feature.cpp. Because it's only used to reserve storage, and determine how
// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
// the actual number of amendments. A LogicError on startup will verify this.
static constexpr std::size_t numFeatures = 63;
static constexpr std::size_t numFeatures = 64;

/** Amendments that this server supports and the default voting behavior.
Whether they are enabled depends on the Rules defined in the validated
Expand Down Expand Up @@ -350,6 +350,7 @@ extern uint256 const fixReducedOffersV1;
extern uint256 const featureClawback;
extern uint256 const featureXChainBridge;
extern uint256 const fixDisallowIncomingV1;
extern uint256 const fixNFTokenReserve;

} // namespace ripple

Expand Down
1 change: 1 addition & 0 deletions src/ripple/protocol/impl/Feature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,7 @@ REGISTER_FEATURE(Clawback, Supported::yes, VoteBehavior::De
REGISTER_FEATURE(AMM, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FEATURE(XChainBridge, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FIX(fixDisallowIncomingV1, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FIX (fixNFTokenReserve, Supported::yes, VoteBehavior::DefaultNo);

// The following amendments are obsolete, but must remain supported
// because they could potentially get enabled.
Expand Down

0 comments on commit 19fa8cd

Please sign in to comment.