@kamino-finance/klend-sdk 5.11.11 → 5.11.12-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1184,13 +1184,14 @@ export function updateReserveConfigIx(
1184
1184
  reserveAddress: PublicKey,
1185
1185
  modeDiscriminator: number,
1186
1186
  value: Uint8Array,
1187
- programId: PublicKey
1187
+ programId: PublicKey,
1188
+ skipValidation: boolean = false
1188
1189
  ): TransactionInstruction {
1189
1190
  value;
1190
1191
  const args: UpdateReserveConfigArgs = {
1191
1192
  mode: new anchor.BN(modeDiscriminator),
1192
1193
  value: value,
1193
- skipValidation: false,
1194
+ skipValidation,
1194
1195
  };
1195
1196
 
1196
1197
  const accounts: UpdateReserveConfigAccounts = {
@@ -1221,21 +1222,15 @@ function handleConfigUpdate(
1221
1222
  key: ReserveConfigKey,
1222
1223
  reserve: Reserve | undefined,
1223
1224
  reserveConfig: ReserveConfig,
1224
- updateReserveIxnsArgs: { mode: number; value: Uint8Array }[]
1225
+ updateReserveIxnsArgs: UpdateReserveIxnsArgs[]
1225
1226
  ): void {
1227
+ // We add 1 to the discriminator, to account for the fact that the UpdateConfigMode
1228
+ // inside the SC starts incrementing from 1
1226
1229
  switch (key) {
1227
1230
  case 'status':
1228
- if (reserve === undefined) {
1231
+ if (reserve === undefined || reserve.config.status !== reserveConfig.status) {
1229
1232
  updateReserveIxnsArgs.push({
1230
- mode: UpdateConfigMode.UpdateReserveStatus.discriminator,
1231
- value: updateReserveConfigEncodedValue(
1232
- UpdateConfigMode.UpdateReserveStatus.discriminator,
1233
- reserveConfig.status
1234
- ),
1235
- });
1236
- } else if (reserve.config.status !== reserveConfig.status) {
1237
- updateReserveIxnsArgs.push({
1238
- mode: UpdateConfigMode.UpdateReserveStatus.discriminator,
1233
+ mode: UpdateConfigMode.UpdateReserveStatus.discriminator + 1,
1239
1234
  value: updateReserveConfigEncodedValue(
1240
1235
  UpdateConfigMode.UpdateReserveStatus.discriminator,
1241
1236
  reserveConfig.status
@@ -1244,17 +1239,9 @@ function handleConfigUpdate(
1244
1239
  }
1245
1240
  break;
1246
1241
  case 'assetTier':
1247
- if (reserve === undefined) {
1248
- updateReserveIxnsArgs.push({
1249
- mode: UpdateConfigMode.UpdateAssetTier.discriminator,
1250
- value: updateReserveConfigEncodedValue(
1251
- UpdateConfigMode.UpdateAssetTier.discriminator,
1252
- reserveConfig.assetTier
1253
- ),
1254
- });
1255
- } else if (reserve.config.assetTier !== reserveConfig.assetTier) {
1242
+ if (reserve === undefined || reserve.config.assetTier !== reserveConfig.assetTier) {
1256
1243
  updateReserveIxnsArgs.push({
1257
- mode: UpdateConfigMode.UpdateAssetTier.discriminator,
1244
+ mode: UpdateConfigMode.UpdateAssetTier.discriminator + 1,
1258
1245
  value: updateReserveConfigEncodedValue(
1259
1246
  UpdateConfigMode.UpdateAssetTier.discriminator,
1260
1247
  reserveConfig.assetTier
@@ -1263,17 +1250,9 @@ function handleConfigUpdate(
1263
1250
  }
1264
1251
  break;
1265
1252
  case 'hostFixedInterestRateBps':
1266
- if (reserve === undefined) {
1253
+ if (reserve === undefined || reserve.config.hostFixedInterestRateBps !== reserveConfig.hostFixedInterestRateBps) {
1267
1254
  updateReserveIxnsArgs.push({
1268
- mode: UpdateConfigMode.UpdateHostFixedInterestRateBps.discriminator,
1269
- value: updateReserveConfigEncodedValue(
1270
- UpdateConfigMode.UpdateHostFixedInterestRateBps.discriminator,
1271
- reserveConfig.hostFixedInterestRateBps
1272
- ),
1273
- });
1274
- } else if (reserve.config.hostFixedInterestRateBps !== reserveConfig.hostFixedInterestRateBps) {
1275
- updateReserveIxnsArgs.push({
1276
- mode: UpdateConfigMode.UpdateHostFixedInterestRateBps.discriminator,
1255
+ mode: UpdateConfigMode.UpdateHostFixedInterestRateBps.discriminator + 1,
1277
1256
  value: updateReserveConfigEncodedValue(
1278
1257
  UpdateConfigMode.UpdateHostFixedInterestRateBps.discriminator,
1279
1258
  reserveConfig.hostFixedInterestRateBps
@@ -1282,17 +1261,9 @@ function handleConfigUpdate(
1282
1261
  }
1283
1262
  break;
1284
1263
  case 'protocolTakeRatePct':
1285
- if (reserve === undefined) {
1286
- updateReserveIxnsArgs.push({
1287
- mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,
1288
- value: updateReserveConfigEncodedValue(
1289
- UpdateConfigMode.UpdateProtocolTakeRate.discriminator,
1290
- reserveConfig.protocolTakeRatePct
1291
- ),
1292
- });
1293
- } else if (reserve.config.protocolTakeRatePct !== reserveConfig.protocolTakeRatePct) {
1264
+ if (reserve === undefined || reserve.config.protocolTakeRatePct !== reserveConfig.protocolTakeRatePct) {
1294
1265
  updateReserveIxnsArgs.push({
1295
- mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,
1266
+ mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator + 1,
1296
1267
  value: updateReserveConfigEncodedValue(
1297
1268
  UpdateConfigMode.UpdateProtocolTakeRate.discriminator,
1298
1269
  reserveConfig.protocolTakeRatePct
@@ -1301,17 +1272,12 @@ function handleConfigUpdate(
1301
1272
  }
1302
1273
  break;
1303
1274
  case 'protocolLiquidationFeePct':
1304
- if (reserve === undefined) {
1305
- updateReserveIxnsArgs.push({
1306
- mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,
1307
- value: updateReserveConfigEncodedValue(
1308
- UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,
1309
- reserveConfig.protocolLiquidationFeePct
1310
- ),
1311
- });
1312
- } else if (reserve.config.protocolLiquidationFeePct !== reserveConfig.protocolLiquidationFeePct) {
1275
+ if (
1276
+ reserve === undefined ||
1277
+ reserve.config.protocolLiquidationFeePct !== reserveConfig.protocolLiquidationFeePct
1278
+ ) {
1313
1279
  updateReserveIxnsArgs.push({
1314
- mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,
1280
+ mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator + 1,
1315
1281
  value: updateReserveConfigEncodedValue(
1316
1282
  UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,
1317
1283
  reserveConfig.protocolLiquidationFeePct
@@ -1320,17 +1286,9 @@ function handleConfigUpdate(
1320
1286
  }
1321
1287
  break;
1322
1288
  case 'loanToValuePct':
1323
- if (reserve === undefined) {
1289
+ if (reserve === undefined || reserve.config.loanToValuePct !== reserveConfig.loanToValuePct) {
1324
1290
  updateReserveIxnsArgs.push({
1325
- mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,
1326
- value: updateReserveConfigEncodedValue(
1327
- UpdateConfigMode.UpdateLoanToValuePct.discriminator,
1328
- reserveConfig.loanToValuePct
1329
- ),
1330
- });
1331
- } else if (reserve.config.loanToValuePct !== reserveConfig.loanToValuePct) {
1332
- updateReserveIxnsArgs.push({
1333
- mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,
1291
+ mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator + 1,
1334
1292
  value: updateReserveConfigEncodedValue(
1335
1293
  UpdateConfigMode.UpdateLoanToValuePct.discriminator,
1336
1294
  reserveConfig.loanToValuePct
@@ -1339,17 +1297,9 @@ function handleConfigUpdate(
1339
1297
  }
1340
1298
  break;
1341
1299
  case 'liquidationThresholdPct':
1342
- if (reserve === undefined) {
1343
- updateReserveIxnsArgs.push({
1344
- mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,
1345
- value: updateReserveConfigEncodedValue(
1346
- UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,
1347
- reserveConfig.liquidationThresholdPct
1348
- ),
1349
- });
1350
- } else if (reserve.config.liquidationThresholdPct !== reserveConfig.liquidationThresholdPct) {
1300
+ if (reserve === undefined || reserve.config.liquidationThresholdPct !== reserveConfig.liquidationThresholdPct) {
1351
1301
  updateReserveIxnsArgs.push({
1352
- mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,
1302
+ mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator + 1,
1353
1303
  value: updateReserveConfigEncodedValue(
1354
1304
  UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,
1355
1305
  reserveConfig.liquidationThresholdPct
@@ -1358,17 +1308,9 @@ function handleConfigUpdate(
1358
1308
  }
1359
1309
  break;
1360
1310
  case 'minLiquidationBonusBps':
1361
- if (reserve === undefined) {
1362
- updateReserveIxnsArgs.push({
1363
- mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,
1364
- value: updateReserveConfigEncodedValue(
1365
- UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,
1366
- reserveConfig.minLiquidationBonusBps
1367
- ),
1368
- });
1369
- } else if (reserve.config.minLiquidationBonusBps !== reserveConfig.minLiquidationBonusBps) {
1311
+ if (reserve === undefined || reserve.config.minLiquidationBonusBps !== reserveConfig.minLiquidationBonusBps) {
1370
1312
  updateReserveIxnsArgs.push({
1371
- mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,
1313
+ mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator + 1,
1372
1314
  value: updateReserveConfigEncodedValue(
1373
1315
  UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,
1374
1316
  reserveConfig.minLiquidationBonusBps
@@ -1377,17 +1319,9 @@ function handleConfigUpdate(
1377
1319
  }
1378
1320
  break;
1379
1321
  case 'maxLiquidationBonusBps':
1380
- if (reserve === undefined) {
1381
- updateReserveIxnsArgs.push({
1382
- mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,
1383
- value: updateReserveConfigEncodedValue(
1384
- UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,
1385
- reserveConfig.maxLiquidationBonusBps
1386
- ),
1387
- });
1388
- } else if (reserve.config.maxLiquidationBonusBps !== reserveConfig.maxLiquidationBonusBps) {
1322
+ if (reserve === undefined || reserve.config.maxLiquidationBonusBps !== reserveConfig.maxLiquidationBonusBps) {
1389
1323
  updateReserveIxnsArgs.push({
1390
- mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,
1324
+ mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator + 1,
1391
1325
  value: updateReserveConfigEncodedValue(
1392
1326
  UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,
1393
1327
  reserveConfig.maxLiquidationBonusBps
@@ -1396,17 +1330,12 @@ function handleConfigUpdate(
1396
1330
  }
1397
1331
  break;
1398
1332
  case 'badDebtLiquidationBonusBps':
1399
- if (reserve === undefined) {
1400
- updateReserveIxnsArgs.push({
1401
- mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,
1402
- value: updateReserveConfigEncodedValue(
1403
- UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,
1404
- reserveConfig.badDebtLiquidationBonusBps
1405
- ),
1406
- });
1407
- } else if (reserve.config.badDebtLiquidationBonusBps !== reserveConfig.badDebtLiquidationBonusBps) {
1333
+ if (
1334
+ reserve === undefined ||
1335
+ reserve.config.badDebtLiquidationBonusBps !== reserveConfig.badDebtLiquidationBonusBps
1336
+ ) {
1408
1337
  updateReserveIxnsArgs.push({
1409
- mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,
1338
+ mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator + 1,
1410
1339
  value: updateReserveConfigEncodedValue(
1411
1340
  UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,
1412
1341
  reserveConfig.badDebtLiquidationBonusBps
@@ -1415,17 +1344,12 @@ function handleConfigUpdate(
1415
1344
  }
1416
1345
  break;
1417
1346
  case 'deleveragingMarginCallPeriodSecs':
1418
- if (reserve === undefined) {
1419
- updateReserveIxnsArgs.push({
1420
- mode: UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.discriminator,
1421
- value: updateReserveConfigEncodedValue(
1422
- UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.discriminator,
1423
- reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()
1424
- ),
1425
- });
1426
- } else if (!reserve.config.deleveragingMarginCallPeriodSecs.eq(reserveConfig.deleveragingMarginCallPeriodSecs)) {
1347
+ if (
1348
+ reserve === undefined ||
1349
+ !reserve.config.deleveragingMarginCallPeriodSecs.eq(reserveConfig.deleveragingMarginCallPeriodSecs)
1350
+ ) {
1427
1351
  updateReserveIxnsArgs.push({
1428
- mode: UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.discriminator,
1352
+ mode: UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.discriminator + 1,
1429
1353
  value: updateReserveConfigEncodedValue(
1430
1354
  UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.discriminator,
1431
1355
  reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()
@@ -1434,19 +1358,12 @@ function handleConfigUpdate(
1434
1358
  }
1435
1359
  break;
1436
1360
  case 'deleveragingThresholdDecreaseBpsPerDay':
1437
- if (reserve === undefined) {
1438
- updateReserveIxnsArgs.push({
1439
- mode: UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.discriminator,
1440
- value: updateReserveConfigEncodedValue(
1441
- UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.discriminator,
1442
- reserveConfig.deleveragingThresholdDecreaseBpsPerDay.toNumber()
1443
- ),
1444
- });
1445
- } else if (
1361
+ if (
1362
+ reserve === undefined ||
1446
1363
  !reserve.config.deleveragingThresholdDecreaseBpsPerDay.eq(reserveConfig.deleveragingThresholdDecreaseBpsPerDay)
1447
1364
  ) {
1448
1365
  updateReserveIxnsArgs.push({
1449
- mode: UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.discriminator,
1366
+ mode: UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.discriminator + 1,
1450
1367
  value: updateReserveConfigEncodedValue(
1451
1368
  UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.discriminator,
1452
1369
  reserveConfig.deleveragingThresholdDecreaseBpsPerDay.toNumber()
@@ -1455,46 +1372,35 @@ function handleConfigUpdate(
1455
1372
  }
1456
1373
  break;
1457
1374
  case 'fees':
1458
- if (reserve === undefined) {
1375
+ if (reserve === undefined || !reserve.config.fees.borrowFeeSf.eq(reserveConfig.fees.borrowFeeSf)) {
1459
1376
  updateReserveIxnsArgs.push({
1460
- mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,
1377
+ mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator + 1,
1461
1378
  value: updateReserveConfigEncodedValue(
1462
1379
  UpdateConfigMode.UpdateFeesBorrowFee.discriminator,
1463
1380
  reserveConfig.fees.borrowFeeSf.toNumber()
1464
1381
  ),
1465
1382
  });
1383
+ }
1384
+
1385
+ if (reserve === undefined || !reserve.config.fees.flashLoanFeeSf.eq(reserveConfig.fees.flashLoanFeeSf)) {
1466
1386
  updateReserveIxnsArgs.push({
1467
- mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,
1468
- value: updateReserveConfigEncodedValue(
1469
- UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,
1470
- reserveConfig.fees.flashLoanFeeSf.toNumber()
1471
- ),
1472
- });
1473
- } else if (!reserve.config.fees.borrowFeeSf.eq(reserveConfig.fees.borrowFeeSf)) {
1474
- updateReserveIxnsArgs.push({
1475
- mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,
1476
- value: updateReserveConfigEncodedValue(
1477
- UpdateConfigMode.UpdateFeesBorrowFee.discriminator,
1478
- reserveConfig.fees.borrowFeeSf.toNumber()
1479
- ),
1480
- });
1481
- } else if (!reserve.config.fees.flashLoanFeeSf.eq(reserveConfig.fees.flashLoanFeeSf)) {
1482
- updateReserveIxnsArgs.push({
1483
- mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,
1387
+ mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator + 1,
1484
1388
  value: updateReserveConfigEncodedValue(
1485
1389
  UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,
1486
1390
  reserveConfig.fees.flashLoanFeeSf.toNumber()
1487
1391
  ),
1488
1392
  });
1489
1393
  }
1394
+
1490
1395
  break;
1491
1396
  case 'borrowRateCurve':
1492
1397
  if (reserve === undefined) {
1493
1398
  updateReserveIxnsArgs.push({
1494
- mode: UpdateBorrowRateCurve.discriminator,
1399
+ mode: UpdateBorrowRateCurve.discriminator + 1,
1495
1400
  value: updateReserveConfigEncodedValue(UpdateBorrowRateCurve.discriminator, reserveConfig.borrowRateCurve),
1496
1401
  });
1497
1402
  } else {
1403
+ let shouldBorrowCurveBeUpdated = false;
1498
1404
  for (let i = 0; i < reserveConfig.borrowRateCurve.points.length; i++) {
1499
1405
  if (
1500
1406
  reserve.config.borrowRateCurve.points[i].utilizationRateBps !==
@@ -1502,30 +1408,24 @@ function handleConfigUpdate(
1502
1408
  reserve.config.borrowRateCurve.points[i].borrowRateBps !==
1503
1409
  reserveConfig.borrowRateCurve.points[i].borrowRateBps
1504
1410
  ) {
1505
- updateReserveIxnsArgs.push({
1506
- mode: UpdateBorrowRateCurve.discriminator,
1507
- value: updateReserveConfigEncodedValue(
1508
- UpdateBorrowRateCurve.discriminator,
1509
- reserveConfig.borrowRateCurve
1510
- ),
1511
- });
1411
+ shouldBorrowCurveBeUpdated = true;
1512
1412
  break;
1513
1413
  }
1514
1414
  }
1415
+
1416
+ if (shouldBorrowCurveBeUpdated) {
1417
+ updateReserveIxnsArgs.push({
1418
+ mode: UpdateBorrowRateCurve.discriminator + 1,
1419
+ value: updateReserveConfigEncodedValue(UpdateBorrowRateCurve.discriminator, reserveConfig.borrowRateCurve),
1420
+ });
1421
+ break;
1422
+ }
1515
1423
  }
1516
1424
  break;
1517
1425
  case 'borrowFactorPct':
1518
- if (reserve === undefined) {
1519
- updateReserveIxnsArgs.push({
1520
- mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,
1521
- value: updateReserveConfigEncodedValue(
1522
- UpdateConfigMode.UpdateBorrowFactor.discriminator,
1523
- reserveConfig.borrowFactorPct.toNumber()
1524
- ),
1525
- });
1526
- } else if (!reserve.config.borrowFactorPct.eq(reserveConfig.borrowFactorPct)) {
1426
+ if (reserve === undefined || !reserve.config.borrowFactorPct.eq(reserveConfig.borrowFactorPct)) {
1527
1427
  updateReserveIxnsArgs.push({
1528
- mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,
1428
+ mode: UpdateConfigMode.UpdateBorrowFactor.discriminator + 1,
1529
1429
  value: updateReserveConfigEncodedValue(
1530
1430
  UpdateConfigMode.UpdateBorrowFactor.discriminator,
1531
1431
  reserveConfig.borrowFactorPct.toNumber()
@@ -1534,17 +1434,9 @@ function handleConfigUpdate(
1534
1434
  }
1535
1435
  break;
1536
1436
  case 'depositLimit':
1537
- if (reserve === undefined) {
1538
- updateReserveIxnsArgs.push({
1539
- mode: UpdateConfigMode.UpdateDepositLimit.discriminator,
1540
- value: updateReserveConfigEncodedValue(
1541
- UpdateConfigMode.UpdateDepositLimit.discriminator,
1542
- BigInt(reserveConfig.depositLimit.toString())
1543
- ),
1544
- });
1545
- } else if (!reserve.config.depositLimit.eq(reserveConfig.depositLimit)) {
1437
+ if (reserve === undefined || !reserve.config.depositLimit.eq(reserveConfig.depositLimit)) {
1546
1438
  updateReserveIxnsArgs.push({
1547
- mode: UpdateConfigMode.UpdateDepositLimit.discriminator,
1439
+ mode: UpdateConfigMode.UpdateDepositLimit.discriminator + 1,
1548
1440
  value: updateReserveConfigEncodedValue(
1549
1441
  UpdateConfigMode.UpdateDepositLimit.discriminator,
1550
1442
  BigInt(reserveConfig.depositLimit.toString())
@@ -1553,17 +1445,9 @@ function handleConfigUpdate(
1553
1445
  }
1554
1446
  break;
1555
1447
  case 'borrowLimit':
1556
- if (reserve === undefined) {
1557
- updateReserveIxnsArgs.push({
1558
- mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,
1559
- value: updateReserveConfigEncodedValue(
1560
- UpdateConfigMode.UpdateBorrowLimit.discriminator,
1561
- BigInt(reserveConfig.borrowLimit.toString())
1562
- ),
1563
- });
1564
- } else if (!reserve.config.borrowLimit.eq(reserveConfig.borrowLimit)) {
1448
+ if (reserve === undefined || !reserve.config.borrowLimit.eq(reserveConfig.borrowLimit)) {
1565
1449
  updateReserveIxnsArgs.push({
1566
- mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,
1450
+ mode: UpdateConfigMode.UpdateBorrowLimit.discriminator + 1,
1567
1451
  value: updateReserveConfigEncodedValue(
1568
1452
  UpdateConfigMode.UpdateBorrowLimit.discriminator,
1569
1453
  BigInt(reserveConfig.borrowLimit.toString())
@@ -1575,88 +1459,88 @@ function handleConfigUpdate(
1575
1459
  const tokenInfo = reserveConfig.tokenInfo;
1576
1460
  if (reserve === undefined) {
1577
1461
  updateReserveIxnsArgs.push({
1578
- mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,
1462
+ mode: UpdateConfigMode.UpdateTokenInfoName.discriminator + 1,
1579
1463
  value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateTokenInfoName.discriminator, tokenInfo.name),
1580
1464
  });
1581
1465
  updateReserveIxnsArgs.push({
1582
- mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,
1466
+ mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator + 1,
1583
1467
  value: updateReserveConfigEncodedValue(
1584
1468
  UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,
1585
1469
  tokenInfo.heuristic.lower.toNumber()
1586
1470
  ),
1587
1471
  });
1588
1472
  updateReserveIxnsArgs.push({
1589
- mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,
1473
+ mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator + 1,
1590
1474
  value: updateReserveConfigEncodedValue(
1591
1475
  UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,
1592
1476
  tokenInfo.heuristic.upper.toNumber()
1593
1477
  ),
1594
1478
  });
1595
1479
  updateReserveIxnsArgs.push({
1596
- mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,
1480
+ mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator + 1,
1597
1481
  value: updateReserveConfigEncodedValue(
1598
1482
  UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,
1599
1483
  tokenInfo.heuristic.exp.toNumber()
1600
1484
  ),
1601
1485
  });
1602
1486
  updateReserveIxnsArgs.push({
1603
- mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,
1487
+ mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator + 1,
1604
1488
  value: updateReserveConfigEncodedValue(
1605
1489
  UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,
1606
1490
  tokenInfo.maxTwapDivergenceBps.toNumber()
1607
1491
  ),
1608
1492
  });
1609
1493
  updateReserveIxnsArgs.push({
1610
- mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,
1494
+ mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator + 1,
1611
1495
  value: updateReserveConfigEncodedValue(
1612
1496
  UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,
1613
1497
  tokenInfo.maxAgePriceSeconds.toNumber()
1614
1498
  ),
1615
1499
  });
1616
1500
  updateReserveIxnsArgs.push({
1617
- mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,
1501
+ mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator + 1,
1618
1502
  value: updateReserveConfigEncodedValue(
1619
1503
  UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,
1620
1504
  tokenInfo.maxAgeTwapSeconds.toNumber()
1621
1505
  ),
1622
1506
  });
1623
1507
  updateReserveIxnsArgs.push({
1624
- mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,
1508
+ mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator + 1,
1625
1509
  value: updateReserveConfigEncodedValue(
1626
1510
  UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,
1627
1511
  tokenInfo.scopeConfiguration.priceChain
1628
1512
  ),
1629
1513
  });
1630
1514
  updateReserveIxnsArgs.push({
1631
- mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,
1515
+ mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator + 1,
1632
1516
  value: updateReserveConfigEncodedValue(
1633
1517
  UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,
1634
1518
  tokenInfo.scopeConfiguration.twapChain
1635
1519
  ),
1636
1520
  });
1637
1521
  updateReserveIxnsArgs.push({
1638
- mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,
1522
+ mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator + 1,
1639
1523
  value: updateReserveConfigEncodedValue(
1640
1524
  UpdateConfigMode.UpdateSwitchboardFeed.discriminator,
1641
1525
  tokenInfo.switchboardConfiguration.priceAggregator
1642
1526
  ),
1643
1527
  });
1644
1528
  updateReserveIxnsArgs.push({
1645
- mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,
1529
+ mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator + 1,
1646
1530
  value: updateReserveConfigEncodedValue(
1647
1531
  UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,
1648
1532
  tokenInfo.switchboardConfiguration.twapAggregator
1649
1533
  ),
1650
1534
  });
1651
1535
  updateReserveIxnsArgs.push({
1652
- mode: UpdateConfigMode.UpdatePythPrice.discriminator,
1536
+ mode: UpdateConfigMode.UpdatePythPrice.discriminator + 1,
1653
1537
  value: updateReserveConfigEncodedValue(
1654
1538
  UpdateConfigMode.UpdatePythPrice.discriminator,
1655
1539
  tokenInfo.pythConfiguration.price
1656
1540
  ),
1657
1541
  });
1658
1542
  updateReserveIxnsArgs.push({
1659
- mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,
1543
+ mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator + 1,
1660
1544
  value: updateReserveConfigEncodedValue(
1661
1545
  UpdateConfigMode.UpdateBlockPriceUsage.discriminator,
1662
1546
  tokenInfo.blockPriceUsage
@@ -1665,13 +1549,13 @@ function handleConfigUpdate(
1665
1549
  } else {
1666
1550
  if (!sameLengthArrayEquals(reserve.config.tokenInfo.name, tokenInfo.name)) {
1667
1551
  updateReserveIxnsArgs.push({
1668
- mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,
1552
+ mode: UpdateConfigMode.UpdateTokenInfoName.discriminator + 1,
1669
1553
  value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateTokenInfoName.discriminator, tokenInfo.name),
1670
1554
  });
1671
1555
  }
1672
1556
  if (!reserve.config.tokenInfo.heuristic.lower.eq(tokenInfo.heuristic.lower)) {
1673
1557
  updateReserveIxnsArgs.push({
1674
- mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,
1558
+ mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator + 1,
1675
1559
  value: updateReserveConfigEncodedValue(
1676
1560
  UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,
1677
1561
  tokenInfo.heuristic.lower.toNumber()
@@ -1680,7 +1564,7 @@ function handleConfigUpdate(
1680
1564
  }
1681
1565
  if (!reserve.config.tokenInfo.heuristic.upper.eq(tokenInfo.heuristic.upper)) {
1682
1566
  updateReserveIxnsArgs.push({
1683
- mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,
1567
+ mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator + 1,
1684
1568
  value: updateReserveConfigEncodedValue(
1685
1569
  UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,
1686
1570
  tokenInfo.heuristic.upper.toNumber()
@@ -1689,7 +1573,7 @@ function handleConfigUpdate(
1689
1573
  }
1690
1574
  if (!reserve.config.tokenInfo.heuristic.exp.eq(tokenInfo.heuristic.exp)) {
1691
1575
  updateReserveIxnsArgs.push({
1692
- mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,
1576
+ mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator + 1,
1693
1577
  value: updateReserveConfigEncodedValue(
1694
1578
  UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,
1695
1579
  tokenInfo.heuristic.exp.toNumber()
@@ -1698,7 +1582,7 @@ function handleConfigUpdate(
1698
1582
  }
1699
1583
  if (!reserve.config.tokenInfo.maxTwapDivergenceBps.eq(tokenInfo.maxTwapDivergenceBps)) {
1700
1584
  updateReserveIxnsArgs.push({
1701
- mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,
1585
+ mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator + 1,
1702
1586
  value: updateReserveConfigEncodedValue(
1703
1587
  UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,
1704
1588
  tokenInfo.maxTwapDivergenceBps.toNumber()
@@ -1707,7 +1591,7 @@ function handleConfigUpdate(
1707
1591
  }
1708
1592
  if (!reserve.config.tokenInfo.maxAgePriceSeconds.eq(tokenInfo.maxAgePriceSeconds)) {
1709
1593
  updateReserveIxnsArgs.push({
1710
- mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,
1594
+ mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator + 1,
1711
1595
  value: updateReserveConfigEncodedValue(
1712
1596
  UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,
1713
1597
  tokenInfo.maxAgePriceSeconds.toNumber()
@@ -1716,7 +1600,7 @@ function handleConfigUpdate(
1716
1600
  }
1717
1601
  if (!reserve.config.tokenInfo.maxAgeTwapSeconds.eq(tokenInfo.maxAgeTwapSeconds)) {
1718
1602
  updateReserveIxnsArgs.push({
1719
- mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,
1603
+ mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator + 1,
1720
1604
  value: updateReserveConfigEncodedValue(
1721
1605
  UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,
1722
1606
  tokenInfo.maxAgeTwapSeconds.toNumber()
@@ -1730,7 +1614,7 @@ function handleConfigUpdate(
1730
1614
  )
1731
1615
  ) {
1732
1616
  updateReserveIxnsArgs.push({
1733
- mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,
1617
+ mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator + 1,
1734
1618
  value: updateReserveConfigEncodedValue(
1735
1619
  UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,
1736
1620
  tokenInfo.scopeConfiguration.priceChain
@@ -1744,7 +1628,7 @@ function handleConfigUpdate(
1744
1628
  )
1745
1629
  ) {
1746
1630
  updateReserveIxnsArgs.push({
1747
- mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,
1631
+ mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator + 1,
1748
1632
  value: updateReserveConfigEncodedValue(
1749
1633
  UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,
1750
1634
  tokenInfo.scopeConfiguration.twapChain
@@ -1757,7 +1641,7 @@ function handleConfigUpdate(
1757
1641
  )
1758
1642
  ) {
1759
1643
  updateReserveIxnsArgs.push({
1760
- mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,
1644
+ mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator + 1,
1761
1645
  value: updateReserveConfigEncodedValue(
1762
1646
  UpdateConfigMode.UpdateSwitchboardFeed.discriminator,
1763
1647
  tokenInfo.switchboardConfiguration.priceAggregator
@@ -1770,7 +1654,7 @@ function handleConfigUpdate(
1770
1654
  )
1771
1655
  ) {
1772
1656
  updateReserveIxnsArgs.push({
1773
- mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,
1657
+ mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator + 1,
1774
1658
  value: updateReserveConfigEncodedValue(
1775
1659
  UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,
1776
1660
  tokenInfo.switchboardConfiguration.twapAggregator
@@ -1779,7 +1663,7 @@ function handleConfigUpdate(
1779
1663
  }
1780
1664
  if (!reserve.config.tokenInfo.pythConfiguration.price.equals(tokenInfo.pythConfiguration.price)) {
1781
1665
  updateReserveIxnsArgs.push({
1782
- mode: UpdateConfigMode.UpdatePythPrice.discriminator,
1666
+ mode: UpdateConfigMode.UpdatePythPrice.discriminator + 1,
1783
1667
  value: updateReserveConfigEncodedValue(
1784
1668
  UpdateConfigMode.UpdatePythPrice.discriminator,
1785
1669
  tokenInfo.pythConfiguration.price
@@ -1788,7 +1672,7 @@ function handleConfigUpdate(
1788
1672
  }
1789
1673
  if (reserve.config.tokenInfo.blockPriceUsage !== tokenInfo.blockPriceUsage) {
1790
1674
  updateReserveIxnsArgs.push({
1791
- mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,
1675
+ mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator + 1,
1792
1676
  value: updateReserveConfigEncodedValue(
1793
1677
  UpdateConfigMode.UpdateBlockPriceUsage.discriminator,
1794
1678
  tokenInfo.blockPriceUsage
@@ -1797,7 +1681,7 @@ function handleConfigUpdate(
1797
1681
  }
1798
1682
  if (!reserve.config.tokenInfo.scopeConfiguration.priceFeed.equals(tokenInfo.scopeConfiguration.priceFeed)) {
1799
1683
  updateReserveIxnsArgs.push({
1800
- mode: UpdateConfigMode.UpdateScopePriceFeed.discriminator,
1684
+ mode: UpdateConfigMode.UpdateScopePriceFeed.discriminator + 1,
1801
1685
  value: updateReserveConfigEncodedValue(
1802
1686
  UpdateConfigMode.UpdateScopePriceFeed.discriminator,
1803
1687
  tokenInfo.scopeConfiguration.priceFeed
@@ -1809,19 +1693,12 @@ function handleConfigUpdate(
1809
1693
  case 'depositWithdrawalCap':
1810
1694
  if (reserve === undefined) {
1811
1695
  updateReserveIxnsArgs.push({
1812
- mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,
1696
+ mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator + 1,
1813
1697
  value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [
1814
1698
  reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),
1815
1699
  reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),
1816
1700
  ]),
1817
1701
  });
1818
- updateReserveIxnsArgs.push({
1819
- mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,
1820
- value: updateReserveConfigEncodedValue(
1821
- UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,
1822
- reserveConfig.depositWithdrawalCap.currentTotal.toNumber()
1823
- ),
1824
- });
1825
1702
  } else if (
1826
1703
  !reserve.config.depositWithdrawalCap.configCapacity.eq(reserveConfig.depositWithdrawalCap.configCapacity) ||
1827
1704
  !reserve.config.depositWithdrawalCap.configIntervalLengthSeconds.eq(
@@ -1829,7 +1706,7 @@ function handleConfigUpdate(
1829
1706
  )
1830
1707
  ) {
1831
1708
  updateReserveIxnsArgs.push({
1832
- mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,
1709
+ mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator + 1,
1833
1710
  value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [
1834
1711
  reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),
1835
1712
  reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),
@@ -1839,7 +1716,7 @@ function handleConfigUpdate(
1839
1716
  !reserve.config.depositWithdrawalCap.currentTotal.eq(reserveConfig.depositWithdrawalCap.currentTotal)
1840
1717
  ) {
1841
1718
  updateReserveIxnsArgs.push({
1842
- mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,
1719
+ mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator + 1,
1843
1720
  value: updateReserveConfigEncodedValue(
1844
1721
  UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,
1845
1722
  reserveConfig.depositWithdrawalCap.currentTotal.toNumber()
@@ -1850,19 +1727,12 @@ function handleConfigUpdate(
1850
1727
  case 'debtWithdrawalCap':
1851
1728
  if (reserve === undefined) {
1852
1729
  updateReserveIxnsArgs.push({
1853
- mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,
1730
+ mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator + 1,
1854
1731
  value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [
1855
1732
  reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),
1856
1733
  reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),
1857
1734
  ]),
1858
1735
  });
1859
- updateReserveIxnsArgs.push({
1860
- mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,
1861
- value: updateReserveConfigEncodedValue(
1862
- UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,
1863
- reserveConfig.debtWithdrawalCap.currentTotal.toNumber()
1864
- ),
1865
- });
1866
1736
  } else if (
1867
1737
  !reserve.config.debtWithdrawalCap.configCapacity.eq(reserveConfig.debtWithdrawalCap.configCapacity) ||
1868
1738
  !reserve.config.debtWithdrawalCap.configIntervalLengthSeconds.eq(
@@ -1870,7 +1740,7 @@ function handleConfigUpdate(
1870
1740
  )
1871
1741
  ) {
1872
1742
  updateReserveIxnsArgs.push({
1873
- mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,
1743
+ mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator + 1,
1874
1744
  value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [
1875
1745
  reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),
1876
1746
  reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),
@@ -1878,7 +1748,7 @@ function handleConfigUpdate(
1878
1748
  });
1879
1749
  } else if (!reserve.config.debtWithdrawalCap.currentTotal.eq(reserveConfig.debtWithdrawalCap.currentTotal)) {
1880
1750
  updateReserveIxnsArgs.push({
1881
- mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,
1751
+ mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator + 1,
1882
1752
  value: updateReserveConfigEncodedValue(
1883
1753
  UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,
1884
1754
  reserveConfig.debtWithdrawalCap.currentTotal.toNumber()
@@ -1887,41 +1757,26 @@ function handleConfigUpdate(
1887
1757
  }
1888
1758
  break;
1889
1759
  case 'elevationGroups':
1890
- if (reserve === undefined) {
1760
+ if (
1761
+ reserve === undefined ||
1762
+ !sameLengthArrayEquals(reserve.config.elevationGroups, reserveConfig.elevationGroups)
1763
+ ) {
1891
1764
  updateReserveIxnsArgs.push({
1892
- mode: UpdateConfigMode.UpdateElevationGroup.discriminator,
1765
+ mode: UpdateConfigMode.UpdateElevationGroup.discriminator + 1,
1893
1766
  value: updateReserveConfigEncodedValue(
1894
1767
  UpdateConfigMode.UpdateElevationGroup.discriminator,
1895
1768
  reserveConfig.elevationGroups
1896
1769
  ),
1897
1770
  });
1898
- } else {
1899
- for (let i = 0; i < reserveConfig.elevationGroups.length; i++) {
1900
- if (reserve.config.elevationGroups[i] !== reserveConfig.elevationGroups[i]) {
1901
- updateReserveIxnsArgs.push({
1902
- mode: UpdateConfigMode.UpdateElevationGroup.discriminator,
1903
- value: updateReserveConfigEncodedValue(
1904
- UpdateConfigMode.UpdateElevationGroup.discriminator,
1905
- reserveConfig.elevationGroups
1906
- ),
1907
- });
1908
- break;
1909
- }
1910
- }
1911
1771
  }
1912
1772
  break;
1913
1773
  case 'disableUsageAsCollOutsideEmode':
1914
- if (reserve === undefined) {
1915
- updateReserveIxnsArgs.push({
1916
- mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,
1917
- value: updateReserveConfigEncodedValue(
1918
- UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,
1919
- reserveConfig.disableUsageAsCollOutsideEmode
1920
- ),
1921
- });
1922
- } else if (reserve.config.disableUsageAsCollOutsideEmode !== reserveConfig.disableUsageAsCollOutsideEmode) {
1774
+ if (
1775
+ reserve === undefined ||
1776
+ reserve.config.disableUsageAsCollOutsideEmode !== reserveConfig.disableUsageAsCollOutsideEmode
1777
+ ) {
1923
1778
  updateReserveIxnsArgs.push({
1924
- mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,
1779
+ mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator + 1,
1925
1780
  value: updateReserveConfigEncodedValue(
1926
1781
  UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,
1927
1782
  reserveConfig.disableUsageAsCollOutsideEmode
@@ -1930,19 +1785,12 @@ function handleConfigUpdate(
1930
1785
  }
1931
1786
  break;
1932
1787
  case 'utilizationLimitBlockBorrowingAbovePct':
1933
- if (reserve === undefined) {
1934
- updateReserveIxnsArgs.push({
1935
- mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilizationPct.discriminator,
1936
- value: updateReserveConfigEncodedValue(
1937
- UpdateConfigMode.UpdateBlockBorrowingAboveUtilizationPct.discriminator,
1938
- reserveConfig.utilizationLimitBlockBorrowingAbovePct
1939
- ),
1940
- });
1941
- } else if (
1788
+ if (
1789
+ reserve === undefined ||
1942
1790
  reserve.config.utilizationLimitBlockBorrowingAbovePct !== reserveConfig.utilizationLimitBlockBorrowingAbovePct
1943
1791
  ) {
1944
1792
  updateReserveIxnsArgs.push({
1945
- mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilizationPct.discriminator,
1793
+ mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilizationPct.discriminator + 1,
1946
1794
  value: updateReserveConfigEncodedValue(
1947
1795
  UpdateConfigMode.UpdateBlockBorrowingAboveUtilizationPct.discriminator,
1948
1796
  reserveConfig.utilizationLimitBlockBorrowingAbovePct
@@ -1951,17 +1799,9 @@ function handleConfigUpdate(
1951
1799
  }
1952
1800
  break;
1953
1801
  case 'autodeleverageEnabled':
1954
- if (reserve === undefined) {
1955
- updateReserveIxnsArgs.push({
1956
- mode: UpdateConfigMode.UpdateAutodeleverageEnabled.discriminator,
1957
- value: updateReserveConfigEncodedValue(
1958
- UpdateConfigMode.UpdateAutodeleverageEnabled.discriminator,
1959
- reserveConfig.autodeleverageEnabled
1960
- ),
1961
- });
1962
- } else if (reserve.config.autodeleverageEnabled !== reserveConfig.autodeleverageEnabled) {
1802
+ if (reserve === undefined || reserve.config.autodeleverageEnabled !== reserveConfig.autodeleverageEnabled) {
1963
1803
  updateReserveIxnsArgs.push({
1964
- mode: UpdateConfigMode.UpdateAutodeleverageEnabled.discriminator,
1804
+ mode: UpdateConfigMode.UpdateAutodeleverageEnabled.discriminator + 1,
1965
1805
  value: updateReserveConfigEncodedValue(
1966
1806
  UpdateConfigMode.UpdateAutodeleverageEnabled.discriminator,
1967
1807
  reserveConfig.autodeleverageEnabled
@@ -1970,67 +1810,44 @@ function handleConfigUpdate(
1970
1810
  }
1971
1811
  break;
1972
1812
  case 'borrowLimitOutsideElevationGroup':
1973
- if (reserve === undefined) {
1813
+ if (
1814
+ reserve === undefined ||
1815
+ !reserve.config.borrowLimitOutsideElevationGroup.eq(reserveConfig.borrowLimitOutsideElevationGroup)
1816
+ ) {
1974
1817
  updateReserveIxnsArgs.push({
1975
- mode: UpdateConfigMode.UpdateBorrowLimitOutsideElevationGroup.discriminator,
1818
+ mode: UpdateConfigMode.UpdateBorrowLimitOutsideElevationGroup.discriminator + 1,
1976
1819
  value: updateReserveConfigEncodedValue(
1977
1820
  UpdateConfigMode.UpdateBorrowLimitOutsideElevationGroup.discriminator,
1978
1821
  reserveConfig.borrowLimitOutsideElevationGroup.toNumber()
1979
1822
  ),
1980
1823
  });
1981
- } else if (!reserve.config.borrowLimitOutsideElevationGroup.eq(reserveConfig.borrowLimitOutsideElevationGroup)) {
1982
- updateReserveIxnsArgs.push({
1983
- mode: UpdateConfigMode.UpdateBorrowLimitOutsideElevationGroup.discriminator,
1984
- value: updateReserveConfigEncodedValue(
1985
- UpdateConfigMode.UpdateBorrowLimitOutsideElevationGroup.discriminator,
1986
- BigInt(reserveConfig.borrowLimitOutsideElevationGroup.toString())
1987
- ),
1988
- });
1989
1824
  }
1990
1825
  break;
1991
1826
  case 'borrowLimitAgainstThisCollateralInElevationGroup':
1992
- if (reserve === undefined) {
1827
+ if (
1828
+ reserve === undefined ||
1829
+ !sameLengthArrayEquals(
1830
+ reserve.config.borrowLimitAgainstThisCollateralInElevationGroup,
1831
+ reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup
1832
+ )
1833
+ ) {
1993
1834
  updateReserveIxnsArgs.push({
1994
- mode: UpdateConfigMode.UpdateBorrowLimitsInElevationGroupAgainstThisReserve.discriminator,
1835
+ mode: UpdateConfigMode.UpdateBorrowLimitsInElevationGroupAgainstThisReserve.discriminator + 1,
1995
1836
  value: updateReserveConfigEncodedValue(
1996
1837
  UpdateConfigMode.UpdateBorrowLimitsInElevationGroupAgainstThisReserve.discriminator,
1997
1838
  reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup.map((borrowLimit) => borrowLimit.toNumber())
1998
1839
  ),
1999
1840
  });
2000
- } else {
2001
- for (let i = 0; i < reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup.length; i++) {
2002
- if (
2003
- reserve.config.borrowLimitAgainstThisCollateralInElevationGroup[i] !==
2004
- reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup[i]
2005
- ) {
2006
- updateReserveIxnsArgs.push({
2007
- mode: UpdateConfigMode.UpdateBorrowLimitsInElevationGroupAgainstThisReserve.discriminator,
2008
- value: updateReserveConfigEncodedValue(
2009
- UpdateConfigMode.UpdateBorrowLimitsInElevationGroupAgainstThisReserve.discriminator,
2010
- reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup.map((borrowLimit) =>
2011
- borrowLimit.toNumber()
2012
- )
2013
- ),
2014
- });
2015
- }
2016
- }
2017
1841
  }
1842
+
2018
1843
  break;
2019
1844
  case 'deleveragingBonusIncreaseBpsPerDay':
2020
- if (reserve === undefined) {
2021
- updateReserveIxnsArgs.push({
2022
- mode: UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.discriminator,
2023
- value: updateReserveConfigEncodedValue(
2024
- UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.discriminator,
2025
- reserveConfig.deleveragingBonusIncreaseBpsPerDay.toNumber()
2026
- ),
2027
- });
2028
- } else if (
2029
- reserve.config.deleveragingBonusIncreaseBpsPerDay.toNumber() !==
2030
- reserveConfig.deleveragingBonusIncreaseBpsPerDay.toNumber()
1845
+ if (
1846
+ reserve === undefined ||
1847
+ !reserve.config.deleveragingBonusIncreaseBpsPerDay.eq(reserveConfig.deleveragingBonusIncreaseBpsPerDay)
2031
1848
  ) {
2032
1849
  updateReserveIxnsArgs.push({
2033
- mode: UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.discriminator,
1850
+ mode: UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.discriminator + 1,
2034
1851
  value: updateReserveConfigEncodedValue(
2035
1852
  UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.discriminator,
2036
1853
  reserveConfig.deleveragingBonusIncreaseBpsPerDay.toNumber()
@@ -2078,7 +1895,7 @@ export function parseForChangesReserveConfigAndGetIxs(
2078
1895
  reserveConfig: ReserveConfig,
2079
1896
  programId: PublicKey
2080
1897
  ) {
2081
- const updateReserveIxnsArgs: { mode: number; value: Uint8Array }[] = [];
1898
+ let updateReserveIxnsArgs: UpdateReserveIxnsArgs[] = [];
2082
1899
  for (const key in reserveConfig.toEncodable()) {
2083
1900
  if (isExcludedReserveConfigKey(key)) {
2084
1901
  continue;
@@ -2088,14 +1905,21 @@ export function parseForChangesReserveConfigAndGetIxs(
2088
1905
 
2089
1906
  const ixns: TransactionInstruction[] = [];
2090
1907
 
1908
+ updateReserveIxnsArgs = sortIxnsByPriority(updateReserveIxnsArgs);
1909
+
2091
1910
  updateReserveIxnsArgs.forEach((updateReserveConfigArgs) => {
1911
+ let skipValidation = false;
1912
+ if (modeMatches(updateReserveConfigArgs.mode)) {
1913
+ skipValidation = true;
1914
+ }
2092
1915
  ixns.push(
2093
1916
  updateReserveConfigIx(
2094
1917
  marketWithAddress,
2095
1918
  reserveAddress,
2096
- updateReserveConfigArgs.mode + 1,
1919
+ updateReserveConfigArgs.mode,
2097
1920
  updateReserveConfigArgs.value,
2098
- programId
1921
+ programId,
1922
+ skipValidation
2099
1923
  )
2100
1924
  );
2101
1925
  });
@@ -2215,11 +2039,11 @@ export function updateReserveConfigEncodedValue(
2215
2039
  }
2216
2040
 
2217
2041
  export function serializeBorrowRateCurve(curve: BorrowRateCurve): Buffer {
2218
- const buffer = Buffer.alloc(4 + 8 * curve.points.length);
2042
+ const buffer = Buffer.alloc(8 * curve.points.length);
2219
2043
  buffer.writeUInt32LE(curve.points.length, 0);
2220
2044
  for (let i = 0; i < curve.points.length; i++) {
2221
- buffer.writeUInt32LE(curve.points[i].utilizationRateBps, 4 + 8 * i);
2222
- buffer.writeUInt32LE(curve.points[i].borrowRateBps, 8 + 8 * i);
2045
+ buffer.writeUInt32LE(curve.points[i].utilizationRateBps, 8 * i);
2046
+ buffer.writeUInt32LE(curve.points[i].borrowRateBps, 4 + 8 * i);
2223
2047
  }
2224
2048
  return buffer;
2225
2049
  }
@@ -2228,3 +2052,37 @@ export type ReserveWithAddress = {
2228
2052
  address: PublicKey;
2229
2053
  state: Reserve;
2230
2054
  };
2055
+
2056
+ export type UpdateReserveIxnsArgs = {
2057
+ mode: number;
2058
+ value: Uint8Array;
2059
+ };
2060
+
2061
+ export const modeMatches = (mode: number): boolean => {
2062
+ const validModes = [
2063
+ UpdateConfigMode.UpdateScopePriceFeed.discriminator + 1,
2064
+ UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator + 1,
2065
+ UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator + 1,
2066
+ UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator + 1,
2067
+ UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator + 1,
2068
+ UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator + 1,
2069
+ UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator + 1,
2070
+ ];
2071
+ return validModes.includes(mode);
2072
+ };
2073
+
2074
+ // Sort update reserve ixns, to first have the oracle config updates first
2075
+ // In order to skip the validation for the scope config updates
2076
+ export const sortIxnsByPriority = (updateReserveIxnsArgs: UpdateReserveIxnsArgs[]) => {
2077
+ return updateReserveIxnsArgs.sort((a, b) => {
2078
+ const isPriorityA = a.mode === 20 || a.mode === 16;
2079
+ const isPriorityB = b.mode === 20 || b.mode === 16;
2080
+ if (isPriorityA && !isPriorityB) {
2081
+ return -1;
2082
+ }
2083
+ if (isPriorityB && !isPriorityA) {
2084
+ return 1;
2085
+ }
2086
+ return 0;
2087
+ });
2088
+ };