@kamino-finance/klend-sdk 5.13.21-beta.0 → 5.13.21

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.
Files changed (128) hide show
  1. package/dist/classes/farm_utils.d.ts.map +1 -1
  2. package/dist/classes/farm_utils.js +10 -3
  3. package/dist/classes/farm_utils.js.map +1 -1
  4. package/dist/classes/manager.d.ts +12 -5
  5. package/dist/classes/manager.d.ts.map +1 -1
  6. package/dist/classes/manager.js +300 -39
  7. package/dist/classes/manager.js.map +1 -1
  8. package/dist/classes/obligation.d.ts.map +1 -1
  9. package/dist/classes/obligation.js +0 -14
  10. package/dist/classes/obligation.js.map +1 -1
  11. package/dist/classes/reserve.d.ts +14 -5
  12. package/dist/classes/reserve.d.ts.map +1 -1
  13. package/dist/classes/reserve.js +463 -91
  14. package/dist/classes/reserve.js.map +1 -1
  15. package/dist/classes/utils.d.ts +0 -1
  16. package/dist/classes/utils.d.ts.map +1 -1
  17. package/dist/classes/utils.js +0 -12
  18. package/dist/classes/utils.js.map +1 -1
  19. package/dist/classes/vault.d.ts +2 -1
  20. package/dist/classes/vault.d.ts.map +1 -1
  21. package/dist/classes/vault.js +9 -5
  22. package/dist/classes/vault.js.map +1 -1
  23. package/dist/client_kamino_manager.d.ts.map +1 -1
  24. package/dist/client_kamino_manager.js +26 -27
  25. package/dist/client_kamino_manager.js.map +1 -1
  26. package/dist/idl.json +9 -186
  27. package/dist/idl_codegen/accounts/LendingMarket.d.ts +3 -24
  28. package/dist/idl_codegen/accounts/LendingMarket.d.ts.map +1 -1
  29. package/dist/idl_codegen/accounts/LendingMarket.js +7 -25
  30. package/dist/idl_codegen/accounts/LendingMarket.js.map +1 -1
  31. package/dist/idl_codegen/accounts/index.d.ts +0 -2
  32. package/dist/idl_codegen/accounts/index.d.ts.map +1 -1
  33. package/dist/idl_codegen/accounts/index.js +1 -3
  34. package/dist/idl_codegen/accounts/index.js.map +1 -1
  35. package/dist/idl_codegen/errors/custom.d.ts +1 -25
  36. package/dist/idl_codegen/errors/custom.d.ts.map +1 -1
  37. package/dist/idl_codegen/errors/custom.js +1 -43
  38. package/dist/idl_codegen/errors/custom.js.map +1 -1
  39. package/dist/idl_codegen/instructions/idlMissingTypes.d.ts +1 -2
  40. package/dist/idl_codegen/instructions/idlMissingTypes.d.ts.map +1 -1
  41. package/dist/idl_codegen/instructions/idlMissingTypes.js +1 -2
  42. package/dist/idl_codegen/instructions/idlMissingTypes.js.map +1 -1
  43. package/dist/idl_codegen/instructions/index.d.ts +0 -6
  44. package/dist/idl_codegen/instructions/index.d.ts.map +1 -1
  45. package/dist/idl_codegen/instructions/index.js +1 -7
  46. package/dist/idl_codegen/instructions/index.js.map +1 -1
  47. package/dist/idl_codegen/instructions/updateReserveConfig.d.ts +3 -4
  48. package/dist/idl_codegen/instructions/updateReserveConfig.d.ts.map +1 -1
  49. package/dist/idl_codegen/instructions/updateReserveConfig.js +3 -5
  50. package/dist/idl_codegen/instructions/updateReserveConfig.js.map +1 -1
  51. package/dist/idl_codegen/instructions/withdrawProtocolFee.d.ts +2 -2
  52. package/dist/idl_codegen/instructions/withdrawProtocolFee.d.ts.map +1 -1
  53. package/dist/idl_codegen/instructions/withdrawProtocolFee.js +6 -2
  54. package/dist/idl_codegen/instructions/withdrawProtocolFee.js.map +1 -1
  55. package/dist/idl_codegen/types/UpdateLendingMarketMode.d.ts +7 -33
  56. package/dist/idl_codegen/types/UpdateLendingMarketMode.d.ts.map +1 -1
  57. package/dist/idl_codegen/types/UpdateLendingMarketMode.js +12 -60
  58. package/dist/idl_codegen/types/UpdateLendingMarketMode.js.map +1 -1
  59. package/dist/idl_codegen/types/index.d.ts +2 -6
  60. package/dist/idl_codegen/types/index.d.ts.map +1 -1
  61. package/dist/idl_codegen/types/index.js +1 -3
  62. package/dist/idl_codegen/types/index.js.map +1 -1
  63. package/dist/utils/accountListing.d.ts +1 -1
  64. package/dist/utils/accountListing.d.ts.map +1 -1
  65. package/dist/utils/accountListing.js +2 -2
  66. package/dist/utils/accountListing.js.map +1 -1
  67. package/dist/utils/lookupTable.d.ts.map +1 -1
  68. package/dist/utils/lookupTable.js +6 -1
  69. package/dist/utils/lookupTable.js.map +1 -1
  70. package/dist/utils/managerTypes.d.ts.map +1 -1
  71. package/dist/utils/managerTypes.js +4 -10
  72. package/dist/utils/managerTypes.js.map +1 -1
  73. package/dist/utils/seeds.d.ts +0 -16
  74. package/dist/utils/seeds.d.ts.map +1 -1
  75. package/dist/utils/seeds.js +1 -23
  76. package/dist/utils/seeds.js.map +1 -1
  77. package/package.json +1 -1
  78. package/src/classes/farm_utils.ts +11 -3
  79. package/src/classes/manager.ts +401 -51
  80. package/src/classes/obligation.ts +0 -16
  81. package/src/classes/reserve.ts +783 -119
  82. package/src/classes/utils.ts +0 -12
  83. package/src/classes/vault.ts +18 -7
  84. package/src/client_kamino_manager.ts +34 -42
  85. package/src/idl.json +9 -186
  86. package/src/idl_codegen/accounts/LendingMarket.ts +9 -41
  87. package/src/idl_codegen/accounts/index.ts +0 -2
  88. package/src/idl_codegen/errors/custom.ts +0 -45
  89. package/src/idl_codegen/instructions/idlMissingTypes.ts +2 -4
  90. package/src/idl_codegen/instructions/index.ts +0 -9
  91. package/src/idl_codegen/instructions/updateReserveConfig.ts +5 -7
  92. package/src/idl_codegen/instructions/withdrawProtocolFee.ts +8 -4
  93. package/src/idl_codegen/types/UpdateLendingMarketMode.ts +13 -73
  94. package/src/idl_codegen/types/index.ts +2 -16
  95. package/src/utils/accountListing.ts +3 -2
  96. package/src/utils/lookupTable.ts +7 -1
  97. package/src/utils/managerTypes.ts +4 -10
  98. package/src/utils/seeds.ts +0 -25
  99. package/dist/classes/configItems.d.ts +0 -166
  100. package/dist/classes/configItems.d.ts.map +0 -1
  101. package/dist/classes/configItems.js +0 -202
  102. package/dist/classes/configItems.js.map +0 -1
  103. package/dist/idl_codegen/accounts/GlobalConfig.d.ts +0 -40
  104. package/dist/idl_codegen/accounts/GlobalConfig.d.ts.map +0 -1
  105. package/dist/idl_codegen/accounts/GlobalConfig.js +0 -116
  106. package/dist/idl_codegen/accounts/GlobalConfig.js.map +0 -1
  107. package/dist/idl_codegen/instructions/initGlobalConfig.d.ts +0 -10
  108. package/dist/idl_codegen/instructions/initGlobalConfig.d.ts.map +0 -1
  109. package/dist/idl_codegen/instructions/initGlobalConfig.js +0 -19
  110. package/dist/idl_codegen/instructions/initGlobalConfig.js.map +0 -1
  111. package/dist/idl_codegen/instructions/updateGlobalConfig.d.ts +0 -13
  112. package/dist/idl_codegen/instructions/updateGlobalConfig.d.ts.map +0 -1
  113. package/dist/idl_codegen/instructions/updateGlobalConfig.js +0 -61
  114. package/dist/idl_codegen/instructions/updateGlobalConfig.js.map +0 -1
  115. package/dist/idl_codegen/instructions/updateGlobalConfigAdmin.d.ts +0 -7
  116. package/dist/idl_codegen/instructions/updateGlobalConfigAdmin.d.ts.map +0 -1
  117. package/dist/idl_codegen/instructions/updateGlobalConfigAdmin.js +0 -16
  118. package/dist/idl_codegen/instructions/updateGlobalConfigAdmin.js.map +0 -1
  119. package/dist/idl_codegen/types/UpdateGlobalConfigMode.d.ts +0 -32
  120. package/dist/idl_codegen/types/UpdateGlobalConfigMode.d.ts.map +0 -1
  121. package/dist/idl_codegen/types/UpdateGlobalConfigMode.js +0 -108
  122. package/dist/idl_codegen/types/UpdateGlobalConfigMode.js.map +0 -1
  123. package/src/classes/configItems.ts +0 -295
  124. package/src/idl_codegen/accounts/GlobalConfig.ts +0 -125
  125. package/src/idl_codegen/instructions/initGlobalConfig.ts +0 -30
  126. package/src/idl_codegen/instructions/updateGlobalConfig.ts +0 -47
  127. package/src/idl_codegen/instructions/updateGlobalConfigAdmin.ts +0 -24
  128. package/src/idl_codegen/types/UpdateGlobalConfigMode.ts +0 -90
