3#include <xrpl/ledger/View.h>
4#include <xrpl/protocol/Rules.h>
5#include <xrpl/protocol/st.h>
35 Asset const& vaultAsset,
38 std::string_view logPrefix);
143 "xrpl::LoanState::interestOutstanding",
144 "other values add up correctly");
185template <
class NumberProxy>
193 value =
roundToAsset(asset, value + adjustment, vaultScale);
195 if (*value < beast::kZero)
204 return scale(vaultSle->at(sfAssetsTotal), vaultSle->at(sfAsset));
214 vaultSle && vaultSle->getType() == ltVAULT,
"xrpl::minimumBrokerCover : valid Vault sle");
217 vaultSle->at(sfAsset),
224 Asset
const& vaultAsset,
225 Number
const& principalRequested,
228 LoanProperties
const& properties,
234 Number
const& periodicPayment,
235 Number
const& periodicRate,
242 Number
const& totalValueOutstanding,
243 Number
const& principalOutstanding,
244 Number
const& managementFeeOutstanding);
254 Number
const& interest,
260 Number
const& theoreticalPrincipalOutstanding,
261 Number
const& periodicRate,
401std::expected<std::pair<LoanPaymentParts, LoanProperties>,
TER>
406 ExtendedPaymentComponents
const& overpaymentComponents,
408 Number const& periodicPayment,
409 Number const& periodicRate,
423 Number const& periodicRate,
436 Number const& principalOutstanding,
437 Number const& periodicRate,
443 Number const& periodicPayment,
444 Number const& periodicRate,
449 Number const& principalOutstanding,
456 Number const& principalOutstanding,
457 Number const& periodicRate,
463ExtendedPaymentComponents
467 int32_t
const loanScale,
468 Number const& overpayment,
478 Number const& totalValueOutstanding,
479 Number const& principalOutstanding,
480 Number const& managementFeeOutstanding,
481 Number const& periodicPayment,
482 Number const& periodicRate,
488detail::LoanStateDeltas
489operator-(LoanState
const& lhs, LoanState
const& rhs);
492operator-(LoanState
const& lhs, detail::LoanStateDeltas
const& rhs);
495operator+(LoanState
const& lhs, detail::LoanStateDeltas
const& rhs);
501 Number
const& principalOutstanding,
512 Number
const& principalOutstanding,
513 Number
const& periodicRate,
527std::expected<LoanPaymentParts, TER>
533 STAmount
const& amount,
A generic endpoint for log messages.
std::chrono::time_point< NetClock > time_point
Number is a floating point type that can represent a wide range of values.
static constexpr int kMinExponent
Rules controlling protocol behavior.
std::shared_ptr< STLedgerEntry > const & ref
std::shared_ptr< STLedgerEntry const > const & const_ref
Number computePaymentFactor(Rules const &rules, Number const &periodicRate, std::uint32_t paymentsRemaining)
Number loanPrincipalFromPeriodicPayment(Rules const &rules, Number const &periodicPayment, Number const &periodicRate, std::uint32_t paymentsRemaining)
Number computePowerMinusOneHybrid(Number const &periodicRate, std::uint32_t paymentsRemaining)
Number loanPeriodicPayment(Rules const &rules, Number const &principalOutstanding, Number const &periodicRate, std::uint32_t paymentsRemaining)
Number loanAccruedInterest(Number const &principalOutstanding, Number const &periodicRate, NetClock::time_point parentCloseTime, std::uint32_t startDate, std::uint32_t prevPaymentDate, std::uint32_t paymentInterval)
std::pair< Number, Number > computeInterestAndFeeParts(Asset const &asset, Number const &interest, TenthBips16 managementFeeRate, std::int32_t loanScale)
Number loanLatePaymentInterest(Number const &principalOutstanding, TenthBips32 lateInterestRate, NetClock::time_point parentCloseTime, std::uint32_t nextPaymentDueDate)
std::expected< std::pair< LoanPaymentParts, LoanProperties >, TER > tryOverpayment(Rules const &rules, Asset const &asset, std::int32_t loanScale, ExtendedPaymentComponents const &overpaymentComponents, LoanState const &roundedLoanState, Number const &periodicPayment, Number const &periodicRate, std::uint32_t paymentRemaining, TenthBips16 const managementFeeRate, beast::Journal j)
ExtendedPaymentComponents computeOverpaymentComponents(Rules const &rules, Asset const &asset, int32_t const loanScale, Number const &overpayment, TenthBips32 const overpaymentInterestRate, TenthBips32 const overpaymentFeeRate, TenthBips16 const managementFeeRate)
Number computePowerMinusOne(Number const &periodicRate, std::uint32_t paymentsRemaining)
PaymentComponents computePaymentComponents(Rules const &rules, 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 kNumZero
constexpr BaseUInt< Bits, Tag > operator+(BaseUInt< Bits, Tag > const &a, BaseUInt< Bits, Tag > const &b)
Number loanPeriodicRate(TenthBips32 interestRate, std::uint32_t paymentInterval)
TER canApplyToBrokerCover(ReadView const &view, SLE::const_ref sleBroker, Asset const &vaultAsset, STAmount const &amount, beast::Journal j, std::string_view logPrefix)
Broker cover preclaim precision guard (fixCleanup3_2_0).
Number operator-(Number const &x, Number const &y)
constexpr T tenthBipsOfValue(T value, TenthBips< TBips > bips)
int getAssetsTotalScale(SLE::const_ref vaultSle)
void adjustImpreciseNumber(NumberProxy value, Number const &adjustment, Asset const &asset, int vaultScale)
int scale(Number const &number, Asset const &asset)
Get the scale of a Number for a given asset.
Number minimumBrokerCover(Number const &debtTotal, TenthBips32 coverRateMinimum, SLE::const_ref vaultSle)
TenthBips< std::uint32_t > TenthBips32
TenthBips< std::uint16_t > TenthBips16
TER checkLoanGuards(Asset const &vaultAsset, Number const &principalRequested, bool expectInterest, std::uint32_t paymentTotal, LoanProperties const &properties, beast::Journal j)
std::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)
LoanState computeTheoreticalLoanState(Rules const &rules, Number const &periodicPayment, Number const &periodicRate, std::uint32_t const paymentRemaining, TenthBips32 const managementFeeRate)
void roundToAsset(A const &asset, Number &value)
Round an arbitrary precision Number IN PLACE to the precision of a given Asset.
Number roundPeriodicPayment(Asset const &asset, Number const &periodicPayment, std::int32_t scale)
Ensure the periodic payment is always rounded consistently.
LoanState constructRoundedLoanState(SLE::const_ref loan)
Number computeManagementFee(Asset const &asset, Number const &interest, TenthBips32 managementFeeRate, std::int32_t scale)
TERSubset< CanCvtToTER > TER
static constexpr std::uint32_t kSecondsInYear
LoanProperties computeLoanProperties(Rules const &rules, Asset const &asset, Number const &principalOutstanding, TenthBips32 interestRate, std::uint32_t paymentInterval, std::uint32_t paymentsRemaining, TenthBips32 managementFeeRate, std::int32_t minimumScale)
LoanState constructLoanState(Number const &totalValueOutstanding, Number const &principalOutstanding, Number const &managementFeeOutstanding)
Number computeFullPaymentInterest(Number const &theoreticalPrincipalOutstanding, Number const &periodicRate, NetClock::time_point parentCloseTime, std::uint32_t paymentInterval, std::uint32_t prevPaymentDate, std::uint32_t startDate, TenthBips32 closeInterestRate)
bool checkLendingProtocolDependencies(Rules const &rules, STTx const &tx)
bool isRounded(Asset const &asset, Number const &value, std::int32_t scale)
bool operator==(LoanPaymentParts const &other) const
LoanPaymentParts & operator+=(LoanPaymentParts const &other)
Number firstPaymentPrincipal
This structure captures the parts of a loan state.
Number principalOutstanding
Number interestOutstanding() const
ExtendedPaymentComponents(PaymentComponents const &p, Number fee, Number interest=kNumZero)
Number untrackedManagementFee
Number trackedPrincipalDelta
PaymentSpecialCase specialCase
Number trackedManagementFeeDelta
Number trackedInterestPart() const