1#ifndef XRPL_APP_MISC_LENDINGHELPERS_H_INCLUDED
2#define XRPL_APP_MISC_LENDINGHELPERS_H_INCLUDED
4#include <xrpl/ledger/View.h>
5#include <xrpl/protocol/st.h>
9struct PreflightContext;
24 Number const& periodicPayment,
158 "ripple::LoanState::interestOutstanding",
159 "other values add up correctly");
167template <
class NumberProxy>
175 value =
roundToAsset(asset, value + adjustment, vaultScale);
177 if (*value < beast::zero)
186 return vaultSle->at(sfAssetsTotal).exponent();
191 Asset
const& vaultAsset,
192 Number
const& principalRequested,
195 LoanProperties
const& properties,
200 Number
const& periodicPayment,
201 Number
const& periodicRate,
207 Number
const& periodicPayment,
216 Number
const& totalValueOutstanding,
217 Number
const& principalOutstanding,
218 Number
const& managementFeeOutstanding);
228 Number
const& interest,
234 Number
const& rawPrincipalOutstanding,
235 Number
const& periodicRate,
244 Number
const& periodicPayment,
245 Number
const& periodicRate,
394 Number const& totalValueOutstanding,
395 Number const& principalOutstanding,
396 Number const& managementFeeOutstanding,
397 Number const& periodicPayment,
398 Number const& periodicRate,
404detail::LoanStateDeltas
405operator-(LoanState
const& lhs, LoanState
const& rhs);
408operator-(LoanState
const& lhs, detail::LoanStateDeltas
const& rhs);
411operator+(LoanState
const& lhs, detail::LoanStateDeltas
const& rhs);
416 Number principalOutstanding,
432Expected<LoanPaymentParts, TER>
438 STAmount
const& amount,
A generic endpoint for log messages.
std::chrono::time_point< NetClock > time_point
static constexpr int minExponent
std::shared_ptr< STLedgerEntry const > const & const_ref
std::shared_ptr< STLedgerEntry > const & ref
PaymentComponents computePaymentComponents(Asset const &asset, std::int32_t scale, Number const &totalValueOutstanding, Number const &principalOutstanding, Number const &managementFeeOutstanding, Number const &periodicPayment, Number const &periodicRate, std::uint32_t paymentRemaining, TenthBips16 managementFeeRate)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
static constexpr Number numZero
TenthBips< std::uint32_t > TenthBips32
Number loanPeriodicRate(TenthBips32 interestRate, std::uint32_t paymentInterval)
LoanProperties computeLoanProperties(Asset const &asset, Number principalOutstanding, TenthBips32 interestRate, std::uint32_t paymentInterval, std::uint32_t paymentsRemaining, TenthBips32 managementFeeRate, std::int32_t minimumScale)
int getVaultScale(SLE::const_ref vaultSle)
Number roundPeriodicPayment(Asset const &asset, Number const &periodicPayment, std::int32_t scale)
Ensure the periodic payment is always rounded consistently.
void adjustImpreciseNumber(NumberProxy value, Number const &adjustment, Asset const &asset, int vaultScale)
bool checkLendingProtocolDependencies(PreflightContext const &ctx)
LoanState constructLoanState(Number const &totalValueOutstanding, Number const &principalOutstanding, Number const &managementFeeOutstanding)
static constexpr std::uint32_t secondsInYear
Number roundToAsset(A const &asset, Number const &value, std::int32_t scale, Number::rounding_mode rounding=Number::getround())
Round an arbitrary precision Number to the precision of a given Asset.
Number computeFullPaymentInterest(Number const &rawPrincipalOutstanding, Number const &periodicRate, NetClock::time_point parentCloseTime, std::uint32_t paymentInterval, std::uint32_t prevPaymentDate, std::uint32_t startDate, TenthBips32 closeInterestRate)
bool isRounded(Asset const &asset, Number const &value, std::int32_t scale)
Number computeManagementFee(Asset const &asset, Number const &value, TenthBips32 managementFeeRate, std::int32_t scale)
Number operator-(Number const &x, Number const &y)
LoanState constructRoundedLoanState(SLE::const_ref loan)
Expected< LoanPaymentParts, TER > loanMakePayment(Asset const &asset, ApplyView &view, SLE::ref loan, SLE::const_ref brokerSle, STAmount const &amount, LoanPaymentType const paymentType, beast::Journal j)
constexpr base_uint< Bits, Tag > operator+(base_uint< Bits, Tag > const &a, base_uint< Bits, Tag > const &b)
TER checkLoanGuards(Asset const &vaultAsset, Number const &principalRequested, bool expectInterest, std::uint32_t paymentTotal, LoanProperties const &properties, beast::Journal j)
TERSubset< CanCvtToTER > TER
LoanState computeRawLoanState(Number const &periodicPayment, Number const &periodicRate, std::uint32_t const paymentRemaining, TenthBips32 const managementFeeRate)
LoanPaymentParts & operator+=(LoanPaymentParts const &other)
bool operator==(LoanPaymentParts const &other) const
Number firstPaymentPrincipal
Number managementFeeOwedToBroker
Number totalValueOutstanding
This structure captures the parts of a loan state.
Number interestOutstanding() const
Number principalOutstanding
ExtendedPaymentComponents(PaymentComponents const &p, Number fee, Number interest=numZero)
Number untrackedManagementFee
Number trackedInterestPart() const
PaymentSpecialCase specialCase
Number trackedPrincipalDelta
Number trackedManagementFeeDelta