@@ -9,7 +9,6 @@ import {
9
9
  } from '@solana/web3.js';
10
10
  import Decimal from 'decimal.js';
11
11
  import {
12
- globalConfigPda,
13
12
  INITIAL_COLLATERAL_RATE,
14
13
  lendingMarketAuthPda,
15
14
  MarketWithAddress,
@@ -24,9 +23,22 @@ import {
24
23
  } from '../utils';
25
24
  import { FeeCalculation, Fees, ReserveDataType, ReserveFarmInfo, ReserveRewardYield, ReserveStatus } from './shared';
26
25
  import { Reserve, ReserveFields } from '../idl_codegen/accounts';
27
- import { CurvePointFields, ReserveConfig, UpdateConfigMode, UpdateConfigModeKind } from '../idl_codegen/types';
28
- import { calculateAPYFromAPR, getBorrowRate, lamportsToNumberDecimal, parseTokenSymbol, positiveOrZero } from './utils';
29
- import { CompositeConfigItem, encodeUsingLayout, ConfigUpdater } from './configItems';
26
+ import {
27
+ BorrowRateCurve,
28
+ CurvePointFields,
29
+ ReserveConfig,
30
+ UpdateConfigMode,
31
+ UpdateConfigModeKind,
32
+ } from '../idl_codegen/types';
33
+ import {
34
+ assertNever,
35
+ calculateAPYFromAPR,
36
+ getBorrowRate,
37
+ lamportsToNumberDecimal,
38
+ parseTokenSymbol,
39
+ positiveOrZero,
40
+ sameLengthArrayEquals,
41
+ } from './utils';
30
42
  import { bfToDecimal, Fraction } from './fraction';
31
43
  import { ActionType } from './action';
32
44
  import { BorrowCapsAndCounters, ElevationGroupDescription, KaminoMarket } from './market';
@@ -37,6 +49,7 @@ import {
37
49
  UpdateReserveConfigAccounts,
38
50
  UpdateReserveConfigArgs,
39
51
  } from '../lib';
52
+ import * as anchor from '@coral-xyz/anchor';
40
53
  import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
41
54
  import { aprToApy, KaminoPrices } from '@kamino-finance/kliquidity-sdk';
42
55
  import { FarmState, RewardInfo } from '@kamino-finance/farms-sdk';
@@ -1174,110 +1187,619 @@ export async function createReserveIxs(
1174
1187
  }
1175
1188
 
1176
1189
  export function updateReserveConfigIx(
1177
- signer: PublicKey,
1178
- marketAddress: PublicKey,
1190
+ marketWithAddress: MarketWithAddress,
1179
1191
  reserveAddress: PublicKey,
1180
- mode: UpdateConfigModeKind,
1192
+ modeDiscriminator: number,
1181
1193
  value: Uint8Array,
1182
1194
  programId: PublicKey,
1183
1195
  skipValidation: boolean = false
1184
1196
  ): TransactionInstruction {
1197
+ value;
1185
1198
  const args: UpdateReserveConfigArgs = {
1186
- mode,
1187
- value,
1199
+ mode: new anchor.BN(modeDiscriminator),
1200
+ value: value,
1188
1201
  skipValidation,
1189
1202
  };
1190
1203
 
1191
- const [globalConfig] = globalConfigPda(programId);
1192
1204
  const accounts: UpdateReserveConfigAccounts = {
1193
- signer,
1194
- lendingMarket: marketAddress,
1205
+ lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,
1206
+ lendingMarket: marketWithAddress.address,
1195
1207
  reserve: reserveAddress,
1196
- globalConfig,
1197
1208
  };
1198
1209
 
1199
- return updateReserveConfig(args, accounts, programId);
1210
+ const ix = updateReserveConfig(args, accounts, programId);
1211
+
1212
+ return ix;
1213
+ }
1214
+
1215
+ type BaseReserveConfigKey = keyof ReturnType<typeof ReserveConfig.toEncodable>;
1216
+
1217
+ // Type that excludes reserved and padding fields
1218
+ type ReserveConfigKey = Exclude<BaseReserveConfigKey, ExcludedReserveConfigKey>;
1219
+
1220
+ const EXCLUDED_RESERVE_CONFIG_KEYS = ['reserved1', 'reserved2'] as const;
1221
+
1222
+ export type ExcludedReserveConfigKey = (typeof EXCLUDED_RESERVE_CONFIG_KEYS)[number];
1223
+
1224
+ function isExcludedReserveConfigKey(value: unknown): value is ExcludedReserveConfigKey {
1225
+ return EXCLUDED_RESERVE_CONFIG_KEYS.includes(value as ExcludedReserveConfigKey);
1226
+ }
1227
+
1228
+ function handleConfigUpdate(
1229
+ key: ReserveConfigKey,
1230
+ reserve: Reserve | undefined,
1231
+ reserveConfig: ReserveConfig,
1232
+ updateReserveIxsArgs: UpdateReserveIxsArg[]
1233
+ ): void {
1234
+ switch (key) {
1235
+ case 'status':
1236
+ if (reserve === undefined || reserve.config.status !== reserveConfig.status) {
1237
+ updateReserveIxsArgs.push(
1238
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateReserveStatus.discriminator, reserveConfig.status)
1239
+ );
1240
+ }
1241
+ break;
1242
+ case 'assetTier':
1243
+ if (reserve === undefined || reserve.config.assetTier !== reserveConfig.assetTier) {
1244
+ updateReserveIxsArgs.push(
1245
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateAssetTier.discriminator, reserveConfig.assetTier)
1246
+ );
1247
+ }
1248
+ break;
1249
+ case 'hostFixedInterestRateBps':
1250
+ if (reserve === undefined || reserve.config.hostFixedInterestRateBps !== reserveConfig.hostFixedInterestRateBps) {
1251
+ updateReserveIxsArgs.push(
1252
+ createUpdateReserveIxsArg(
1253
+ UpdateConfigMode.UpdateHostFixedInterestRateBps.discriminator,
1254
+ reserveConfig.hostFixedInterestRateBps
1255
+ )
1256
+ );
1257
+ }
1258
+ break;
1259
+ case 'protocolTakeRatePct':
1260
+ if (reserve === undefined || reserve.config.protocolTakeRatePct !== reserveConfig.protocolTakeRatePct) {
1261
+ updateReserveIxsArgs.push(
1262
+ createUpdateReserveIxsArg(
1263
+ UpdateConfigMode.UpdateProtocolTakeRate.discriminator,
1264
+ reserveConfig.protocolTakeRatePct
1265
+ )
1266
+ );
1267
+ }
1268
+ break;
1269
+ case 'protocolLiquidationFeePct':
1270
+ if (
1271
+ reserve === undefined ||
1272
+ reserve.config.protocolLiquidationFeePct !== reserveConfig.protocolLiquidationFeePct
1273
+ ) {
1274
+ updateReserveIxsArgs.push(
1275
+ createUpdateReserveIxsArg(
1276
+ UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,
1277
+ reserveConfig.protocolLiquidationFeePct
1278
+ )
1279
+ );
1280
+ }
1281
+ break;
1282
+ case 'protocolOrderExecutionFeePct':
1283
+ if (
1284
+ reserve === undefined ||
1285
+ reserve.config.protocolOrderExecutionFeePct !== reserveConfig.protocolOrderExecutionFeePct
1286
+ ) {
1287
+ updateReserveIxsArgs.push(
1288
+ createUpdateReserveIxsArg(
1289
+ UpdateConfigMode.UpdateProtocolOrderExecutionFee.discriminator,
1290
+ reserveConfig.protocolOrderExecutionFeePct
1291
+ )
1292
+ );
1293
+ }
1294
+ break;
1295
+ case 'loanToValuePct':
1296
+ if (reserve === undefined || reserve.config.loanToValuePct !== reserveConfig.loanToValuePct) {
1297
+ updateReserveIxsArgs.push(
1298
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateLoanToValuePct.discriminator, reserveConfig.loanToValuePct)
1299
+ );
1300
+ }
1301
+ break;
1302
+ case 'liquidationThresholdPct':
1303
+ if (reserve === undefined || reserve.config.liquidationThresholdPct !== reserveConfig.liquidationThresholdPct) {
1304
+ updateReserveIxsArgs.push(
1305
+ createUpdateReserveIxsArg(
1306
+ UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,
1307
+ reserveConfig.liquidationThresholdPct
1308
+ )
1309
+ );
1310
+ }
1311
+ break;
1312
+ case 'minLiquidationBonusBps':
1313
+ if (reserve === undefined || reserve.config.minLiquidationBonusBps !== reserveConfig.minLiquidationBonusBps) {
1314
+ updateReserveIxsArgs.push(
1315
+ createUpdateReserveIxsArg(
1316
+ UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,
1317
+ reserveConfig.minLiquidationBonusBps
1318
+ )
1319
+ );
1320
+ }
1321
+ break;
1322
+ case 'maxLiquidationBonusBps':
1323
+ if (reserve === undefined || reserve.config.maxLiquidationBonusBps !== reserveConfig.maxLiquidationBonusBps) {
1324
+ updateReserveIxsArgs.push(
1325
+ createUpdateReserveIxsArg(
1326
+ UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,
1327
+ reserveConfig.maxLiquidationBonusBps
1328
+ )
1329
+ );
1330
+ }
1331
+ break;
1332
+ case 'badDebtLiquidationBonusBps':
1333
+ if (
1334
+ reserve === undefined ||
1335
+ reserve.config.badDebtLiquidationBonusBps !== reserveConfig.badDebtLiquidationBonusBps
1336
+ ) {
1337
+ updateReserveIxsArgs.push(
1338
+ createUpdateReserveIxsArg(
1339
+ UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,
1340
+ reserveConfig.badDebtLiquidationBonusBps
1341
+ )
1342
+ );
1343
+ }
1344
+ break;
1345
+ case 'deleveragingMarginCallPeriodSecs':
1346
+ if (
1347
+ reserve === undefined ||
1348
+ !reserve.config.deleveragingMarginCallPeriodSecs.eq(reserveConfig.deleveragingMarginCallPeriodSecs)
1349
+ ) {
1350
+ updateReserveIxsArgs.push(
1351
+ createUpdateReserveIxsArg(
1352
+ UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.discriminator,
1353
+ reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()
1354
+ )
1355
+ );
1356
+ }
1357
+ break;
1358
+ case 'deleveragingThresholdDecreaseBpsPerDay':
1359
+ if (
1360
+ reserve === undefined ||
1361
+ !reserve.config.deleveragingThresholdDecreaseBpsPerDay.eq(reserveConfig.deleveragingThresholdDecreaseBpsPerDay)
1362
+ ) {
1363
+ updateReserveIxsArgs.push(
1364
+ createUpdateReserveIxsArg(
1365
+ UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.discriminator,
1366
+ reserveConfig.deleveragingThresholdDecreaseBpsPerDay.toNumber()
1367
+ )
1368
+ );
1369
+ }
1370
+ break;
1371
+ case 'fees':
1372
+ if (reserve === undefined || !reserve.config.fees.borrowFeeSf.eq(reserveConfig.fees.borrowFeeSf)) {
1373
+ updateReserveIxsArgs.push(
1374
+ createUpdateReserveIxsArg(
1375
+ UpdateConfigMode.UpdateFeesBorrowFee.discriminator,
1376
+ reserveConfig.fees.borrowFeeSf.toNumber()
1377
+ )
1378
+ );
1379
+ }
1380
+ if (reserve === undefined || !reserve.config.fees.flashLoanFeeSf.eq(reserveConfig.fees.flashLoanFeeSf)) {
1381
+ updateReserveIxsArgs.push(
1382
+ createUpdateReserveIxsArg(
1383
+ UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,
1384
+ reserveConfig.fees.flashLoanFeeSf.toNumber()
1385
+ )
1386
+ );
1387
+ }
1388
+ break;
1389
+ case 'borrowRateCurve':
1390
+ if (reserve === undefined) {
1391
+ updateReserveIxsArgs.push(
1392
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateBorrowRateCurve.discriminator, reserveConfig.borrowRateCurve)
1393
+ );
1394
+ } else {
1395
+ let shouldBorrowCurveBeUpdated = false;
1396
+ for (let i = 0; i < reserveConfig.borrowRateCurve.points.length; i++) {
1397
+ if (
1398
+ reserve.config.borrowRateCurve.points[i].utilizationRateBps !==
1399
+ reserveConfig.borrowRateCurve.points[i].utilizationRateBps ||
1400
+ reserve.config.borrowRateCurve.points[i].borrowRateBps !==
1401
+ reserveConfig.borrowRateCurve.points[i].borrowRateBps
1402
+ ) {
1403
+ shouldBorrowCurveBeUpdated = true;
1404
+ break;
1405
+ }
1406
+ }
1407
+
1408
+ if (shouldBorrowCurveBeUpdated) {
1409
+ updateReserveIxsArgs.push(
1410
+ createUpdateReserveIxsArg(
1411
+ UpdateConfigMode.UpdateBorrowRateCurve.discriminator,
1412
+ reserveConfig.borrowRateCurve
1413
+ )
1414
+ );
1415
+ break;
1416
+ }
1417
+ }
1418
+ break;
1419
+ case 'borrowFactorPct':
1420
+ if (reserve === undefined || !reserve.config.borrowFactorPct.eq(reserveConfig.borrowFactorPct)) {
1421
+ updateReserveIxsArgs.push(
1422
+ createUpdateReserveIxsArg(
1423
+ UpdateConfigMode.UpdateBorrowFactor.discriminator,
1424
+ reserveConfig.borrowFactorPct.toNumber()
1425
+ )
1426
+ );
1427
+ }
1428
+ break;
1429
+ case 'depositLimit':
1430
+ if (reserve === undefined || !reserve.config.depositLimit.eq(reserveConfig.depositLimit)) {
1431
+ updateReserveIxsArgs.push(
1432
+ createUpdateReserveIxsArg(
1433
+ UpdateConfigMode.UpdateDepositLimit.discriminator,
1434
+ BigInt(reserveConfig.depositLimit.toString())
1435
+ )
1436
+ );
1437
+ }
1438
+ break;
1439
+ case 'borrowLimit':
1440
+ if (reserve === undefined || !reserve.config.borrowLimit.eq(reserveConfig.borrowLimit)) {
1441
+ updateReserveIxsArgs.push(
1442
+ createUpdateReserveIxsArg(
1443
+ UpdateConfigMode.UpdateBorrowLimit.discriminator,
1444
+ BigInt(reserveConfig.borrowLimit.toString())
1445
+ )
1446
+ );
1447
+ }
1448
+ break;
1449
+ case 'tokenInfo':
1450
+ const tokenInfo = reserveConfig.tokenInfo;
1451
+ if (reserve === undefined) {
1452
+ updateReserveIxsArgs.push(
1453
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateTokenInfoName.discriminator, tokenInfo.name)
1454
+ );
1455
+ updateReserveIxsArgs.push(
1456
+ createUpdateReserveIxsArg(
1457
+ UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,
1458
+ tokenInfo.heuristic.lower.toNumber()
1459
+ )
1460
+ );
1461
+ updateReserveIxsArgs.push(
1462
+ createUpdateReserveIxsArg(
1463
+ UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,
1464
+ tokenInfo.heuristic.upper.toNumber()
1465
+ )
1466
+ );
1467
+ updateReserveIxsArgs.push(
1468
+ createUpdateReserveIxsArg(
1469
+ UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,
1470
+ tokenInfo.heuristic.exp.toNumber()
1471
+ )
1472
+ );
1473
+ updateReserveIxsArgs.push(
1474
+ createUpdateReserveIxsArg(
1475
+ UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,
1476
+ tokenInfo.maxTwapDivergenceBps.toNumber()
1477
+ )
1478
+ );
1479
+ updateReserveIxsArgs.push(
1480
+ createUpdateReserveIxsArg(
1481
+ UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,
1482
+ tokenInfo.maxAgePriceSeconds.toNumber()
1483
+ )
1484
+ );
1485
+ updateReserveIxsArgs.push(
1486
+ createUpdateReserveIxsArg(
1487
+ UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,
1488
+ tokenInfo.maxAgeTwapSeconds.toNumber()
1489
+ )
1490
+ );
1491
+ updateReserveIxsArgs.push(
1492
+ createUpdateReserveIxsArg(
1493
+ UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,
1494
+ tokenInfo.scopeConfiguration.priceChain
1495
+ )
1496
+ );
1497
+ updateReserveIxsArgs.push(
1498
+ createUpdateReserveIxsArg(
1499
+ UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,
1500
+ tokenInfo.scopeConfiguration.twapChain
1501
+ )
1502
+ );
1503
+ updateReserveIxsArgs.push(
1504
+ createUpdateReserveIxsArg(
1505
+ UpdateConfigMode.UpdateSwitchboardFeed.discriminator,
1506
+ tokenInfo.switchboardConfiguration.priceAggregator
1507
+ )
1508
+ );
1509
+ updateReserveIxsArgs.push(
1510
+ createUpdateReserveIxsArg(
1511
+ UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,
1512
+ tokenInfo.switchboardConfiguration.twapAggregator
1513
+ )
1514
+ );
1515
+ updateReserveIxsArgs.push(
1516
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdatePythPrice.discriminator, tokenInfo.pythConfiguration.price)
1517
+ );
1518
+ updateReserveIxsArgs.push(
1519
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateBlockPriceUsage.discriminator, tokenInfo.blockPriceUsage)
1520
+ );
1521
+ } else {
1522
+ if (!sameLengthArrayEquals(reserve.config.tokenInfo.name, tokenInfo.name)) {
1523
+ updateReserveIxsArgs.push(
1524
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateTokenInfoName.discriminator, tokenInfo.name)
1525
+ );
1526
+ }
1527
+ if (!reserve.config.tokenInfo.heuristic.lower.eq(tokenInfo.heuristic.lower)) {
1528
+ updateReserveIxsArgs.push(
1529
+ createUpdateReserveIxsArg(
1530
+ UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,
1531
+ tokenInfo.heuristic.lower.toNumber()
1532
+ )
1533
+ );
1534
+ }
1535
+ if (!reserve.config.tokenInfo.heuristic.upper.eq(tokenInfo.heuristic.upper)) {
1536
+ updateReserveIxsArgs.push(
1537
+ createUpdateReserveIxsArg(
1538
+ UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,
1539
+ tokenInfo.heuristic.upper.toNumber()
1540
+ )
1541
+ );
1542
+ }
1543
+ if (!reserve.config.tokenInfo.heuristic.exp.eq(tokenInfo.heuristic.exp)) {
1544
+ updateReserveIxsArgs.push(
1545
+ createUpdateReserveIxsArg(
1546
+ UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,
1547
+ tokenInfo.heuristic.exp.toNumber()
1548
+ )
1549
+ );
1550
+ }
1551
+ if (!reserve.config.tokenInfo.maxTwapDivergenceBps.eq(tokenInfo.maxTwapDivergenceBps)) {
1552
+ updateReserveIxsArgs.push(
1553
+ createUpdateReserveIxsArg(
1554
+ UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,
1555
+ tokenInfo.maxTwapDivergenceBps.toNumber()
1556
+ )
1557
+ );
1558
+ }
1559
+ if (!reserve.config.tokenInfo.maxAgePriceSeconds.eq(tokenInfo.maxAgePriceSeconds)) {
1560
+ updateReserveIxsArgs.push(
1561
+ createUpdateReserveIxsArg(
1562
+ UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,
1563
+ tokenInfo.maxAgePriceSeconds.toNumber()
1564
+ )
1565
+ );
1566
+ }
1567
+ if (!reserve.config.tokenInfo.maxAgeTwapSeconds.eq(tokenInfo.maxAgeTwapSeconds)) {
1568
+ updateReserveIxsArgs.push(
1569
+ createUpdateReserveIxsArg(
1570
+ UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,
1571
+ tokenInfo.maxAgeTwapSeconds.toNumber()
1572
+ )
1573
+ );
1574
+ }
1575
+ if (
1576
+ !sameLengthArrayEquals(
1577
+ reserve.config.tokenInfo.scopeConfiguration.priceChain,
1578
+ tokenInfo.scopeConfiguration.priceChain
1579
+ )
1580
+ ) {
1581
+ updateReserveIxsArgs.push(
1582
+ createUpdateReserveIxsArg(
1583
+ UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,
1584
+ tokenInfo.scopeConfiguration.priceChain
1585
+ )
1586
+ );
1587
+ }
1588
+ if (
1589
+ !sameLengthArrayEquals(
1590
+ reserve.config.tokenInfo.scopeConfiguration.twapChain,
1591
+ tokenInfo.scopeConfiguration.twapChain
1592
+ )
1593
+ ) {
1594
+ updateReserveIxsArgs.push(
1595
+ createUpdateReserveIxsArg(
1596
+ UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,
1597
+ tokenInfo.scopeConfiguration.twapChain
1598
+ )
1599
+ );
1600
+ }
1601
+ if (
1602
+ !reserve.config.tokenInfo.switchboardConfiguration.priceAggregator.equals(
1603
+ tokenInfo.switchboardConfiguration.priceAggregator
1604
+ )
1605
+ ) {
1606
+ updateReserveIxsArgs.push(
1607
+ createUpdateReserveIxsArg(
1608
+ UpdateConfigMode.UpdateSwitchboardFeed.discriminator,
1609
+ tokenInfo.switchboardConfiguration.priceAggregator
1610
+ )
1611
+ );
1612
+ }
1613
+ if (
1614
+ !reserve.config.tokenInfo.switchboardConfiguration.twapAggregator.equals(
1615
+ tokenInfo.switchboardConfiguration.twapAggregator
1616
+ )
1617
+ ) {
1618
+ updateReserveIxsArgs.push(
1619
+ createUpdateReserveIxsArg(
1620
+ UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,
1621
+ tokenInfo.switchboardConfiguration.twapAggregator
1622
+ )
1623
+ );
1624
+ }
1625
+ if (!reserve.config.tokenInfo.pythConfiguration.price.equals(tokenInfo.pythConfiguration.price)) {
1626
+ updateReserveIxsArgs.push(
1627
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdatePythPrice.discriminator, tokenInfo.pythConfiguration.price)
1628
+ );
1629
+ }
1630
+ if (reserve.config.tokenInfo.blockPriceUsage !== tokenInfo.blockPriceUsage) {
1631
+ updateReserveIxsArgs.push(
1632
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateBlockPriceUsage.discriminator, tokenInfo.blockPriceUsage)
1633
+ );
1634
+ }
1635
+ if (!reserve.config.tokenInfo.scopeConfiguration.priceFeed.equals(tokenInfo.scopeConfiguration.priceFeed)) {
1636
+ updateReserveIxsArgs.push(
1637
+ createUpdateReserveIxsArg(
1638
+ UpdateConfigMode.UpdateScopePriceFeed.discriminator,
1639
+ tokenInfo.scopeConfiguration.priceFeed
1640
+ )
1641
+ );
1642
+ }
1643
+ }
1644
+ break;
1645
+ case 'depositWithdrawalCap':
1646
+ if (
1647
+ reserve === undefined ||
1648
+ !reserve.config.depositWithdrawalCap.configCapacity.eq(reserveConfig.depositWithdrawalCap.configCapacity) ||
1649
+ !reserve.config.depositWithdrawalCap.configIntervalLengthSeconds.eq(
1650
+ reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds
1651
+ )
1652
+ ) {
1653
+ updateReserveIxsArgs.push(
1654
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [
1655
+ reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),
1656
+ reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),
1657
+ ])
1658
+ );
1659
+ }
1660
+ break;
1661
+ case 'debtWithdrawalCap':
1662
+ if (
1663
+ reserve === undefined ||
1664
+ !reserve.config.debtWithdrawalCap.configCapacity.eq(reserveConfig.debtWithdrawalCap.configCapacity) ||
1665
+ !reserve.config.debtWithdrawalCap.configIntervalLengthSeconds.eq(
1666
+ reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds
1667
+ )
1668
+ ) {
1669
+ updateReserveIxsArgs.push(
1670
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [
1671
+ reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),
1672
+ reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),
1673
+ ])
1674
+ );
1675
+ }
1676
+ break;
1677
+ case 'elevationGroups':
1678
+ if (
1679
+ reserve === undefined ||
1680
+ !sameLengthArrayEquals(reserve.config.elevationGroups, reserveConfig.elevationGroups)
1681
+ ) {
1682
+ updateReserveIxsArgs.push(
1683
+ createUpdateReserveIxsArg(UpdateConfigMode.UpdateElevationGroup.discriminator, reserveConfig.elevationGroups)
1684
+ );
1685
+ }
1686
+ break;
1687
+ case 'disableUsageAsCollOutsideEmode':
1688
+ if (
1689
+ reserve === undefined ||
1690
+ reserve.config.disableUsageAsCollOutsideEmode !== reserveConfig.disableUsageAsCollOutsideEmode
1691
+ ) {
1692
+ updateReserveIxsArgs.push(
1693
+ createUpdateReserveIxsArg(
1694
+ UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,
1695
+ reserveConfig.disableUsageAsCollOutsideEmode
1696
+ )
1697
+ );
1698
+ }
1699
+ break;
1700
+ case 'utilizationLimitBlockBorrowingAbovePct':
1701
+ if (
1702
+ reserve === undefined ||
1703
+ reserve.config.utilizationLimitBlockBorrowingAbovePct !== reserveConfig.utilizationLimitBlockBorrowingAbovePct
1704
+ ) {
1705
+ updateReserveIxsArgs.push(
1706
+ createUpdateReserveIxsArg(
1707
+ UpdateConfigMode.UpdateBlockBorrowingAboveUtilizationPct.discriminator,
1708
+ reserveConfig.utilizationLimitBlockBorrowingAbovePct
1709
+ )
1710
+ );
1711
+ }
1712
+ break;
1713
+ case 'autodeleverageEnabled':
1714
+ if (reserve === undefined || reserve.config.autodeleverageEnabled !== reserveConfig.autodeleverageEnabled) {
1715
+ updateReserveIxsArgs.push(
1716
+ createUpdateReserveIxsArg(
1717
+ UpdateConfigMode.UpdateAutodeleverageEnabled.discriminator,
1718
+ reserveConfig.autodeleverageEnabled
1719
+ )
1720
+ );
1721
+ }
1722
+ break;
1723
+ case 'borrowLimitOutsideElevationGroup':
1724
+ if (
1725
+ reserve === undefined ||
1726
+ !reserve.config.borrowLimitOutsideElevationGroup.eq(reserveConfig.borrowLimitOutsideElevationGroup)
1727
+ ) {
1728
+ updateReserveIxsArgs.push(
1729
+ createUpdateReserveIxsArg(
1730
+ UpdateConfigMode.UpdateBorrowLimitOutsideElevationGroup.discriminator,
1731
+ BigInt(reserveConfig.borrowLimitOutsideElevationGroup.toString())
1732
+ )
1733
+ );
1734
+ }
1735
+ break;
1736
+ case 'borrowLimitAgainstThisCollateralInElevationGroup':
1737
+ if (
1738
+ reserve === undefined ||
1739
+ !sameLengthArrayEquals(
1740
+ reserve.config.borrowLimitAgainstThisCollateralInElevationGroup,
1741
+ reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup
1742
+ )
1743
+ ) {
1744
+ updateReserveIxsArgs.push(
1745
+ createUpdateReserveIxsArg(
1746
+ UpdateConfigMode.UpdateBorrowLimitsInElevationGroupAgainstThisReserve.discriminator,
1747
+ reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup.map((borrowLimit) => borrowLimit.toNumber())
1748
+ )
1749
+ );
1750
+ }
1751
+ break;
1752
+ case 'deleveragingBonusIncreaseBpsPerDay':
1753
+ if (
1754
+ reserve === undefined ||
1755
+ !reserve.config.deleveragingBonusIncreaseBpsPerDay.eq(reserveConfig.deleveragingBonusIncreaseBpsPerDay)
1756
+ ) {
1757
+ updateReserveIxsArgs.push(
1758
+ createUpdateReserveIxsArg(
1759
+ UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.discriminator,
1760
+ reserveConfig.deleveragingBonusIncreaseBpsPerDay.toNumber()
1761
+ )
1762
+ );
1763
+ }
1764
+ break;
1765
+ default:
1766
+ assertNever(key); // Will cause compile error if any case is missing
1767
+ }
1200
1768
  }
