mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-01 16:05:52 +00:00
fixes
This commit is contained in:
@@ -437,13 +437,18 @@ EscrowFinish::preflight(PreflightContext const& ctx)
|
||||
{
|
||||
if (!ctx.tx.isFieldPresent(sfOfferSequence))
|
||||
return temMALFORMED;
|
||||
}
|
||||
|
||||
if ((!ctx.tx.isFieldPresent(sfEscrowID) &&
|
||||
!ctx.tx.isFieldPresent(sfOfferSequence)) ||
|
||||
ctx.tx.isFieldPresent(sfEscrowID) &&
|
||||
ctx.tx.isFieldPresent(sfOfferSequence))
|
||||
return temMALFORMED;
|
||||
if (ctx.tx.isFieldPresent(sfEscrowID) && ctx.tx.getFieldU32(sfOfferSequence) != 0)
|
||||
return temMALFORMED;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((!ctx.tx.isFieldPresent(sfEscrowID) &&
|
||||
!ctx.tx.isFieldPresent(sfOfferSequence)) ||
|
||||
ctx.tx.isFieldPresent(sfEscrowID) &&
|
||||
ctx.tx.isFieldPresent(sfOfferSequence))
|
||||
return temMALFORMED;
|
||||
}
|
||||
|
||||
return tesSUCCESS;
|
||||
}
|
||||
@@ -474,17 +479,6 @@ EscrowFinish::doApply()
|
||||
|
||||
bool const fixV1 = view().rules().enabled(fixXahauV1);
|
||||
|
||||
if (!fixV1)
|
||||
{
|
||||
if (escrowID && ctx_.tx[sfOfferSequence] != 0)
|
||||
return temMALFORMED;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (escrowID && offerSequence)
|
||||
return temMALFORMED;
|
||||
}
|
||||
|
||||
Keylet k = escrowID ? Keylet(ltESCROW, *escrowID)
|
||||
: keylet::escrow(ctx_.tx[sfOwner], *offerSequence);
|
||||
|
||||
@@ -725,13 +719,18 @@ EscrowCancel::preflight(PreflightContext const& ctx)
|
||||
{
|
||||
if (!ctx.tx.isFieldPresent(sfOfferSequence))
|
||||
return temMALFORMED;
|
||||
}
|
||||
|
||||
if ((!ctx.tx.isFieldPresent(sfEscrowID) &&
|
||||
!ctx.tx.isFieldPresent(sfOfferSequence)) ||
|
||||
ctx.tx.isFieldPresent(sfEscrowID) &&
|
||||
ctx.tx.isFieldPresent(sfOfferSequence))
|
||||
return temMALFORMED;
|
||||
if (ctx.tx.isFieldPresent(sfEscrowID) && ctx.tx.getFieldU32(sfOfferSequence) != 0)
|
||||
return temMALFORMED;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((!ctx.tx.isFieldPresent(sfEscrowID) &&
|
||||
!ctx.tx.isFieldPresent(sfOfferSequence)) ||
|
||||
ctx.tx.isFieldPresent(sfEscrowID) &&
|
||||
ctx.tx.isFieldPresent(sfOfferSequence))
|
||||
return temMALFORMED;
|
||||
}
|
||||
|
||||
return preflight2(ctx);
|
||||
}
|
||||
@@ -748,16 +747,6 @@ EscrowCancel::doApply()
|
||||
std::optional<std::uint32_t> offerSequence = ctx_.tx[~sfOfferSequence];
|
||||
|
||||
bool const fixV1 = view().rules().enabled(fixXahauV1);
|
||||
if (!fixV1)
|
||||
{
|
||||
if (escrowID && ctx_.tx[sfOfferSequence] != 0)
|
||||
return temMALFORMED;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (escrowID && offerSequence)
|
||||
return temMALFORMED;
|
||||
}
|
||||
|
||||
Keylet k = escrowID ? Keylet(ltESCROW, *escrowID)
|
||||
: keylet::escrow(ctx_.tx[sfOwner], *offerSequence);
|
||||
|
||||
@@ -235,16 +235,12 @@ URIToken::preclaim(PreclaimContext const& ctx)
|
||||
if (purchaseAmount < saleAmount)
|
||||
return tecINSUFFICIENT_PAYMENT;
|
||||
|
||||
if (purchaseAmount.native() && saleAmount->native())
|
||||
if (fixV1)
|
||||
{
|
||||
if (!fixV1)
|
||||
{
|
||||
if (purchaseAmount >
|
||||
(sleOwner->getFieldAmount(sfBalance) - ctx.tx[sfFee]))
|
||||
return tecINSUFFICIENT_FUNDS;
|
||||
}
|
||||
else
|
||||
if (purchaseAmount.native() && saleAmount->native())
|
||||
{
|
||||
// native transfer
|
||||
|
||||
STAmount needed{ctx.view.fees().accountReserve(
|
||||
sle->getFieldU32(sfOwnerCount) + 1)};
|
||||
|
||||
@@ -261,27 +257,44 @@ URIToken::preclaim(PreclaimContext const& ctx)
|
||||
if (needed > sle->getFieldAmount(sfBalance))
|
||||
return tecINSUFFICIENT_FUNDS;
|
||||
}
|
||||
}
|
||||
else if (fixV1)
|
||||
{
|
||||
if (!purchaseAmount.native() && !saleAmount->native())
|
||||
else if (purchaseAmount.native() || saleAmount->native())
|
||||
{
|
||||
// pass IOU
|
||||
// should not be able to happen
|
||||
return tecINTERNAL;
|
||||
}
|
||||
else
|
||||
return tecINTERNAL;
|
||||
{
|
||||
// iou transfer
|
||||
|
||||
STAmount availableFunds{accountFunds(
|
||||
ctx.view, acc, purchaseAmount, fhZERO_IF_FROZEN, ctx.j)};
|
||||
|
||||
if (purchaseAmount > availableFunds)
|
||||
return tecINSUFFICIENT_FUNDS;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// old logic
|
||||
|
||||
if (purchaseAmount.native() && saleAmount->native())
|
||||
{
|
||||
// if it's an xrp sale/purchase then no trustline needed
|
||||
if (purchaseAmount >
|
||||
(sleOwner->getFieldAmount(sfBalance) - ctx.tx[sfFee]))
|
||||
return tecINSUFFICIENT_FUNDS;
|
||||
}
|
||||
else
|
||||
{
|
||||
// iou
|
||||
STAmount availableFunds{accountFunds(
|
||||
ctx.view, acc, purchaseAmount, fhZERO_IF_FROZEN, ctx.j)};
|
||||
|
||||
// execution to here means it's an IOU sale
|
||||
// check if the buyer has the right trustline with an adequate
|
||||
// balance
|
||||
|
||||
STAmount availableFunds{accountFunds(
|
||||
ctx.view, acc, purchaseAmount, fhZERO_IF_FROZEN, ctx.j)};
|
||||
|
||||
if (purchaseAmount > availableFunds)
|
||||
return tecINSUFFICIENT_FUNDS;
|
||||
|
||||
if (purchaseAmount > availableFunds)
|
||||
return tecINSUFFICIENT_FUNDS;
|
||||
}
|
||||
|
||||
}
|
||||
return tesSUCCESS;
|
||||
}
|
||||
|
||||
@@ -484,6 +497,8 @@ URIToken::doApply()
|
||||
if (needed + purchaseAmount < needed)
|
||||
return tecINTERNAL;
|
||||
|
||||
needed += purchaseAmount;
|
||||
|
||||
if (needed > mPriorBalance)
|
||||
return tecINSUFFICIENT_FUNDS;
|
||||
}
|
||||
@@ -503,7 +518,7 @@ URIToken::doApply()
|
||||
|
||||
if (STAmount availableFunds{accountFunds(
|
||||
sb, account_, purchaseAmount, fhZERO_IF_FROZEN, j)};
|
||||
purchaseAmount >= availableFunds)
|
||||
purchaseAmount > availableFunds)
|
||||
return tecINSUFFICIENT_FUNDS;
|
||||
}
|
||||
|
||||
|
||||
@@ -454,7 +454,14 @@ struct URIToken_test : public beast::unit_test::suite
|
||||
using namespace std::literals::chrono_literals;
|
||||
|
||||
// setup env
|
||||
Env env{*this, features};
|
||||
Env env{
|
||||
*this,
|
||||
envconfig(),
|
||||
features,
|
||||
nullptr,
|
||||
beast::severities::kWarning
|
||||
//beast::severities::kTrace
|
||||
};
|
||||
auto const alice = Account("alice");
|
||||
auto const bob = Account("bob");
|
||||
auto const carol = Account("carol");
|
||||
|
||||
Reference in New Issue
Block a user