@@ -1353,6 +1353,20 @@ rippleSend(
1353
1353
1354
1354
if (uSenderID == issuer || uReceiverID == issuer || issuer == noAccount ())
1355
1355
{
1356
+ // if sender is issuer, check that the new OutstandingAmount will not
1357
+ // exceed MaximumAmount
1358
+ if (uSenderID == issuer)
1359
+ {
1360
+ auto const mptID = keylet::mptIssuance (saAmount.issue ().getMptID ());
1361
+ auto const sle = view.peek (mptID);
1362
+ if (!sle)
1363
+ return tecMPT_ISSUANCE_NOT_FOUND;
1364
+
1365
+ if (sle->getFieldU64 (sfOutstandingAmount) + saAmount.value () >
1366
+ (*sle)[~sfMaximumAmount].value_or (maxMPTokenAmount))
1367
+ return tecMPT_MAX_AMOUNT_EXCEEDED;
1368
+ }
1369
+
1356
1370
// Direct send: redeeming IOUs and/or sending own IOUs.
1357
1371
auto const ter =
1358
1372
rippleCredit (view, uSenderID, uReceiverID, saAmount, j);
@@ -1380,8 +1394,8 @@ rippleSend(
1380
1394
rippleCredit (view, issuer, uReceiverID, saAmount, j);
1381
1395
terResult != tesSUCCESS)
1382
1396
return terResult;
1383
- else
1384
- return rippleCredit (view, uSenderID, issuer, saActual, j);
1397
+
1398
+ return rippleCredit (view, uSenderID, issuer, saActual, j);
1385
1399
}
1386
1400
1387
1401
return tecINTERNAL;
@@ -1872,10 +1886,6 @@ rippleCredit(
1872
1886
sfOutstandingAmount,
1873
1887
sle->getFieldU64 (sfOutstandingAmount) + saAmount.value ());
1874
1888
1875
- if (sle->getFieldU64 (sfOutstandingAmount) >
1876
- (*sle)[~sfMaximumAmount].value_or (maxMPTokenAmount))
1877
- return tecMPT_MAX_AMOUNT_EXCEEDED;
1878
-
1879
1889
view.update (sle);
1880
1890
}
1881
1891
else
0 commit comments