1201
1769
 
1202
- export const RESERVE_CONFIG_UPDATER = new ConfigUpdater(UpdateConfigMode.fromDecoded, ReserveConfig, (config) => ({
1203
- [UpdateConfigMode.UpdateLoanToValuePct.kind]: config.loanToValuePct,
1204
- [UpdateConfigMode.UpdateMaxLiquidationBonusBps.kind]: config.maxLiquidationBonusBps,
1205
- [UpdateConfigMode.UpdateLiquidationThresholdPct.kind]: config.liquidationThresholdPct,
1206
- [UpdateConfigMode.UpdateProtocolLiquidationFee.kind]: config.protocolLiquidationFeePct,
1207
- [UpdateConfigMode.UpdateProtocolTakeRate.kind]: config.protocolTakeRatePct,
1208
- [UpdateConfigMode.UpdateFeesBorrowFee.kind]: config.fees.borrowFeeSf,
1209
- [UpdateConfigMode.UpdateFeesFlashLoanFee.kind]: config.fees.flashLoanFeeSf,
1210
- [UpdateConfigMode.DeprecatedUpdateFeesReferralFeeBps.kind]: [], // deprecated
1211
- [UpdateConfigMode.UpdateDepositLimit.kind]: config.depositLimit,
1212
- [UpdateConfigMode.UpdateBorrowLimit.kind]: config.borrowLimit,
1213
- [UpdateConfigMode.UpdateTokenInfoLowerHeuristic.kind]: config.tokenInfo.heuristic.lower,
1214
- [UpdateConfigMode.UpdateTokenInfoUpperHeuristic.kind]: config.tokenInfo.heuristic.upper,
1215
- [UpdateConfigMode.UpdateTokenInfoExpHeuristic.kind]: config.tokenInfo.heuristic.exp,
1216
- [UpdateConfigMode.UpdateTokenInfoTwapDivergence.kind]: config.tokenInfo.maxTwapDivergenceBps,
1217
- [UpdateConfigMode.UpdateTokenInfoScopeTwap.kind]: config.tokenInfo.scopeConfiguration.twapChain,
1218
- [UpdateConfigMode.UpdateTokenInfoScopeChain.kind]: config.tokenInfo.scopeConfiguration.priceChain,
1219
- [UpdateConfigMode.UpdateTokenInfoName.kind]: config.tokenInfo.name,
1220
- [UpdateConfigMode.UpdateTokenInfoPriceMaxAge.kind]: config.tokenInfo.maxAgePriceSeconds,
1221
- [UpdateConfigMode.UpdateTokenInfoTwapMaxAge.kind]: config.tokenInfo.maxAgeTwapSeconds,
1222
- [UpdateConfigMode.UpdateScopePriceFeed.kind]: config.tokenInfo.scopeConfiguration.priceFeed,
1223
- [UpdateConfigMode.UpdatePythPrice.kind]: config.tokenInfo.pythConfiguration.price,
1224
- [UpdateConfigMode.UpdateSwitchboardFeed.kind]: config.tokenInfo.switchboardConfiguration.priceAggregator,
1225
- [UpdateConfigMode.UpdateSwitchboardTwapFeed.kind]: config.tokenInfo.switchboardConfiguration.twapAggregator,
1226
- [UpdateConfigMode.UpdateBorrowRateCurve.kind]: config.borrowRateCurve,
1227
- [UpdateConfigMode.UpdateEntireReserveConfig.kind]: [], // technically `config` would be a valid thing here, but we actually do NOT want entire config update among ixs produced for field-by-field updates
1228
- [UpdateConfigMode.UpdateDebtWithdrawalCap.kind]: new CompositeConfigItem(
1229
- config.debtWithdrawalCap.configCapacity,
1230
- config.debtWithdrawalCap.configIntervalLengthSeconds
1231
- ),
1232
- [UpdateConfigMode.UpdateDepositWithdrawalCap.kind]: new CompositeConfigItem(
1233
- config.depositWithdrawalCap.configCapacity,
1234
- config.depositWithdrawalCap.configIntervalLengthSeconds
1235
- ),
1236
- [UpdateConfigMode.DeprecatedUpdateDebtWithdrawalCapCurrentTotal.kind]: [], // deprecated
1237
- [UpdateConfigMode.DeprecatedUpdateDepositWithdrawalCapCurrentTotal.kind]: [], // deprecated
1238
- [UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.kind]: config.badDebtLiquidationBonusBps,
1239
- [UpdateConfigMode.UpdateMinLiquidationBonusBps.kind]: config.minLiquidationBonusBps,
1240
- [UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.kind]: config.deleveragingMarginCallPeriodSecs,
1241
- [UpdateConfigMode.UpdateBorrowFactor.kind]: config.borrowFactorPct,
1242
- [UpdateConfigMode.UpdateAssetTier.kind]: config.assetTier,
1243
- [UpdateConfigMode.UpdateElevationGroup.kind]: config.elevationGroups,
1244
- [UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.kind]: config.deleveragingThresholdDecreaseBpsPerDay,
1245
- [UpdateConfigMode.DeprecatedUpdateMultiplierSideBoost.kind]: [], // deprecated
1246
- [UpdateConfigMode.DeprecatedUpdateMultiplierTagBoost.kind]: [], // deprecated
1247
- [UpdateConfigMode.UpdateReserveStatus.kind]: config.status,
1248
- [UpdateConfigMode.UpdateFarmCollateral.kind]: [], // the farm fields live on the `Reserve` level...
1249
- [UpdateConfigMode.UpdateFarmDebt.kind]: [], // ...so we are not concerned with them in the `ReserveConfig`'s field-by-field update tx
1250
- [UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.kind]: config.disableUsageAsCollOutsideEmode,
1251
- [UpdateConfigMode.UpdateBlockBorrowingAboveUtilizationPct.kind]: config.utilizationLimitBlockBorrowingAbovePct,
1252
- [UpdateConfigMode.UpdateBlockPriceUsage.kind]: config.tokenInfo.blockPriceUsage,
1253
- [UpdateConfigMode.UpdateBorrowLimitOutsideElevationGroup.kind]: config.borrowLimitOutsideElevationGroup,
1254
- [UpdateConfigMode.UpdateBorrowLimitsInElevationGroupAgainstThisReserve.kind]:
1255
- config.borrowLimitAgainstThisCollateralInElevationGroup,
1256
- [UpdateConfigMode.UpdateHostFixedInterestRateBps.kind]: config.hostFixedInterestRateBps,
1257
- [UpdateConfigMode.UpdateAutodeleverageEnabled.kind]: config.autodeleverageEnabled,
1258
- [UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.kind]: config.deleveragingBonusIncreaseBpsPerDay,
1259
- [UpdateConfigMode.UpdateProtocolOrderExecutionFee.kind]: config.protocolOrderExecutionFeePct,
1260
- }));
1770
+ function createUpdateReserveIxsArg(
1771
+ discriminator: UpdateConfigModeKind['discriminator'],
1772
+ value: number | number[] | bigint | BorrowRateCurve | PublicKey
1773
+ ): UpdateReserveIxsArg {
1774
+ return {
1775
+ // Note: below we add 1 to the discriminator, because UpdateConfigMode in SC starts from 1, while the idl-codegen
1776
+ // creates the TS counterparts starting from 0:
1777
+ mode: discriminator + 1,
1778
+ value: updateReserveConfigEncodedValue(discriminator, value),
1779
+ };
1780
+ }
1261
1781
 
