@kamino-finance/klend-sdk 7.3.7-beta.0 → 7.3.7
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.
- package/dist/classes/action.d.ts.map +1 -1
- package/dist/classes/action.js +5 -2
- package/dist/classes/action.js.map +1 -1
- package/dist/classes/configItems.d.ts.map +1 -1
- package/dist/classes/configItems.js +1 -34
- package/dist/classes/configItems.js.map +1 -1
- package/dist/classes/farm_utils.d.ts +1 -1
- package/dist/classes/farm_utils.d.ts.map +1 -1
- package/dist/classes/farm_utils.js +3 -1
- package/dist/classes/farm_utils.js.map +1 -1
- package/dist/classes/reserve.d.ts +5 -1
- package/dist/classes/reserve.d.ts.map +1 -1
- package/dist/classes/reserve.js +21 -54
- package/dist/classes/reserve.js.map +1 -1
- package/dist/classes/shared.d.ts +2 -2
- package/dist/classes/shared.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/classes/action.ts +13 -3
- package/src/classes/configItems.ts +1 -35
- package/src/classes/farm_utils.ts +5 -1
- package/src/classes/reserve.ts +36 -56
- package/src/classes/shared.ts +2 -2
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
scaleDownWads,
|
|
9
9
|
WAD,
|
|
10
10
|
RewardInfo,
|
|
11
|
+
RewardType,
|
|
11
12
|
} from '@kamino-finance/farms-sdk';
|
|
12
13
|
import {
|
|
13
14
|
address,
|
|
@@ -174,7 +175,7 @@ export type UnstakeAndWithdrawFromFarmIxs = {
|
|
|
174
175
|
withdrawIx: Instruction;
|
|
175
176
|
};
|
|
176
177
|
|
|
177
|
-
export function getRewardPerTimeUnitSecond(reward: RewardInfo) {
|
|
178
|
+
export function getRewardPerTimeUnitSecond(reward: RewardInfo, farmTotalStakeLamports: Decimal) {
|
|
178
179
|
const now = new Decimal(new Date().getTime()).div(1000);
|
|
179
180
|
let rewardPerTimeUnitSecond = new Decimal(0);
|
|
180
181
|
for (let i = 0; i < reward.rewardScheduleCurve.points.length - 1; i++) {
|
|
@@ -196,8 +197,11 @@ export function getRewardPerTimeUnitSecond(reward: RewardInfo) {
|
|
|
196
197
|
const rewardTokenDecimals = reward.token.decimals.toNumber();
|
|
197
198
|
const rewardAmountPerUnitDecimals = new Decimal(10).pow(reward.rewardsPerSecondDecimals.toString());
|
|
198
199
|
const rewardAmountPerUnitLamports = new Decimal(10).pow(rewardTokenDecimals.toString());
|
|
200
|
+
const constantRewardStakeAdjustment =
|
|
201
|
+
reward.rewardType === RewardType.Constant.discriminator ? farmTotalStakeLamports : new Decimal(1);
|
|
199
202
|
|
|
200
203
|
const rpsAdjusted = new Decimal(rewardPerTimeUnitSecond.toString())
|
|
204
|
+
.mul(constantRewardStakeAdjustment)
|
|
201
205
|
.div(rewardAmountPerUnitDecimals)
|
|
202
206
|
.div(rewardAmountPerUnitLamports);
|
|
203
207
|
|
package/src/classes/reserve.ts
CHANGED
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
INITIAL_COLLATERAL_RATE,
|
|
25
25
|
lendingMarketAuthPda,
|
|
26
26
|
MarketWithAddress,
|
|
27
|
+
MIN_INITIAL_DEPOSIT,
|
|
27
28
|
ONE_HUNDRED_PCT_IN_BPS,
|
|
28
29
|
reservePdas,
|
|
29
30
|
SLOTS_PER_DAY,
|
|
@@ -48,7 +49,7 @@ import {
|
|
|
48
49
|
UpdateReserveConfigArgs,
|
|
49
50
|
} from '../lib';
|
|
50
51
|
import { aprToApy, KaminoPrices } from '@kamino-finance/kliquidity-sdk';
|
|
51
|
-
import { FarmState, RewardInfo } from '@kamino-finance/farms-sdk';
|
|
52
|
+
import { FarmAndKey, FarmState, RewardInfo } from '@kamino-finance/farms-sdk';
|
|
52
53
|
import { TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';
|
|
53
54
|
import { maxBigInt } from '../utils/bigint';
|
|
54
55
|
import { getCreateAccountInstruction, SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system';
|
|
@@ -69,7 +70,7 @@ export class KaminoReserve {
|
|
|
69
70
|
|
|
70
71
|
tokenOraclePrice: TokenOracleData;
|
|
71
72
|
stats: ReserveDataType;
|
|
72
|
-
private farmData: ReserveFarmInfo = { fetched: false,
|
|
73
|
+
private farmData: ReserveFarmInfo = { fetched: false, farms: [] };
|
|
73
74
|
|
|
74
75
|
private rpc: Rpc<KaminoReserveRpcApi>;
|
|
75
76
|
private readonly recentSlotDurationMs: number;
|
|
@@ -812,22 +813,22 @@ export class KaminoReserve {
|
|
|
812
813
|
|
|
813
814
|
async loadFarmStates() {
|
|
814
815
|
if (!this.farmData.fetched) {
|
|
815
|
-
const farmStates:
|
|
816
|
+
const farmStates: FarmAndKey[] = [];
|
|
816
817
|
const debtFarmAddress = this.getDebtFarmAddress();
|
|
817
818
|
if (isSome(debtFarmAddress)) {
|
|
818
819
|
const farmState = await FarmState.fetch(this.rpc, debtFarmAddress.value);
|
|
819
820
|
if (farmState !== null) {
|
|
820
|
-
farmStates.push(farmState);
|
|
821
|
+
farmStates.push({ farmState, key: debtFarmAddress.value });
|
|
821
822
|
}
|
|
822
823
|
}
|
|
823
824
|
const collateralFarmAddress = this.getCollateralFarmAddress();
|
|
824
825
|
if (isSome(collateralFarmAddress)) {
|
|
825
826
|
const farmState = await FarmState.fetch(this.rpc, collateralFarmAddress.value);
|
|
826
827
|
if (farmState !== null) {
|
|
827
|
-
farmStates.push(farmState);
|
|
828
|
+
farmStates.push({ farmState, key: collateralFarmAddress.value });
|
|
828
829
|
}
|
|
829
830
|
}
|
|
830
|
-
this.farmData.
|
|
831
|
+
this.farmData.farms = farmStates;
|
|
831
832
|
this.farmData.fetched = true;
|
|
832
833
|
}
|
|
833
834
|
}
|
|
@@ -838,14 +839,19 @@ export class KaminoReserve {
|
|
|
838
839
|
throw Error('KaminoMarket must call loadReserves.');
|
|
839
840
|
}
|
|
840
841
|
|
|
841
|
-
const isDebtReward = this.state.farmDebt === this.address;
|
|
842
842
|
await this.loadFarmStates();
|
|
843
843
|
const yields: ReserveRewardYield[] = [];
|
|
844
|
-
for (const
|
|
845
|
-
|
|
844
|
+
for (const farmAndKey of this.farmData.farms) {
|
|
845
|
+
const isDebtReward = this.state.farmDebt === farmAndKey.key;
|
|
846
|
+
for (const rewardInfo of farmAndKey.farmState.rewardInfos.filter(
|
|
846
847
|
(x) => x.token.mint !== DEFAULT_PUBLIC_KEY && !x.rewardsAvailable.isZero()
|
|
847
848
|
)) {
|
|
848
|
-
const { apy, apr } = this.calculateRewardYield(
|
|
849
|
+
const { apy, apr } = this.calculateRewardYield(
|
|
850
|
+
prices,
|
|
851
|
+
rewardInfo,
|
|
852
|
+
isDebtReward,
|
|
853
|
+
new Decimal(farmAndKey.farmState.totalActiveStakeScaled.toString())
|
|
854
|
+
);
|
|
849
855
|
if (apy.isZero() && apr.isZero()) {
|
|
850
856
|
continue;
|
|
851
857
|
}
|
|
@@ -855,9 +861,14 @@ export class KaminoReserve {
|
|
|
855
861
|
return yields;
|
|
856
862
|
}
|
|
857
863
|
|
|
858
|
-
|
|
864
|
+
calculateRewardYield(
|
|
865
|
+
prices: KaminoPrices,
|
|
866
|
+
rewardInfo: RewardInfo,
|
|
867
|
+
isDebtReward: boolean,
|
|
868
|
+
farmTotalStakeLamports: Decimal
|
|
869
|
+
) {
|
|
859
870
|
const mintAddress = this.getLiquidityMint();
|
|
860
|
-
const rewardPerTimeUnitSecond = getRewardPerTimeUnitSecond(rewardInfo);
|
|
871
|
+
const rewardPerTimeUnitSecond = getRewardPerTimeUnitSecond(rewardInfo, farmTotalStakeLamports);
|
|
861
872
|
const reserveToken = prices.spot[mintAddress.toString()];
|
|
862
873
|
const rewardToken = prices.spot[rewardInfo.token.mint.toString()];
|
|
863
874
|
|
|
@@ -1302,7 +1313,6 @@ export const RESERVE_CONFIG_UPDATER = new ConfigUpdater(UpdateConfigMode.fromDec
|
|
|
1302
1313
|
[UpdateConfigMode.UpdateBlockCTokenUsage.kind]: config.blockCtokenUsage,
|
|
1303
1314
|
}));
|
|
1304
1315
|
|
|
1305
|
-
// TODO : this needs to be deprecated
|
|
1306
1316
|
export async function updateEntireReserveConfigIx(
|
|
1307
1317
|
signer: TransactionSigner,
|
|
1308
1318
|
marketAddress: Address,
|
|
@@ -1359,60 +1369,30 @@ export type ReserveWithAddress = {
|
|
|
1359
1369
|
state: Reserve;
|
|
1360
1370
|
};
|
|
1361
1371
|
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
UpdateConfigMode.
|
|
1365
|
-
UpdateConfigMode.
|
|
1372
|
+
const NON_VALIDATED_DISCRIMINATORS = [
|
|
1373
|
+
UpdateConfigMode.UpdateScopePriceFeed.discriminator,
|
|
1374
|
+
UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,
|
|
1375
|
+
UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,
|
|
1376
|
+
UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,
|
|
1377
|
+
UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,
|
|
1378
|
+
UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,
|
|
1379
|
+
UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,
|
|
1366
1380
|
];
|
|
1367
1381
|
|
|
1368
1382
|
function shouldSkipValidation(mode: UpdateConfigModeKind, reserve: Reserve | undefined): boolean {
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
return true;
|
|
1374
|
-
}
|
|
1375
|
-
const is_usage_blocked = reserve.config.depositLimit.isZero() && reserve.config.borrowLimit.isZero();
|
|
1376
|
-
return is_usage_blocked;
|
|
1383
|
+
return (
|
|
1384
|
+
NON_VALIDATED_DISCRIMINATORS.includes(mode.discriminator) &&
|
|
1385
|
+
!reserve?.liquidity.availableAmount.gten(MIN_INITIAL_DEPOSIT)
|
|
1386
|
+
);
|
|
1377
1387
|
}
|
|
1378
1388
|
|
|
1379
|
-
// Lowest priority gets updated first
|
|
1380
1389
|
function priorityOf(mode: UpdateConfigModeKind): number {
|
|
1381
1390
|
switch (mode.discriminator) {
|
|
1382
1391
|
case UpdateConfigMode.UpdateScopePriceFeed.discriminator:
|
|
1383
1392
|
return 0;
|
|
1384
|
-
case UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator:
|
|
1385
|
-
return 0;
|
|
1386
1393
|
case UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator:
|
|
1387
1394
|
return 0;
|
|
1388
|
-
case UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator:
|
|
1389
|
-
return 0;
|
|
1390
|
-
case UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator:
|
|
1391
|
-
return 0;
|
|
1392
|
-
case UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator:
|
|
1393
|
-
return 0;
|
|
1394
|
-
case UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator:
|
|
1395
|
-
return 0;
|
|
1396
|
-
case UpdateConfigMode.UpdateTokenInfoName.discriminator:
|
|
1397
|
-
return 0;
|
|
1398
|
-
case UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator:
|
|
1399
|
-
return 0;
|
|
1400
|
-
case UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator:
|
|
1401
|
-
return 0;
|
|
1402
|
-
case UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.discriminator:
|
|
1403
|
-
return priorityOf(new UpdateConfigMode.UpdateAutodeleverageEnabled()) - 1;
|
|
1404
|
-
case UpdateConfigMode.UpdateDeleveragingMarginCallPeriod.discriminator:
|
|
1405
|
-
return priorityOf(new UpdateConfigMode.UpdateAutodeleverageEnabled()) - 1;
|
|
1406
|
-
case UpdateConfigMode.UpdateDeleveragingThresholdDecreaseBpsPerDay.discriminator:
|
|
1407
|
-
return priorityOf(new UpdateConfigMode.UpdateAutodeleverageEnabled()) - 1;
|
|
1408
|
-
case UpdateConfigMode.UpdateAutodeleverageEnabled.discriminator:
|
|
1409
|
-
return 4;
|
|
1410
|
-
// Always update last bc we cannot skip validation
|
|
1411
|
-
case UpdateConfigMode.UpdateDepositLimit.discriminator:
|
|
1412
|
-
return 63;
|
|
1413
|
-
case UpdateConfigMode.UpdateBorrowLimit.discriminator:
|
|
1414
|
-
return 63;
|
|
1415
1395
|
default:
|
|
1416
|
-
return
|
|
1396
|
+
return 1;
|
|
1417
1397
|
}
|
|
1418
1398
|
}
|
package/src/classes/shared.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Address } from '@solana/kit';
|
|
2
2
|
import Decimal from 'decimal.js';
|
|
3
|
-
import {
|
|
3
|
+
import { FarmAndKey, RewardInfo } from '@kamino-finance/farms-sdk';
|
|
4
4
|
|
|
5
5
|
export type ConfigType = Array<MarketConfigType>;
|
|
6
6
|
|
|
@@ -55,7 +55,7 @@ export type ReserveRewardYield = {
|
|
|
55
55
|
|
|
56
56
|
export type ReserveFarmInfo = {
|
|
57
57
|
fetched: boolean;
|
|
58
|
-
|
|
58
|
+
farms: FarmAndKey[];
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
export enum FeeCalculation {
|