mirror of
https://github.com/XRPLF/rippled.git
synced 2026-04-18 01:42:26 +00:00
Compare commits
16 Commits
develop
...
mvadari/pa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1961b7f5c8 | ||
|
|
7f8fd583b2 | ||
|
|
62fd25bcf0 | ||
|
|
84fdd322f5 | ||
|
|
b366a1b521 | ||
|
|
0621a12c61 | ||
|
|
40363ce525 | ||
|
|
e78ab82996 | ||
|
|
253918c168 | ||
|
|
a43de47f13 | ||
|
|
c78a68f218 | ||
|
|
1dcbc503d8 | ||
|
|
346fbbd3ac | ||
|
|
a2a66f68ad | ||
|
|
04c141cba5 | ||
|
|
4cdc8561cd |
@@ -20,9 +20,8 @@ private:
|
||||
struct ValueIOU
|
||||
{
|
||||
explicit ValueIOU() = default;
|
||||
|
||||
STAmount lowAcctCredits;
|
||||
STAmount highAcctCredits;
|
||||
STAmount lowAcctDebits;
|
||||
STAmount highAcctDebits;
|
||||
STAmount lowAcctOrigBalance;
|
||||
};
|
||||
|
||||
@@ -229,13 +228,6 @@ public:
|
||||
apply(PaymentSandbox& to);
|
||||
/** @} */
|
||||
|
||||
// Return a map of balance changes on trust lines. The low account is the
|
||||
// first account in the key. If the two accounts are equal, the map contains
|
||||
// the total changes in currency regardless of issuer. This is useful to get
|
||||
// the total change in XRP balances.
|
||||
std::map<std::tuple<AccountID, AccountID, Currency>, STAmount>
|
||||
balanceChanges(ReadView const& view) const;
|
||||
|
||||
XRPAmount
|
||||
xrpDestroyed() const;
|
||||
|
||||
|
||||
@@ -312,29 +312,6 @@ writeDiffs(std::ostringstream& ostr, Iter begin, Iter end)
|
||||
ostr << ']';
|
||||
};
|
||||
|
||||
using BalanceDiffs =
|
||||
std::pair<std::map<std::tuple<AccountID, AccountID, Currency>, STAmount>, XRPAmount>;
|
||||
|
||||
inline BalanceDiffs
|
||||
balanceDiffs(PaymentSandbox const& sb, ReadView const& rv)
|
||||
{
|
||||
return {sb.balanceChanges(rv), sb.xrpDestroyed()};
|
||||
}
|
||||
|
||||
inline std::string
|
||||
balanceDiffsToString(std::optional<BalanceDiffs> const& bd)
|
||||
{
|
||||
if (!bd)
|
||||
return std::string{};
|
||||
auto const& diffs = bd->first;
|
||||
auto const& xrpDestroyed = bd->second;
|
||||
std::ostringstream ostr;
|
||||
ostr << ", xrpDestroyed: " << to_string(xrpDestroyed);
|
||||
ostr << ", balanceDiffs: ";
|
||||
writeDiffs(ostr, diffs.begin(), diffs.end());
|
||||
return ostr.str();
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
} // namespace path
|
||||
} // namespace xrpl
|
||||
|
||||
@@ -505,14 +505,6 @@ public:
|
||||
{
|
||||
return cur_.size();
|
||||
}
|
||||
|
||||
void
|
||||
removeIndex(std::size_t i)
|
||||
{
|
||||
if (i >= next_.size())
|
||||
return;
|
||||
next_.erase(next_.begin() + i);
|
||||
}
|
||||
};
|
||||
/// @endcond
|
||||
|
||||
@@ -637,11 +629,6 @@ flow(
|
||||
std::optional<BestStrand> best;
|
||||
if (flowDebugInfo)
|
||||
flowDebugInfo->newLiquidityPass();
|
||||
// Index of strand to mark as inactive (remove from the active list) if
|
||||
// the liquidity is used. This is used for strands that consume too many
|
||||
// offers Constructed as `false,0` to workaround a gcc warning about
|
||||
// uninitialized variables
|
||||
std::optional<std::size_t> markInactiveOnUse;
|
||||
for (size_t strandIndex = 0, sie = activeStrands.size(); strandIndex != sie; ++strandIndex)
|
||||
{
|
||||
Strand const* strand = activeStrands.get(strandIndex);
|
||||
@@ -705,11 +692,6 @@ flow(
|
||||
|
||||
if (best)
|
||||
{
|
||||
if (markInactiveOnUse)
|
||||
{
|
||||
activeStrands.removeIndex(*markInactiveOnUse);
|
||||
markInactiveOnUse.reset();
|
||||
}
|
||||
savedIns.insert(best->in);
|
||||
savedOuts.insert(best->out);
|
||||
remainingOut = outReq - sum(savedOuts);
|
||||
|
||||
@@ -41,14 +41,14 @@ DeferredCredits::creditIOU(
|
||||
|
||||
if (sender < receiver)
|
||||
{
|
||||
v.highAcctCredits = amount;
|
||||
v.lowAcctCredits = amount.zeroed();
|
||||
v.lowAcctDebits = amount;
|
||||
v.highAcctDebits = amount.zeroed();
|
||||
v.lowAcctOrigBalance = preCreditSenderBalance;
|
||||
}
|
||||
else
|
||||
{
|
||||
v.highAcctCredits = amount.zeroed();
|
||||
v.lowAcctCredits = amount;
|
||||
v.lowAcctDebits = amount.zeroed();
|
||||
v.highAcctDebits = amount;
|
||||
v.lowAcctOrigBalance = -preCreditSenderBalance;
|
||||
}
|
||||
|
||||
@@ -60,11 +60,11 @@ DeferredCredits::creditIOU(
|
||||
auto& v = i->second;
|
||||
if (sender < receiver)
|
||||
{
|
||||
v.highAcctCredits += amount;
|
||||
v.lowAcctDebits += amount;
|
||||
}
|
||||
else
|
||||
{
|
||||
v.lowAcctCredits += amount;
|
||||
v.highAcctDebits += amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -195,11 +195,11 @@ DeferredCredits::adjustmentsIOU(
|
||||
|
||||
if (main < other)
|
||||
{
|
||||
result.emplace(v.highAcctCredits, v.lowAcctCredits, v.lowAcctOrigBalance);
|
||||
result.emplace(v.lowAcctDebits, v.highAcctDebits, v.lowAcctOrigBalance);
|
||||
return result;
|
||||
}
|
||||
|
||||
result.emplace(v.lowAcctCredits, v.highAcctCredits, -v.lowAcctOrigBalance);
|
||||
result.emplace(v.highAcctDebits, v.lowAcctDebits, -v.lowAcctOrigBalance);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -222,8 +222,8 @@ DeferredCredits::apply(DeferredCredits& to)
|
||||
{
|
||||
auto& toVal = r.first->second;
|
||||
auto const& fromVal = i.second;
|
||||
toVal.lowAcctCredits += fromVal.lowAcctCredits;
|
||||
toVal.highAcctCredits += fromVal.highAcctCredits;
|
||||
toVal.lowAcctDebits += fromVal.lowAcctDebits;
|
||||
toVal.highAcctDebits += fromVal.highAcctDebits;
|
||||
// Do not update the orig balance, it's already correct
|
||||
}
|
||||
}
|
||||
@@ -450,131 +450,6 @@ PaymentSandbox::apply(PaymentSandbox& to)
|
||||
tab_.apply(to.tab_);
|
||||
}
|
||||
|
||||
std::map<std::tuple<AccountID, AccountID, Currency>, STAmount>
|
||||
PaymentSandbox::balanceChanges(ReadView const& view) const
|
||||
{
|
||||
using key_t = std::tuple<AccountID, AccountID, Currency>;
|
||||
// Map of delta trust lines. As a special case, when both ends of the trust
|
||||
// line are the same currency, then it's delta currency for that issuer. To
|
||||
// get the change in XRP balance, Account == root, issuer == root, currency
|
||||
// == XRP
|
||||
std::map<key_t, STAmount> result;
|
||||
|
||||
// populate a dictionary with low/high/currency/delta. This can be
|
||||
// compared with the other versions payment code.
|
||||
auto each = [&result](
|
||||
uint256 const& key,
|
||||
bool isDelete,
|
||||
std::shared_ptr<SLE const> const& before,
|
||||
std::shared_ptr<SLE const> const& after) {
|
||||
STAmount oldBalance;
|
||||
STAmount newBalance;
|
||||
AccountID lowID;
|
||||
AccountID highID;
|
||||
|
||||
// before is read from prev view
|
||||
if (isDelete)
|
||||
{
|
||||
if (!before)
|
||||
return;
|
||||
|
||||
auto const bt = before->getType();
|
||||
switch (bt)
|
||||
{
|
||||
case ltACCOUNT_ROOT:
|
||||
lowID = xrpAccount();
|
||||
highID = (*before)[sfAccount];
|
||||
oldBalance = (*before)[sfBalance];
|
||||
newBalance = oldBalance.zeroed();
|
||||
break;
|
||||
case ltRIPPLE_STATE:
|
||||
lowID = (*before)[sfLowLimit].getIssuer();
|
||||
highID = (*before)[sfHighLimit].getIssuer();
|
||||
oldBalance = (*before)[sfBalance];
|
||||
newBalance = oldBalance.zeroed();
|
||||
break;
|
||||
case ltOFFER:
|
||||
// TBD
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (!before)
|
||||
{
|
||||
// insert
|
||||
auto const at = after->getType();
|
||||
switch (at)
|
||||
{
|
||||
case ltACCOUNT_ROOT:
|
||||
lowID = xrpAccount();
|
||||
highID = (*after)[sfAccount];
|
||||
newBalance = (*after)[sfBalance];
|
||||
oldBalance = newBalance.zeroed();
|
||||
break;
|
||||
case ltRIPPLE_STATE:
|
||||
lowID = (*after)[sfLowLimit].getIssuer();
|
||||
highID = (*after)[sfHighLimit].getIssuer();
|
||||
newBalance = (*after)[sfBalance];
|
||||
oldBalance = newBalance.zeroed();
|
||||
break;
|
||||
case ltOFFER:
|
||||
// TBD
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// modify
|
||||
auto const at = after->getType();
|
||||
XRPL_ASSERT(
|
||||
at == before->getType(),
|
||||
"xrpl::PaymentSandbox::balanceChanges : after and before "
|
||||
"types matching");
|
||||
switch (at)
|
||||
{
|
||||
case ltACCOUNT_ROOT:
|
||||
lowID = xrpAccount();
|
||||
highID = (*after)[sfAccount];
|
||||
oldBalance = (*before)[sfBalance];
|
||||
newBalance = (*after)[sfBalance];
|
||||
break;
|
||||
case ltRIPPLE_STATE:
|
||||
lowID = (*after)[sfLowLimit].getIssuer();
|
||||
highID = (*after)[sfHighLimit].getIssuer();
|
||||
oldBalance = (*before)[sfBalance];
|
||||
newBalance = (*after)[sfBalance];
|
||||
break;
|
||||
case ltOFFER:
|
||||
// TBD
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
// The following are now set, put them in the map
|
||||
auto delta = newBalance - oldBalance;
|
||||
auto const cur = newBalance.get<Issue>().currency;
|
||||
result[std::make_tuple(lowID, highID, cur)] = delta;
|
||||
auto r = result.emplace(std::make_tuple(lowID, lowID, cur), delta);
|
||||
if (r.second)
|
||||
{
|
||||
r.first->second += delta;
|
||||
}
|
||||
|
||||
delta.negate();
|
||||
r = result.emplace(std::make_tuple(highID, highID, cur), delta);
|
||||
if (r.second)
|
||||
{
|
||||
r.first->second += delta;
|
||||
}
|
||||
};
|
||||
items_.visit(view, each);
|
||||
return result;
|
||||
}
|
||||
|
||||
XRPAmount
|
||||
PaymentSandbox::xrpDestroyed() const
|
||||
{
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <xrpl/protocol/Feature.h>
|
||||
#include <xrpl/protocol/Indexes.h>
|
||||
#include <xrpl/protocol/LedgerFormats.h>
|
||||
#include <xrpl/protocol/Protocol.h>
|
||||
#include <xrpl/protocol/SField.h>
|
||||
#include <xrpl/protocol/TxFlags.h>
|
||||
|
||||
@@ -69,7 +70,11 @@ transferRate(ReadView const& view, MPTID const& issuanceID)
|
||||
// which represents 50% of 1,000,000,000
|
||||
if (auto const sle = view.read(keylet::mptIssuance(issuanceID));
|
||||
sle && sle->isFieldPresent(sfTransferFee))
|
||||
return Rate{1'000'000'000u + (10'000 * sle->getFieldU16(sfTransferFee))};
|
||||
{
|
||||
auto const fee = sle->getFieldU16(sfTransferFee);
|
||||
XRPL_ASSERT(fee <= maxTransferFee, "xrpl::transferRate : fee is too large");
|
||||
return Rate{1'000'000'000u + (10'000 * fee)};
|
||||
}
|
||||
|
||||
return parityRate;
|
||||
}
|
||||
@@ -135,7 +140,7 @@ authorizeMPToken(
|
||||
// When a holder wants to unauthorize/delete a MPT, the ledger must
|
||||
// - delete mptokenKey from owner directory
|
||||
// - delete the MPToken
|
||||
if ((flags & tfMPTUnauthorize) != 0)
|
||||
if ((flags & tfMPTUnauthorize) != 0u)
|
||||
{
|
||||
auto const mptokenKey = keylet::mptoken(mptIssuanceID, account);
|
||||
auto const sleMpt = view.peek(mptokenKey);
|
||||
@@ -217,7 +222,7 @@ authorizeMPToken(
|
||||
|
||||
// Issuer wants to unauthorize the holder, unset lsfMPTAuthorized on
|
||||
// their MPToken
|
||||
if ((flags & tfMPTUnauthorize) != 0)
|
||||
if ((flags & tfMPTUnauthorize) != 0u)
|
||||
{
|
||||
flagsOut &= ~lsfMPTAuthorized;
|
||||
}
|
||||
|
||||
@@ -594,7 +594,6 @@ OfferCreate::applyGuts(Sandbox& sb, Sandbox& sbCancel)
|
||||
return {tecEXPIRED, true};
|
||||
}
|
||||
|
||||
bool const bOpenLedger = sb.open();
|
||||
bool crossed = false;
|
||||
|
||||
if (isTesSuccess(result))
|
||||
@@ -683,7 +682,7 @@ OfferCreate::applyGuts(Sandbox& sb, Sandbox& sbCancel)
|
||||
stream << " out: " << format_amount(place_offer.out);
|
||||
}
|
||||
|
||||
if (result == tecFAILED_PROCESSING && bOpenLedger)
|
||||
if (result == tecFAILED_PROCESSING && sb.open())
|
||||
result = telFAILED_PROCESSING;
|
||||
|
||||
if (!isTesSuccess(result))
|
||||
|
||||
@@ -401,6 +401,7 @@ Payment::doApply()
|
||||
sleDst = std::make_shared<SLE>(k);
|
||||
sleDst->setAccountID(sfAccount, dstAccountID);
|
||||
sleDst->setFieldU32(sfSequence, view().seq());
|
||||
sleDst->setFieldAmount(sfBalance, XRPAmount(beast::zero));
|
||||
|
||||
view().insert(sleDst);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user