1262
1782
  export function updateEntireReserveConfigIx(
1263
- signer: PublicKey,
1264
- marketAddress: PublicKey,
1783
+ marketWithAddress: MarketWithAddress,
1265
1784
  reserveAddress: PublicKey,
1266
1785
  reserveConfig: ReserveConfig,
1267
1786
  programId: PublicKey
1268
1787
  ): TransactionInstruction {
1788
+ const layout = ReserveConfig.layout();
1789
+ const data = Buffer.alloc(1000);
1790
+ const len = layout.encode(reserveConfig.toEncodable(), data);
1791
+ const value = Uint8Array.from([...data.subarray(0, len)]);
1792
+
1269
1793
  const args: UpdateReserveConfigArgs = {
1270
- mode: new UpdateConfigMode.UpdateEntireReserveConfig(),
1271
- value: encodeUsingLayout(ReserveConfig.layout(), reserveConfig),
1794
+ mode: new anchor.BN(25),
1795
+ value: value,
1272
1796
  skipValidation: false,
1273
1797
  };
1274
1798
 
1275
- const [globalConfig] = globalConfigPda(programId);
1276
1799
  const accounts: UpdateReserveConfigAccounts = {
1277
- signer,
1278
- lendingMarket: marketAddress,
1800
+ lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,
1801
+ lendingMarket: marketWithAddress.address,
1279
1802
  reserve: reserveAddress,
1280
- globalConfig,
1281
1803
  };
1282
1804
 
1283
1805
  const ix = updateReserveConfig(args, accounts, programId);
@@ -1292,19 +1814,155 @@ export function parseForChangesReserveConfigAndGetIxs(
1292
1814
  reserveConfig: ReserveConfig,
1293
1815
  programId: PublicKey
1294
1816
  ) {
1295
- const encodedConfigUpdates = RESERVE_CONFIG_UPDATER.encodeAllUpdates(reserve?.config, reserveConfig);
1296
- encodedConfigUpdates.sort((left, right) => priorityOf(left.mode) - priorityOf(right.mode));
1297
- return encodedConfigUpdates.map((encodedConfigUpdate) =>
1298
- updateReserveConfigIx(
1299
- marketWithAddress.state.lendingMarketOwner,
1300
- marketWithAddress.address,
1301
- reserveAddress,
1302
- encodedConfigUpdate.mode,
1303
- encodedConfigUpdate.value,
1304
- programId,
1305
- shouldSkipValidation(encodedConfigUpdate.mode, reserve)
1306
- )
1307
- );
1817
+ let updateReserveIxsArgs: UpdateReserveIxsArg[] = [];
1818
+ for (const key in reserveConfig.toEncodable()) {
1819
+ if (isExcludedReserveConfigKey(key)) {
1820
+ continue;
1821
+ }
1822
+ handleConfigUpdate(key as ReserveConfigKey, reserve, reserveConfig, updateReserveIxsArgs);
1823
+ }
1824
+
1825
+ const ixs: TransactionInstruction[] = [];
1826
+
1827
+ updateReserveIxsArgs = sortIxsByPriority(updateReserveIxsArgs);
1828
+
1829
+ updateReserveIxsArgs.forEach((updateReserveConfigArgs) => {
1830
+ let skipValidation = false;
1831
+ if (modeMatches(updateReserveConfigArgs.mode) && !reserve?.liquidity.availableAmount.gten(MIN_INITIAL_DEPOSIT)) {
1832
+ skipValidation = true;
1833
+ }
1834
+ ixs.push(
1835
+ updateReserveConfigIx(
1836
+ marketWithAddress,
1837
+ reserveAddress,
1838
+ updateReserveConfigArgs.mode,
1839
+ updateReserveConfigArgs.value,
1840
+ programId,
1841
+ skipValidation
1842
+ )
1843
+ );
1844
+ });
1845
+
1846
+ return ixs;
1847
+ }
1848
+
1849
+ export function updateReserveConfigEncodedValue(
1850
+ discriminator: UpdateConfigModeKind['discriminator'],
1851
+ value: number | number[] | bigint | BorrowRateCurve | PublicKey
1852
+ ): Uint8Array {
1853
+ let buffer: Buffer;
1854
+ let valueArray: number[] = [];
1855
+
1856
+ switch (discriminator) {
1857
+ case UpdateConfigMode.UpdateLoanToValuePct.discriminator:
1858
+ case UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator:
1859
+ case UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator:
1860
+ case UpdateConfigMode.UpdateProtocolTakeRate.discriminator:
1861
+ case UpdateConfigMode.UpdateAssetTier.discriminator:
1862
+ case UpdateConfigMode.UpdateReserveStatus.discriminator:
1863
+ case UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator:
1864
+ case UpdateConfigMode.UpdateBlockBorrowingAboveUtilizationPct.discriminator:
1865
+ case UpdateConfigMode.UpdateBlockPriceUsage.discriminator:
1866
+ case UpdateConfigMode.UpdateAutodeleverageEnabled.discriminator:
1867
+ buffer = Buffer.alloc(1);
1868
+ buffer.writeUIntLE(value as number, 0, 1);
1869
+ break;
1870
+ case UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator:
1871
+ case UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator:
1872
+ case UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator:
1873
+ buffer = Buffer.alloc(2);
1874
+ buffer.writeUInt16LE(value as number, 0);
1875
+ break;
1876
+ case UpdateConfigMode.UpdateFeesBorrowFee.discriminator:
1877
+ case UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator:
1878
+ case UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator:
1879
+ case UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator:
1880
+ case UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator:
1881
+ case UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator:
1882
+ case UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator:
1883
+ case UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator:
1884
+ case UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.discriminator:
1885
+ case UpdateConfigMode.UpdateBorrowFactor.discriminator:
1886
+ case UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.discriminator:
1887
+ case UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.discriminator:
1888
+ value = value as number;
1889
+ buffer = Buffer.alloc(8);
1890
+ buffer.writeBigUint64LE(BigInt(value), 0);
1891
+ break;
1892
+ case UpdateConfigMode.UpdateDepositLimit.discriminator:
1893
+ case UpdateConfigMode.UpdateBorrowLimit.discriminator:
1894
+ case UpdateConfigMode.UpdateBorrowLimitOutsideElevationGroup.discriminator:
1895
+ buffer = Buffer.alloc(8);
1896
+ // Convert value to BigInt if it's not already
1897
+ const bigIntValue = typeof value === 'bigint' ? value : BigInt(value.toString());
1898
+ // Split into two 32-bit values
1899
+ const low = Number(bigIntValue & BigInt(0xffffffff));
1900
+ const high = Number(bigIntValue >> BigInt(32));
1901
+ buffer.writeUInt32LE(low, 0);
1902
+ buffer.writeUInt32LE(high, 4);
1903
+ break;
1904
+ case UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator:
1905
+ case UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator:
1906
+ valueArray = value as number[];
1907
+ buffer = Buffer.alloc(8);
1908
+ for (let i = 0; i < valueArray.length; i++) {
1909
+ buffer.writeUInt16LE(valueArray[i], 2 * i);
1910
+ }
1911
+ break;
1912
+ case UpdateConfigMode.UpdateTokenInfoName.discriminator:
1913
+ valueArray = value as number[];
1914
+ buffer = Buffer.alloc(32);
1915
+ for (let i = 0; i < valueArray.length; i++) {
1916
+ buffer.writeUIntLE(valueArray[i], i, 1);
1917
+ }
1918
+ break;
1919
+ case UpdateConfigMode.UpdateScopePriceFeed.discriminator:
1920
+ case UpdateConfigMode.UpdatePythPrice.discriminator:
1921
+ case UpdateConfigMode.UpdateSwitchboardFeed.discriminator:
1922
+ case UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator:
1923
+ case UpdateConfigMode.UpdateFarmCollateral.discriminator:
1924
+ case UpdateConfigMode.UpdateFarmDebt.discriminator:
1925
+ buffer = (value as PublicKey).toBuffer();
1926
+ break;
1927
+ case UpdateConfigMode.UpdateBorrowRateCurve.discriminator:
1928
+ buffer = serializeBorrowRateCurve(value as BorrowRateCurve);
1929
+ break;
1930
+ case UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator:
1931
+ case UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator:
1932
+ valueArray = value as number[];
1933
+ buffer = Buffer.alloc(16);
1934
+ buffer.writeBigUint64LE(BigInt(valueArray[0]), 0);
1935
+ buffer.writeBigUInt64LE(BigInt(valueArray[1]), 8);
1936
+ break;
1937
+ case UpdateConfigMode.UpdateElevationGroup.discriminator:
1938
+ valueArray = value as number[];
1939
+ buffer = Buffer.alloc(20);
1940
+ for (let i = 0; i < valueArray.length; i++) {
1941
+ buffer.writeUIntLE(valueArray[i], i, 1);
1942
+ }
1943
+ break;
1944
+ case UpdateConfigMode.UpdateBorrowLimitsInElevationGroupAgainstThisReserve.discriminator:
1945
+ valueArray = value as number[];
1946
+ buffer = Buffer.alloc(32 * 8);
1947
+ for (let i = 0; i < valueArray.length; i++) {
1948
+ buffer.writeBigUint64LE(BigInt(valueArray[i]), i * 8);
1949
+ }
1950
+ break;
1951
+ default:
1952
+ buffer = Buffer.alloc(0);
1953
+ }
1954
+
1955
+ return Uint8Array.from([...buffer]);
1956
+ }
1957
+
1958
+ export function serializeBorrowRateCurve(curve: BorrowRateCurve): Buffer {
1959
+ const buffer = Buffer.alloc(8 * curve.points.length);
1960
+ buffer.writeUInt32LE(curve.points.length, 0);
1961
+ for (let i = 0; i < curve.points.length; i++) {
1962
+ buffer.writeUInt32LE(curve.points[i].utilizationRateBps, 8 * i);
1963
+ buffer.writeUInt32LE(curve.points[i].borrowRateBps, 4 + 8 * i);
1964
+ }
1965
+ return buffer;
1308
1966
  }
1309
1967
 
1310
1968
  export type ReserveWithAddress = {
@@ -1312,30 +1970,36 @@ export type ReserveWithAddress = {
1312
1970
  state: Reserve;
1313
1971
  };
1314
1972
 
1315
- const NON_VALIDATED_DISCRIMINATORS = [
1316
- UpdateConfigMode.UpdateScopePriceFeed.discriminator,
1317
- UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,
1318
- UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,
1319
- UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,
1320
- UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,
1321
- UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,
1322
- UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,
1323
- ];
1324
-
1325
- function shouldSkipValidation(mode: UpdateConfigModeKind, reserve: Reserve | undefined): boolean {
1326
- return (
1327
- NON_VALIDATED_DISCRIMINATORS.includes(mode.discriminator) &&
1328
- !reserve?.liquidity.availableAmount.gten(MIN_INITIAL_DEPOSIT)
1329
- );
1330
- }
1973
+ export type UpdateReserveIxsArg = {
1974
+ mode: number;
1975
+ value: Uint8Array;
1976
+ };
1331
1977
 
1332
- function priorityOf(mode: UpdateConfigModeKind): number {
1333
- switch (mode.discriminator) {
1334
- case UpdateConfigMode.UpdateScopePriceFeed.discriminator:
1335
- return 0;
1336
- case UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator:
1337
- return 0;
1338
- default:
1978
+ export const modeMatches = (mode: number): boolean => {
1979
+ const validModes = [
1980
+ UpdateConfigMode.UpdateScopePriceFeed.discriminator + 1,
1981
+ UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator + 1,
1982
+ UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator + 1,
1983
+ UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator + 1,
1984
+ UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator + 1,
1985
+ UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator + 1,
1986
+ UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator + 1,
1987
+ ];
1988
+ return validModes.includes(mode);
1989
+ };
1990
+
1991
+ // Sort update reserve ixs, to first have the oracle config updates first
1992
+ // In order to skip the validation for the scope config updates
1993
+ export const sortIxsByPriority = (updateReserveIxsArgs: UpdateReserveIxsArg[]) => {
1994
+ return updateReserveIxsArgs.sort((a, b) => {
1995
+ const isPriorityA = a.mode === 20 || a.mode === 16;
1996
+ const isPriorityB = b.mode === 20 || b.mode === 16;
1997
+ if (isPriorityA && !isPriorityB) {
1998
+ return -1;
1999
+ }
2000
+ if (isPriorityB && !isPriorityA) {
1339
2001
  return 1;
1340
- }
1341
- }
2002
+ }
2003
+ return 0;
2004
+ });
2005
+ };