mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
fix invariants for IOU escrows/paychans
This commit is contained in:
@@ -93,7 +93,8 @@ after(NetClock::time_point now, std::uint32_t mark)
|
|||||||
TxConsequences
|
TxConsequences
|
||||||
EscrowCreate::makeTxConsequences(PreflightContext const& ctx)
|
EscrowCreate::makeTxConsequences(PreflightContext const& ctx)
|
||||||
{
|
{
|
||||||
return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()};
|
return TxConsequences{ctx.tx,
|
||||||
|
isXRP(ctx.tx[sfAmount]) ? ctx.tx[sfAmount].xrp() : beast::zero};
|
||||||
}
|
}
|
||||||
|
|
||||||
NotTEC
|
NotTEC
|
||||||
@@ -270,7 +271,7 @@ EscrowCreate::doApply()
|
|||||||
|
|
||||||
STAmount balance = (*sleLine)[sfBalance];
|
STAmount balance = (*sleLine)[sfBalance];
|
||||||
|
|
||||||
STAmount lockedBalance {sfLockedBalance};
|
STAmount lockedBalance {sfLockedBalance, amount.issue()};
|
||||||
if (sleLine->isFieldPresent(sfLockedBalance))
|
if (sleLine->isFieldPresent(sfLockedBalance))
|
||||||
lockedBalance = (*sleLine)[sfLockedBalance];
|
lockedBalance = (*sleLine)[sfLockedBalance];
|
||||||
|
|
||||||
@@ -343,10 +344,9 @@ EscrowCreate::doApply()
|
|||||||
else if (ctx_.view().rules().enabled(featurePaychanAndEscrowForTokens) && sleLine)
|
else if (ctx_.view().rules().enabled(featurePaychanAndEscrowForTokens) && sleLine)
|
||||||
{
|
{
|
||||||
// update trustline to reflect locked up balance
|
// update trustline to reflect locked up balance
|
||||||
auto const issuer = amount.getIssuer();
|
bool high = account > amount.getIssuer();
|
||||||
bool high = account > issuer;
|
|
||||||
|
|
||||||
STAmount lockedBalance;
|
STAmount lockedBalance {sfLockedBalance, amount.issue()};
|
||||||
|
|
||||||
if (sleLine->isFieldPresent(sfLockedBalance))
|
if (sleLine->isFieldPresent(sfLockedBalance))
|
||||||
lockedBalance = (*sleLine)[sfLockedBalance];
|
lockedBalance = (*sleLine)[sfLockedBalance];
|
||||||
@@ -898,7 +898,11 @@ EscrowCancel::doApply()
|
|||||||
}
|
}
|
||||||
|
|
||||||
sleSrcLine->setFieldAmount(sfBalance, isLow ? finalBalance : -finalBalance);
|
sleSrcLine->setFieldAmount(sfBalance, isLow ? finalBalance : -finalBalance);
|
||||||
sleSrcLine->setFieldAmount(sfLockedBalance, isLow ? finalLockedBalance : -finalLockedBalance);
|
|
||||||
|
if (finalLockedBalance == beast::zero)
|
||||||
|
sleSrcLine->makeFieldAbsent(sfLockedBalance);
|
||||||
|
else
|
||||||
|
sleSrcLine->setFieldAmount(sfLockedBalance, isLow ? finalLockedBalance : -finalLockedBalance);
|
||||||
|
|
||||||
view.update(sleSrcLine);
|
view.update(sleSrcLine);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,11 +95,14 @@ XRPNotCreated::visitEntry(
|
|||||||
drops_ -= (*before)[sfBalance].xrp().drops();
|
drops_ -= (*before)[sfBalance].xrp().drops();
|
||||||
break;
|
break;
|
||||||
case ltPAYCHAN:
|
case ltPAYCHAN:
|
||||||
drops_ -=
|
if (isXRP((*before)[sfAmount]))
|
||||||
((*before)[sfAmount] - (*before)[sfBalance]).xrp().drops();
|
drops_ -=
|
||||||
|
((*before)[sfAmount] - (*before)[sfBalance]).xrp().drops();
|
||||||
break;
|
break;
|
||||||
case ltESCROW:
|
case ltESCROW:
|
||||||
drops_ -= (*before)[sfAmount].xrp().drops();
|
if (isXRP((*before)[sfAmount]))
|
||||||
|
drops_ -=
|
||||||
|
(*before)[sfAmount].xrp().drops();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -114,14 +117,14 @@ XRPNotCreated::visitEntry(
|
|||||||
drops_ += (*after)[sfBalance].xrp().drops();
|
drops_ += (*after)[sfBalance].xrp().drops();
|
||||||
break;
|
break;
|
||||||
case ltPAYCHAN:
|
case ltPAYCHAN:
|
||||||
if (!isDelete)
|
if (!isDelete && isXRP((*after)[sfAmount]))
|
||||||
drops_ += ((*after)[sfAmount] - (*after)[sfBalance])
|
drops_ +=
|
||||||
.xrp()
|
((*after)[sfAmount] - (*after)[sfBalance]).xrp().drops();
|
||||||
.drops();
|
|
||||||
break;
|
break;
|
||||||
case ltESCROW:
|
case ltESCROW:
|
||||||
if (!isDelete)
|
if (!isDelete && isXRP((*after)[sfAmount]))
|
||||||
drops_ += (*after)[sfAmount].xrp().drops();
|
drops_ +=
|
||||||
|
(*after)[sfAmount].xrp().drops();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -281,12 +284,26 @@ NoZeroEscrow::visitEntry(
|
|||||||
|
|
||||||
bool
|
bool
|
||||||
NoZeroEscrow::finalize(
|
NoZeroEscrow::finalize(
|
||||||
STTx const&,
|
STTx const& txn,
|
||||||
TER const,
|
TER const,
|
||||||
XRPAmount const,
|
XRPAmount const,
|
||||||
ReadView const&,
|
ReadView const& rv,
|
||||||
beast::Journal const& j)
|
beast::Journal const& j)
|
||||||
{
|
{
|
||||||
|
// bypass this invariant check for IOU escrows
|
||||||
|
if (bad_ &&
|
||||||
|
rv.rules().enabled(featurePaychanAndEscrowForTokens) &&
|
||||||
|
txn.isFieldPresent(sfTransactionType) &&
|
||||||
|
txn.isFieldPresent(sfAmount))
|
||||||
|
{
|
||||||
|
uint16_t tt = txn.getFieldU16(sfTransactionType);
|
||||||
|
if (tt == ttESCROW_CREATE || tt == ttESCROW_FINISH || tt == ttESCROW_CANCEL)
|
||||||
|
{
|
||||||
|
if (!isXRP(txn.getFieldAmount(sfAmount)))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (bad_)
|
if (bad_)
|
||||||
{
|
{
|
||||||
JLOG(j.fatal()) << "Invariant failed: escrow specifies invalid amount";
|
JLOG(j.fatal()) << "Invariant failed: escrow specifies invalid amount";
|
||||||
|
|||||||
Reference in New Issue
Block a user