test: Add a test case reproducing the issue in RIPD-3902

This commit is contained in:
Ed Hennis
2025-11-10 19:50:15 -05:00
parent 7e94916d08
commit fa93ca7128

View File

@@ -610,8 +610,11 @@ protected:
case AssetType::IOU: { case AssetType::IOU: {
PrettyAsset const asset{issuer[iouCurrency]}; PrettyAsset const asset{issuer[iouCurrency]};
env(trust(lender, asset(brokerParams.vaultDeposit))); auto const limit = asset(
env(trust(borrower, asset(brokerParams.vaultDeposit))); 100 *
(brokerParams.vaultDeposit + brokerParams.coverDeposit));
env(trust(lender, limit));
env(trust(borrower, limit));
return asset; return asset;
} }
@@ -947,8 +950,14 @@ protected:
borrowerInitialBalance - totalSpent); borrowerInitialBalance - totalSpent);
}; };
auto truncate = [](Number const& n, int places = 3) { auto const defaultRound = broker.asset.integral() ? 3 : 0;
auto const factor = Number{1, places}; auto truncate = [defaultRound](
Number const& n,
std::optional<int> places = std::nullopt) {
auto const p = places.value_or(defaultRound);
if (p == 0)
return n;
auto const factor = Number{1, p};
return (n * factor).truncate() / factor; return (n * factor).truncate() / factor;
}; };
while (state.paymentRemaining > 0) while (state.paymentRemaining > 0)
@@ -6589,6 +6598,52 @@ protected:
} }
} }
void
testRIPD3902()
{
testcase("RIPD-3902 - 1 IOU loan payments");
using namespace jtx;
Account const issuer("issuer");
Account const lender("lender");
Account const borrower("borrower");
BrokerParameters const brokerParams{
.vaultDeposit = 10,
.debtMax = 0,
.coverRateMin = TenthBips32{0},
.managementFeeRate = TenthBips16{0},
.coverRateLiquidation = TenthBips32{0}};
LoanParameters const loanParams{
.account = lender,
.counter = borrower,
.principalRequest = Number{1, 0},
.interest = TenthBips32{100'000},
.payTotal = 5,
.payInterval = 150,
.gracePd = 60};
auto const assetType = AssetType::IOU;
Env env(*this, all);
auto loanResult = createLoan(
env, assetType, brokerParams, loanParams, issuer, lender, borrower);
if (!BEAST_EXPECT(loanResult))
return;
auto broker = std::get<BrokerInfo>(*loanResult);
auto loanKeylet = std::get<Keylet>(*loanResult);
auto pseudoAcct = std::get<Account>(*loanResult);
VerifyLoanStatus verifyLoanStatus(env, broker, pseudoAcct, loanKeylet);
makeLoanPayments(
env, broker, loanParams, loanKeylet, verifyLoanStatus, true);
}
public: public:
void void
run() override run() override
@@ -6632,6 +6687,7 @@ public:
testRIPD3831(); testRIPD3831();
testRIPD3459(); testRIPD3459();
testRIPD3901(); testRIPD3901();
testRIPD3902();
testRoundingAllowsUndercoverage(); testRoundingAllowsUndercoverage();
} }
}; };