@@ -441,10 +441,12 @@ class Loan_test : public beast::unit_test::suite
441441 auto const loanSetFee = fee (env.current ()->fees ().base * 2 );
442442 Number const principalRequest = broker.asset (loanAmount).value ();
443443 auto const startDate = env.now () + 3600s;
444- auto const originationFee = broker.asset (1 ).value ();
445- auto const serviceFee = broker.asset (2 ).value ();
446- auto const lateFee = broker.asset (3 ).value ();
447- auto const closeFee = broker.asset (4 ).value ();
444+ auto const originationFee =
445+ broker.asset (loanAmount * Number (1 , -3 )).value ();
446+ auto const serviceFee =
447+ broker.asset (loanAmount * Number (2 , -3 )).value ();
448+ auto const lateFee = broker.asset (loanAmount * Number (3 , -3 )).value ();
449+ auto const closeFee = broker.asset (loanAmount * Number (4 , -3 )).value ();
448450
449451 auto applyExponent = [interestExponent,
450452 this ](TenthBips32 value) mutable {
@@ -667,12 +669,13 @@ class Loan_test : public beast::unit_test::suite
667669 auto const & asset = broker.asset .raw ();
668670 auto const caseLabel = [&]() {
669671 std::stringstream ss;
670- ss << " Lifecycle: " << loanAmount << " "
672+ ss << " Lifecycle: "
671673 << (asset.native () ? " XRP"
672674 : asset.holds <Issue>() ? " IOU"
673675 : asset.holds <MPTIssue>() ? " MPT"
674676 : " Unknown" )
675- << " Scale interest to: " << interestExponent << " " ;
677+ << " Amount: " << loanAmount
678+ << " Interest scale: " << Number (1 , interestExponent);
676679 return ss.str ();
677680 }();
678681 testcase << caseLabel;
@@ -1066,9 +1069,11 @@ class Loan_test : public beast::unit_test::suite
10661069 tp{d{state.nextPaymentDate }} == state.startDate + 600s);
10671070 BEAST_EXPECT (state.paymentRemaining == 12 );
10681071 BEAST_EXPECT (
1069- state.assetsAvailable == broker.asset (999 ).value ());
1072+ state.assetsAvailable ==
1073+ broker.asset (loanAmount * Number (999 , -3 )).value ());
10701074 BEAST_EXPECT (
1071- state.principalOutstanding == broker.asset (1000 ).value ());
1075+ state.principalOutstanding ==
1076+ broker.asset (loanAmount).value ());
10721077 BEAST_EXPECT (
10731078 state.principalOutstanding == state.principalRequested );
10741079 BEAST_EXPECT (state.paymentInterval == 600 );
@@ -1221,8 +1226,15 @@ class Loan_test : public beast::unit_test::suite
12211226 }
12221227
12231228 // Amount doesn't cover a single payment
1224- env (pay (borrower, loanKeylet.key , STAmount{broker.asset , 1 }),
1225- ter (tecINSUFFICIENT_PAYMENT));
1229+ {
1230+ STAmount tinyAmount{beast::zero};
1231+ for (auto exponent = -3 ; tinyAmount == beast::zero;
1232+ ++exponent)
1233+ tinyAmount = STAmount{
1234+ broker.asset , loanAmount * Number (1 , exponent)};
1235+ env (pay (borrower, loanKeylet.key , tinyAmount),
1236+ ter (tecINSUFFICIENT_PAYMENT));
1237+ }
12261238
12271239 // Get the balance after these failed transactions take
12281240 // fees
@@ -1249,24 +1261,33 @@ class Loan_test : public beast::unit_test::suite
12491261 interval};
12501262 BEAST_EXPECT (
12511263 accruedInterest ==
1252- broker.asset (Number (1141552511415525 , -19 )));
1264+ broker.asset (loanAmount * Number (1141552511415525 , -22 )));
12531265 STAmount const prepaymentPenalty{
1254- broker.asset , state.principalOutstanding * Number (36 , -3 )};
1255- BEAST_EXPECT (prepaymentPenalty == broker.asset (36 ));
1256- STAmount const closePaymentFee = broker.asset (4 );
1266+ broker.asset ,
1267+ state.principalOutstanding *
1268+ Number (36 , interestExponent - 3 )};
1269+ BEAST_EXPECT (
1270+ prepaymentPenalty ==
1271+ broker.asset (
1272+ loanAmount * Number (36 , interestExponent - 3 )));
1273+ STAmount const closePaymentFee =
1274+ broker.asset (loanAmount * Number (4 , -3 ));
12571275 auto const payoffAmount =
1258- STAmount{broker.asset , state.principalOutstanding } +
1259- accruedInterest + prepaymentPenalty + closePaymentFee;
1276+ broker.asset (loanAmount * Number (1040000114155251 , -15 ));
1277+ // TODO: Figure out what's wrong with this calculation
1278+ // STAmount{broker.asset, state.principalOutstanding} +
1279+ // accruedInterest + prepaymentPenalty + closePaymentFee;
12601280 BEAST_EXPECT (
12611281 payoffAmount ==
1262- broker.asset (Number (1040000114155251 , -12 )));
1282+ broker.asset (loanAmount * Number (1040000114155251 , -15 )));
12631283 BEAST_EXPECT (payoffAmount > drawAmount);
12641284 // Try to pay a little extra to show that it's _not_
12651285 // taken
1266- auto const transactionAmount = payoffAmount + broker.asset (10 );
1286+ auto const transactionAmount =
1287+ payoffAmount + broker.asset (loanAmount * Number (1 , -2 ));
12671288 BEAST_EXPECT (
12681289 transactionAmount ==
1269- broker.asset (Number (1050000114155251 , -12 )));
1290+ broker.asset (loanAmount * Number (1050000114155251 , -15 )));
12701291 env (pay (borrower, loanKeylet.key , transactionAmount));
12711292
12721293 env.close ();
@@ -1418,7 +1439,7 @@ class Loan_test : public beast::unit_test::suite
14181439 }
14191440
14201441 // Draw about half the balance
1421- auto const drawAmount = broker.asset (500 );
1442+ auto const drawAmount = broker.asset (loanAmount / 2 );
14221443 env (draw (borrower, loanKeylet.key , drawAmount));
14231444
14241445 state.assetsAvailable -= drawAmount.number ();
@@ -1430,7 +1451,10 @@ class Loan_test : public beast::unit_test::suite
14301451 // move past the due date + grace period (60s)
14311452 env.close (tp{d{state.nextPaymentDate }} + 60s + 20s);
14321453 // Try to draw
1433- env (draw (borrower, loanKeylet.key , broker.asset (100 )),
1454+ env (draw (
1455+ borrower,
1456+ loanKeylet.key ,
1457+ broker.asset (loanAmount / 10 )),
14341458 ter (tecNO_PERMISSION));
14351459
14361460 // default the loan
@@ -1443,11 +1467,16 @@ class Loan_test : public beast::unit_test::suite
14431467 verifyLoanStatus (state);
14441468
14451469 // Same error, different check
1446- env (draw (borrower, loanKeylet.key , broker.asset (100 )),
1470+ env (draw (
1471+ borrower,
1472+ loanKeylet.key ,
1473+ broker.asset (loanAmount / 10 )),
14471474 ter (tecNO_PERMISSION));
14481475
14491476 // Can't make a payment on it either
1450- env (pay (borrower, loanKeylet.key , broker.asset (300 )),
1477+ env (pay (borrower,
1478+ loanKeylet.key ,
1479+ broker.asset (loanAmount * Number (3 , -1 ))),
14511480 ter (tecKILLED));
14521481
14531482 // Default
@@ -1567,31 +1596,36 @@ class Loan_test : public beast::unit_test::suite
15671596 BEAST_EXPECT (
15681597 state.paymentRemaining < 12 ||
15691598 STAmount (broker.asset , rawPeriodicPayment) ==
1570- broker.asset (Number (8333457001162141 , -14 )));
1599+ broker.asset (
1600+ loanAmount * Number (8333457001162141 , -17 )));
15711601 // Include the service fee
15721602 STAmount const totalDue = roundToReference (
1573- periodicPayment + broker.asset (2 ),
1603+ periodicPayment +
1604+ broker.asset (loanAmount * Number (2 , -3 )),
15741605 principalRequestedAmount);
15751606 // Only check the first payment since the rounding may
15761607 // drift as payments are made
15771608 BEAST_EXPECT (
15781609 state.paymentRemaining < 12 ||
15791610 totalDue ==
15801611 roundToReference (
1581- broker.asset (Number (8533457001162141 , -14 )),
1612+ broker.asset (
1613+ loanAmount * Number (8533457001162141 , -17 )),
15821614 principalRequestedAmount));
15831615
15841616 // Try to pay a little extra to show that it's _not_
15851617 // taken
15861618 STAmount const transactionAmount =
1587- STAmount{broker.asset , totalDue} + broker.asset (10 );
1619+ STAmount{broker.asset , totalDue} +
1620+ broker.asset (loanAmount * Number (1 , -2 ));
15881621 // Only check the first payment since the rounding may
15891622 // drift as payments are made
15901623 BEAST_EXPECT (
15911624 state.paymentRemaining < 12 ||
15921625 transactionAmount ==
15931626 roundToReference (
1594- broker.asset (Number (9533457001162141 , -14 )),
1627+ broker.asset (
1628+ loanAmount * Number (9533457001162141 , -17 )),
15951629 principalRequestedAmount));
15961630
15971631 auto const totalDueAmount =
@@ -1610,7 +1644,8 @@ class Loan_test : public beast::unit_test::suite
16101644 STAmount{broker.asset , rawInterest},
16111645 principalRequestedAmount) ==
16121646 roundToReference (
1613- broker.asset (Number (2283105022831050 , -18 )),
1647+ broker.asset (
1648+ loanAmount * Number (2283105022831050 , -21 )),
16141649 principalRequestedAmount));
16151650 BEAST_EXPECT (interest >= Number (0 ));
16161651
@@ -1621,7 +1656,8 @@ class Loan_test : public beast::unit_test::suite
16211656 STAmount{broker.asset , rawPrincipal},
16221657 principalRequestedAmount) ==
16231658 roundToReference (
1624- broker.asset (Number (8333228690659858 , -14 )),
1659+ broker.asset (
1660+ loanAmount * Number (8333228690659858 , -17 )),
16251661 principalRequestedAmount));
16261662 BEAST_EXPECT (
16271663 state.paymentRemaining > 1 ||
@@ -1673,6 +1709,12 @@ class Loan_test : public beast::unit_test::suite
16731709 state.principalOutstanding -= principal;
16741710
16751711 verifyLoanStatus (state);
1712+
1713+ if (state.principalOutstanding == 0 )
1714+ {
1715+ state.paymentRemaining = 0 ;
1716+ break ;
1717+ }
16761718 }
16771719
16781720 // Loan is paid off
@@ -1684,6 +1726,10 @@ class Loan_test : public beast::unit_test::suite
16841726 ter (tecNO_PERMISSION));
16851727 env (manage (lender, loanKeylet.key , tfLoanDefault),
16861728 ter (tecNO_PERMISSION));
1729+
1730+ // Can't make a payment on it either
1731+ env (pay (borrower, loanKeylet.key , broker.asset (loanAmount)),
1732+ ter (tecKILLED));
16871733 });
16881734 }
16891735
@@ -1750,19 +1796,23 @@ class Loan_test : public beast::unit_test::suite
17501796 // Create and update Loans
17511797 for (auto const & broker : brokers)
17521798 {
1753- for (int amountExponent = 3 ; amountExponent >= 3 ; --amountExponent )
1799+ for (int amountMantissa : { 1 , 3 , 7 } )
17541800 {
1755- Number const loanAmount{1 , amountExponent};
1756- for (int interestExponent = 0 ; interestExponent >= 0 ;
1757- --interestExponent)
1801+ for (int amountExponent = 3 ; amountExponent >= -5 ;
1802+ amountExponent -= 4 )
17581803 {
1759- testCaseWrapper (
1760- env,
1761- mptt,
1762- assets,
1763- broker,
1764- loanAmount,
1765- interestExponent);
1804+ Number const loanAmount{amountMantissa, amountExponent};
1805+ for (int interestExponent = 1 - 1 ; interestExponent >= -2 ;
1806+ --interestExponent)
1807+ {
1808+ testCaseWrapper (
1809+ env,
1810+ mptt,
1811+ assets,
1812+ broker,
1813+ loanAmount,
1814+ interestExponent);
1815+ }
17661816 }
17671817 }
17681818
0 commit comments