2023-02-21 23:36:59 -08:00
|
|
|
import { BN } from '@coral-xyz/anchor';
|
|
|
|
import { utf8 } from '@coral-xyz/anchor/dist/cjs/utils/bytes';
|
2022-04-08 08:17:26 -07:00
|
|
|
import { PublicKey } from '@solana/web3.js';
|
2024-01-15 03:45:00 -08:00
|
|
|
import { format } from 'path';
|
2023-07-13 07:29:13 -07:00
|
|
|
import { I80F48, I80F48Dto, ONE_I80F48, ZERO_I80F48 } from '../numbers/I80F48';
|
2022-09-30 06:07:43 -07:00
|
|
|
import { As, toUiDecimals } from '../utils';
|
2023-10-19 01:03:07 -07:00
|
|
|
import { OracleProvider, isOracleStaleOrUnconfident } from './oracle';
|
2022-04-02 23:57:45 -07:00
|
|
|
|
2022-09-29 06:51:09 -07:00
|
|
|
export type TokenIndex = number & As<'token-index'>;
|
|
|
|
|
2022-12-08 01:16:06 -08:00
|
|
|
export type OracleConfigDto = {
|
2022-06-21 03:38:01 -07:00
|
|
|
confFilter: I80F48Dto;
|
2022-11-09 04:25:53 -08:00
|
|
|
maxStalenessSlots: BN;
|
2022-12-08 01:16:06 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
export type OracleConfig = {
|
|
|
|
confFilter: I80F48;
|
|
|
|
maxStalenessSlots: BN;
|
2022-06-21 03:38:01 -07:00
|
|
|
};
|
|
|
|
|
2022-12-02 06:48:43 -08:00
|
|
|
export type StablePriceModel = {
|
|
|
|
stablePrice: number;
|
|
|
|
lastUpdateTimestamp: BN;
|
|
|
|
delayPrices: number[];
|
|
|
|
delayAccumulatorPrice: number;
|
|
|
|
delayAccumulatorTime: number;
|
|
|
|
delayIntervalSeconds: number;
|
|
|
|
delayGrowthLimit: number;
|
|
|
|
stableGrowthLimit: number;
|
|
|
|
lastDelayIntervalIndex: number;
|
|
|
|
};
|
|
|
|
|
2022-09-27 04:59:00 -07:00
|
|
|
export interface BankForHealth {
|
2022-09-29 06:51:09 -07:00
|
|
|
tokenIndex: TokenIndex;
|
2022-09-27 04:59:00 -07:00
|
|
|
maintAssetWeight: I80F48;
|
|
|
|
initAssetWeight: I80F48;
|
|
|
|
maintLiabWeight: I80F48;
|
|
|
|
initLiabWeight: I80F48;
|
|
|
|
price: I80F48;
|
2022-12-02 06:48:43 -08:00
|
|
|
stablePriceModel: StablePriceModel;
|
2022-12-08 01:16:06 -08:00
|
|
|
|
2023-02-10 00:00:36 -08:00
|
|
|
scaledInitAssetWeight(price: I80F48): I80F48;
|
|
|
|
scaledInitLiabWeight(price: I80F48): I80F48;
|
2023-05-17 06:50:05 -07:00
|
|
|
nativeDeposits(): I80F48;
|
|
|
|
nativeBorrows(): I80F48;
|
2023-11-14 05:52:04 -08:00
|
|
|
maintWeights(): [I80F48, I80F48];
|
2023-05-17 06:50:05 -07:00
|
|
|
|
|
|
|
depositWeightScaleStartQuote: number;
|
|
|
|
borrowWeightScaleStartQuote: number;
|
2022-09-23 02:43:26 -07:00
|
|
|
}
|
|
|
|
|
2022-09-27 04:59:00 -07:00
|
|
|
export class Bank implements BankForHealth {
|
2022-04-12 07:19:58 -07:00
|
|
|
public name: string;
|
2022-12-08 01:16:06 -08:00
|
|
|
public oracleConfig: OracleConfig;
|
2022-04-02 23:57:45 -07:00
|
|
|
public depositIndex: I80F48;
|
|
|
|
public borrowIndex: I80F48;
|
2022-08-09 23:22:31 -07:00
|
|
|
public indexedDeposits: I80F48;
|
|
|
|
public indexedBorrows: I80F48;
|
2022-07-31 00:25:11 -07:00
|
|
|
public avgUtilization: I80F48;
|
|
|
|
public adjustmentFactor: I80F48;
|
2022-06-21 03:38:01 -07:00
|
|
|
public maxRate: I80F48;
|
|
|
|
public rate0: I80F48;
|
|
|
|
public rate1: I80F48;
|
|
|
|
public util0: I80F48;
|
|
|
|
public util1: I80F48;
|
2022-09-27 04:59:00 -07:00
|
|
|
public _price: I80F48 | undefined;
|
|
|
|
public _uiPrice: number | undefined;
|
2023-01-17 10:03:16 -08:00
|
|
|
public _oracleLastUpdatedSlot: number | undefined;
|
2023-10-19 01:03:07 -07:00
|
|
|
public _oracleLastKnownDeviation: I80F48 | undefined;
|
2023-03-15 06:44:51 -07:00
|
|
|
public _oracleProvider: OracleProvider | undefined;
|
2022-08-13 10:36:09 -07:00
|
|
|
public collectedFeesNative: I80F48;
|
2022-08-09 23:22:31 -07:00
|
|
|
public loanFeeRate: I80F48;
|
|
|
|
public loanOriginationFeeRate: I80F48;
|
2022-07-04 03:29:35 -07:00
|
|
|
public initAssetWeight: I80F48;
|
|
|
|
public maintAssetWeight: I80F48;
|
|
|
|
public initLiabWeight: I80F48;
|
|
|
|
public maintLiabWeight: I80F48;
|
|
|
|
public liquidationFee: I80F48;
|
2022-08-15 06:53:51 -07:00
|
|
|
public dust: I80F48;
|
2023-11-14 05:52:04 -08:00
|
|
|
public maintWeightShiftDurationInv: I80F48;
|
|
|
|
public maintWeightShiftAssetTarget: I80F48;
|
|
|
|
public maintWeightShiftLiabTarget: I80F48;
|
2024-01-15 03:45:00 -08:00
|
|
|
public zeroUtilRate: I80F48;
|
2024-01-19 07:34:55 -08:00
|
|
|
public platformLiquidationFee: I80F48;
|
|
|
|
public collectedLiquidationFees: I80F48;
|
2022-04-02 23:57:45 -07:00
|
|
|
|
|
|
|
static from(
|
|
|
|
publicKey: PublicKey,
|
|
|
|
obj: {
|
|
|
|
group: PublicKey;
|
2022-08-04 01:41:54 -07:00
|
|
|
name: number[];
|
2022-04-02 23:57:45 -07:00
|
|
|
mint: PublicKey;
|
|
|
|
vault: PublicKey;
|
|
|
|
oracle: PublicKey;
|
2022-12-08 01:16:06 -08:00
|
|
|
oracleConfig: OracleConfigDto;
|
2022-12-06 05:05:12 -08:00
|
|
|
stablePriceModel: StablePriceModel;
|
2022-04-02 23:57:45 -07:00
|
|
|
depositIndex: I80F48Dto;
|
|
|
|
borrowIndex: I80F48Dto;
|
2022-08-04 01:41:54 -07:00
|
|
|
indexedDeposits: I80F48Dto;
|
|
|
|
indexedBorrows: I80F48Dto;
|
2022-07-31 00:25:11 -07:00
|
|
|
indexLastUpdated: BN;
|
|
|
|
bankRateLastUpdated: BN;
|
|
|
|
avgUtilization: I80F48Dto;
|
|
|
|
adjustmentFactor: I80F48Dto;
|
2022-05-09 23:03:46 -07:00
|
|
|
util0: I80F48Dto;
|
|
|
|
rate0: I80F48Dto;
|
|
|
|
util1: I80F48Dto;
|
|
|
|
rate1: I80F48Dto;
|
|
|
|
maxRate: I80F48Dto;
|
|
|
|
collectedFeesNative: I80F48Dto;
|
2022-08-09 23:22:31 -07:00
|
|
|
loanOriginationFeeRate: I80F48Dto;
|
2022-12-06 05:05:12 -08:00
|
|
|
loanFeeRate: I80F48Dto;
|
2022-04-02 23:57:45 -07:00
|
|
|
maintAssetWeight: I80F48Dto;
|
|
|
|
initAssetWeight: I80F48Dto;
|
|
|
|
maintLiabWeight: I80F48Dto;
|
|
|
|
initLiabWeight: I80F48Dto;
|
|
|
|
liquidationFee: I80F48Dto;
|
2022-08-04 01:41:54 -07:00
|
|
|
dust: I80F48Dto;
|
2022-08-06 03:59:13 -07:00
|
|
|
flashLoanTokenAccountInitial: BN;
|
2022-08-04 01:41:54 -07:00
|
|
|
flashLoanApprovedAmount: BN;
|
2022-04-02 23:57:45 -07:00
|
|
|
tokenIndex: number;
|
2022-05-27 05:52:03 -07:00
|
|
|
mintDecimals: number;
|
2022-08-04 01:41:54 -07:00
|
|
|
bankNum: number;
|
2022-12-02 06:48:43 -08:00
|
|
|
minVaultToDepositsRatio: number;
|
2022-12-06 00:34:02 -08:00
|
|
|
netBorrowLimitWindowSizeTs: BN;
|
2022-12-02 06:48:43 -08:00
|
|
|
lastNetBorrowsWindowStartTs: BN;
|
2022-12-06 00:34:02 -08:00
|
|
|
netBorrowLimitPerWindowQuote: BN;
|
2022-12-02 06:48:43 -08:00
|
|
|
netBorrowsInWindow: BN;
|
2022-12-06 00:34:02 -08:00
|
|
|
borrowWeightScaleStartQuote: number;
|
|
|
|
depositWeightScaleStartQuote: number;
|
2023-01-04 04:14:05 -08:00
|
|
|
reduceOnly: number;
|
2023-04-20 00:55:14 -07:00
|
|
|
forceClose: number;
|
2023-08-09 04:27:25 -07:00
|
|
|
feesWithdrawn: BN;
|
|
|
|
tokenConditionalSwapTakerFeeRate: number;
|
|
|
|
tokenConditionalSwapMakerFeeRate: number;
|
2023-10-13 00:02:23 -07:00
|
|
|
flashLoanSwapFeeRate: number;
|
2023-11-14 05:52:04 -08:00
|
|
|
interestTargetUtilization: number;
|
|
|
|
interestCurveScaling: number;
|
2023-12-05 06:43:38 -08:00
|
|
|
potentialSerumTokens: BN;
|
2023-11-14 05:52:04 -08:00
|
|
|
maintWeightShiftStart: BN;
|
|
|
|
maintWeightShiftEnd: BN;
|
|
|
|
maintWeightShiftDurationInv: I80F48Dto;
|
|
|
|
maintWeightShiftAssetTarget: I80F48Dto;
|
|
|
|
maintWeightShiftLiabTarget: I80F48Dto;
|
2023-12-05 06:43:38 -08:00
|
|
|
depositLimit: BN;
|
2024-01-15 03:45:00 -08:00
|
|
|
zeroUtilRate: I80F48Dto;
|
2024-01-19 07:34:55 -08:00
|
|
|
platformLiquidationFee: I80F48Dto;
|
|
|
|
collectedLiquidationFees: I80F48Dto;
|
2022-04-02 23:57:45 -07:00
|
|
|
},
|
2022-09-29 06:51:09 -07:00
|
|
|
): Bank {
|
2022-04-02 23:57:45 -07:00
|
|
|
return new Bank(
|
|
|
|
publicKey,
|
|
|
|
obj.group,
|
2022-12-06 05:05:12 -08:00
|
|
|
obj.name,
|
2022-04-02 23:57:45 -07:00
|
|
|
obj.mint,
|
|
|
|
obj.vault,
|
|
|
|
obj.oracle,
|
2022-06-21 03:38:01 -07:00
|
|
|
obj.oracleConfig,
|
2022-12-06 05:05:12 -08:00
|
|
|
obj.stablePriceModel,
|
2022-04-02 23:57:45 -07:00
|
|
|
obj.depositIndex,
|
|
|
|
obj.borrowIndex,
|
2022-08-04 01:41:54 -07:00
|
|
|
obj.indexedDeposits,
|
|
|
|
obj.indexedBorrows,
|
2022-07-31 00:25:11 -07:00
|
|
|
obj.indexLastUpdated,
|
|
|
|
obj.bankRateLastUpdated,
|
|
|
|
obj.avgUtilization,
|
|
|
|
obj.adjustmentFactor,
|
2022-05-09 23:03:46 -07:00
|
|
|
obj.util0,
|
|
|
|
obj.rate0,
|
|
|
|
obj.util1,
|
|
|
|
obj.rate1,
|
|
|
|
obj.maxRate,
|
|
|
|
obj.collectedFeesNative,
|
2022-08-09 23:22:31 -07:00
|
|
|
obj.loanOriginationFeeRate,
|
2022-12-06 05:05:12 -08:00
|
|
|
obj.loanFeeRate,
|
2022-04-02 23:57:45 -07:00
|
|
|
obj.maintAssetWeight,
|
|
|
|
obj.initAssetWeight,
|
|
|
|
obj.maintLiabWeight,
|
|
|
|
obj.initLiabWeight,
|
|
|
|
obj.liquidationFee,
|
|
|
|
obj.dust,
|
2022-08-06 03:59:13 -07:00
|
|
|
obj.flashLoanTokenAccountInitial,
|
2022-08-04 01:41:54 -07:00
|
|
|
obj.flashLoanApprovedAmount,
|
2022-09-29 06:51:09 -07:00
|
|
|
obj.tokenIndex as TokenIndex,
|
2022-05-27 05:52:03 -07:00
|
|
|
obj.mintDecimals,
|
2022-08-04 01:41:54 -07:00
|
|
|
obj.bankNum,
|
2022-12-02 06:48:43 -08:00
|
|
|
obj.minVaultToDepositsRatio,
|
2022-12-06 00:34:02 -08:00
|
|
|
obj.netBorrowLimitWindowSizeTs,
|
2022-12-02 06:48:43 -08:00
|
|
|
obj.lastNetBorrowsWindowStartTs,
|
2022-12-06 00:34:02 -08:00
|
|
|
obj.netBorrowLimitPerWindowQuote,
|
2022-12-02 06:48:43 -08:00
|
|
|
obj.netBorrowsInWindow,
|
2022-12-06 00:34:02 -08:00
|
|
|
obj.borrowWeightScaleStartQuote,
|
|
|
|
obj.depositWeightScaleStartQuote,
|
2023-04-20 00:59:21 -07:00
|
|
|
obj.reduceOnly,
|
2023-04-20 00:55:14 -07:00
|
|
|
obj.forceClose == 1,
|
2023-08-09 04:27:25 -07:00
|
|
|
obj.feesWithdrawn,
|
|
|
|
obj.tokenConditionalSwapTakerFeeRate,
|
|
|
|
obj.tokenConditionalSwapMakerFeeRate,
|
2023-10-13 00:02:23 -07:00
|
|
|
obj.flashLoanSwapFeeRate,
|
2023-11-14 05:52:04 -08:00
|
|
|
obj.interestTargetUtilization,
|
|
|
|
obj.interestCurveScaling,
|
2023-12-05 06:43:38 -08:00
|
|
|
obj.potentialSerumTokens,
|
2023-11-14 05:52:04 -08:00
|
|
|
obj.maintWeightShiftStart,
|
|
|
|
obj.maintWeightShiftEnd,
|
|
|
|
obj.maintWeightShiftDurationInv,
|
|
|
|
obj.maintWeightShiftAssetTarget,
|
|
|
|
obj.maintWeightShiftLiabTarget,
|
2023-12-05 06:43:38 -08:00
|
|
|
obj.depositLimit,
|
2024-01-15 03:45:00 -08:00
|
|
|
obj.zeroUtilRate,
|
2024-01-19 07:34:55 -08:00
|
|
|
obj.platformLiquidationFee,
|
|
|
|
obj.collectedLiquidationFees,
|
2022-04-02 23:57:45 -07:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
public publicKey: PublicKey,
|
2022-04-07 09:58:42 -07:00
|
|
|
public group: PublicKey,
|
2022-12-06 05:05:12 -08:00
|
|
|
name: number[],
|
2022-04-07 09:58:42 -07:00
|
|
|
public mint: PublicKey,
|
2022-04-02 23:57:45 -07:00
|
|
|
public vault: PublicKey,
|
2022-04-03 07:02:14 -07:00
|
|
|
public oracle: PublicKey,
|
2022-12-08 01:16:06 -08:00
|
|
|
oracleConfig: OracleConfigDto,
|
2022-12-06 05:05:12 -08:00
|
|
|
public stablePriceModel: StablePriceModel,
|
2022-04-02 23:57:45 -07:00
|
|
|
depositIndex: I80F48Dto,
|
|
|
|
borrowIndex: I80F48Dto,
|
2022-08-04 01:41:54 -07:00
|
|
|
indexedDeposits: I80F48Dto,
|
|
|
|
indexedBorrows: I80F48Dto,
|
2022-07-31 00:25:11 -07:00
|
|
|
public indexLastUpdated: BN,
|
|
|
|
public bankRateLastUpdated: BN,
|
|
|
|
avgUtilization: I80F48Dto,
|
|
|
|
adjustmentFactor: I80F48Dto,
|
2022-05-09 23:03:46 -07:00
|
|
|
util0: I80F48Dto,
|
|
|
|
rate0: I80F48Dto,
|
|
|
|
util1: I80F48Dto,
|
|
|
|
rate1: I80F48Dto,
|
2022-06-21 03:38:01 -07:00
|
|
|
maxRate: I80F48Dto,
|
|
|
|
collectedFeesNative: I80F48Dto,
|
2022-08-09 23:22:31 -07:00
|
|
|
loanOriginationFeeRate: I80F48Dto,
|
2022-12-06 05:05:12 -08:00
|
|
|
loanFeeRate: I80F48Dto,
|
2022-04-02 23:57:45 -07:00
|
|
|
maintAssetWeight: I80F48Dto,
|
|
|
|
initAssetWeight: I80F48Dto,
|
|
|
|
maintLiabWeight: I80F48Dto,
|
|
|
|
initLiabWeight: I80F48Dto,
|
|
|
|
liquidationFee: I80F48Dto,
|
2022-08-04 10:42:41 -07:00
|
|
|
dust: I80F48Dto,
|
2023-07-19 11:57:29 -07:00
|
|
|
public flashLoanTokenAccountInitial: BN,
|
|
|
|
public flashLoanApprovedAmount: BN,
|
2022-09-29 06:51:09 -07:00
|
|
|
public tokenIndex: TokenIndex,
|
2022-05-27 05:52:03 -07:00
|
|
|
public mintDecimals: number,
|
2022-08-04 01:41:54 -07:00
|
|
|
public bankNum: number,
|
2022-12-13 10:41:19 -08:00
|
|
|
public minVaultToDepositsRatio: number,
|
2023-01-23 08:31:50 -08:00
|
|
|
public netBorrowLimitWindowSizeTs: BN,
|
|
|
|
public lastNetBorrowsWindowStartTs: BN,
|
2022-12-08 07:50:11 -08:00
|
|
|
public netBorrowLimitPerWindowQuote: BN,
|
|
|
|
public netBorrowsInWindow: BN,
|
2022-12-08 01:16:06 -08:00
|
|
|
public borrowWeightScaleStartQuote: number,
|
|
|
|
public depositWeightScaleStartQuote: number,
|
2023-04-20 00:59:21 -07:00
|
|
|
public reduceOnly: number,
|
2023-04-20 00:55:14 -07:00
|
|
|
public forceClose: boolean,
|
2023-08-09 04:27:25 -07:00
|
|
|
public feesWithdrawn: BN,
|
|
|
|
public tokenConditionalSwapTakerFeeRate: number,
|
|
|
|
public tokenConditionalSwapMakerFeeRate: number,
|
2023-10-13 00:02:23 -07:00
|
|
|
public flashLoanSwapFeeRate: number,
|
2023-11-14 05:52:04 -08:00
|
|
|
public interestTargetUtilization: number,
|
|
|
|
public interestCurveScaling: number,
|
2023-12-05 06:43:38 -08:00
|
|
|
public potentialSerumTokens: BN,
|
2023-11-14 05:52:04 -08:00
|
|
|
public maintWeightShiftStart: BN,
|
|
|
|
public maintWeightShiftEnd: BN,
|
|
|
|
maintWeightShiftDurationInv: I80F48Dto,
|
|
|
|
maintWeightShiftAssetTarget: I80F48Dto,
|
|
|
|
maintWeightShiftLiabTarget: I80F48Dto,
|
2023-12-05 06:43:38 -08:00
|
|
|
public depositLimit: BN,
|
2024-01-15 03:45:00 -08:00
|
|
|
zeroUtilRate: I80F48Dto,
|
2024-01-19 07:34:55 -08:00
|
|
|
platformLiquidationFee: I80F48Dto,
|
|
|
|
collectedLiquidationFees: I80F48Dto,
|
2022-04-02 23:57:45 -07:00
|
|
|
) {
|
2022-04-12 07:19:58 -07:00
|
|
|
this.name = utf8.decode(new Uint8Array(name)).split('\x00')[0];
|
2022-12-08 01:16:06 -08:00
|
|
|
this.oracleConfig = {
|
|
|
|
confFilter: I80F48.from(oracleConfig.confFilter),
|
|
|
|
maxStalenessSlots: oracleConfig.maxStalenessSlots,
|
|
|
|
} as OracleConfig;
|
2022-04-02 23:57:45 -07:00
|
|
|
this.depositIndex = I80F48.from(depositIndex);
|
|
|
|
this.borrowIndex = I80F48.from(borrowIndex);
|
2022-08-09 22:32:21 -07:00
|
|
|
this.indexedDeposits = I80F48.from(indexedDeposits);
|
|
|
|
this.indexedBorrows = I80F48.from(indexedBorrows);
|
2022-07-31 00:25:11 -07:00
|
|
|
this.avgUtilization = I80F48.from(avgUtilization);
|
|
|
|
this.adjustmentFactor = I80F48.from(adjustmentFactor);
|
2022-06-21 03:38:01 -07:00
|
|
|
this.maxRate = I80F48.from(maxRate);
|
|
|
|
this.util0 = I80F48.from(util0);
|
|
|
|
this.rate0 = I80F48.from(rate0);
|
|
|
|
this.util1 = I80F48.from(util1);
|
|
|
|
this.rate1 = I80F48.from(rate1);
|
2022-08-13 10:36:09 -07:00
|
|
|
this.collectedFeesNative = I80F48.from(collectedFeesNative);
|
2022-08-09 23:22:31 -07:00
|
|
|
this.loanFeeRate = I80F48.from(loanFeeRate);
|
|
|
|
this.loanOriginationFeeRate = I80F48.from(loanOriginationFeeRate);
|
2022-07-04 03:29:35 -07:00
|
|
|
this.maintAssetWeight = I80F48.from(maintAssetWeight);
|
|
|
|
this.initAssetWeight = I80F48.from(initAssetWeight);
|
|
|
|
this.maintLiabWeight = I80F48.from(maintLiabWeight);
|
|
|
|
this.initLiabWeight = I80F48.from(initLiabWeight);
|
|
|
|
this.liquidationFee = I80F48.from(liquidationFee);
|
2022-08-15 06:53:51 -07:00
|
|
|
this.dust = I80F48.from(dust);
|
2023-11-14 05:52:04 -08:00
|
|
|
this.maintWeightShiftDurationInv = I80F48.from(maintWeightShiftDurationInv);
|
|
|
|
this.maintWeightShiftAssetTarget = I80F48.from(maintWeightShiftAssetTarget);
|
|
|
|
this.maintWeightShiftLiabTarget = I80F48.from(maintWeightShiftLiabTarget);
|
2024-01-15 03:45:00 -08:00
|
|
|
this.zeroUtilRate = I80F48.from(zeroUtilRate);
|
2024-01-19 07:34:55 -08:00
|
|
|
this.platformLiquidationFee = I80F48.from(platformLiquidationFee);
|
|
|
|
this.collectedLiquidationFees = I80F48.from(collectedLiquidationFees);
|
2022-09-27 04:59:00 -07:00
|
|
|
this._price = undefined;
|
|
|
|
this._uiPrice = undefined;
|
2023-01-17 10:03:16 -08:00
|
|
|
this._oracleLastUpdatedSlot = undefined;
|
2023-03-15 06:44:51 -07:00
|
|
|
this._oracleProvider = undefined;
|
2022-04-02 23:57:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
toString(): string {
|
2022-07-05 10:31:47 -07:00
|
|
|
return (
|
|
|
|
'Bank ' +
|
2022-08-09 22:32:21 -07:00
|
|
|
'\n public key - ' +
|
|
|
|
this.publicKey.toBase58() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n token index - ' +
|
2022-07-05 10:31:47 -07:00
|
|
|
this.tokenIndex +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n token name - ' +
|
|
|
|
this.name +
|
2022-08-09 22:32:21 -07:00
|
|
|
'\n vault - ' +
|
|
|
|
this.vault.toBase58() +
|
2022-08-24 01:16:43 -07:00
|
|
|
'\n mintDecimals - ' +
|
|
|
|
this.mintDecimals +
|
|
|
|
'\n oracle - ' +
|
|
|
|
this.oracle.toBase58() +
|
|
|
|
'\n price - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this._price?.toString() +
|
2022-08-24 01:16:43 -07:00
|
|
|
'\n uiPrice - ' +
|
2022-09-29 06:51:09 -07:00
|
|
|
this._uiPrice +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n deposit index - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.depositIndex.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n borrow index - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.borrowIndex.toString() +
|
2022-08-09 22:32:21 -07:00
|
|
|
'\n indexedDeposits - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.indexedDeposits.toString() +
|
2022-08-09 22:32:21 -07:00
|
|
|
'\n indexedBorrows - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.indexedBorrows.toString() +
|
2022-07-31 00:25:11 -07:00
|
|
|
'\n indexLastUpdated - ' +
|
2022-07-31 00:36:46 -07:00
|
|
|
new Date(this.indexLastUpdated.toNumber() * 1000) +
|
2022-07-31 00:25:11 -07:00
|
|
|
'\n bankRateLastUpdated - ' +
|
2022-07-31 00:36:46 -07:00
|
|
|
new Date(this.bankRateLastUpdated.toNumber() * 1000) +
|
2022-07-31 00:25:11 -07:00
|
|
|
'\n avgUtilization - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.avgUtilization.toString() +
|
2022-07-31 00:25:11 -07:00
|
|
|
'\n adjustmentFactor - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.adjustmentFactor.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n maxRate - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.maxRate.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n util0 - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.util0.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n rate0 - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.rate0.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n util1 - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.util1.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n rate1 - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.rate1.toString() +
|
2022-08-09 23:22:31 -07:00
|
|
|
'\n loanFeeRate - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.loanFeeRate.toString() +
|
2022-08-09 23:22:31 -07:00
|
|
|
'\n loanOriginationFeeRate - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.loanOriginationFeeRate.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n maintAssetWeight - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.maintAssetWeight.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n initAssetWeight - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.initAssetWeight.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n maintLiabWeight - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.maintLiabWeight.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n initLiabWeight - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.initLiabWeight.toString() +
|
2022-07-14 00:37:11 -07:00
|
|
|
'\n liquidationFee - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.liquidationFee.toString() +
|
2022-07-31 00:25:11 -07:00
|
|
|
'\n uiDeposits() - ' +
|
|
|
|
this.uiDeposits() +
|
|
|
|
'\n uiBorrows() - ' +
|
|
|
|
this.uiBorrows() +
|
|
|
|
'\n getDepositRate() - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.getDepositRate().toString() +
|
2022-07-31 00:25:11 -07:00
|
|
|
'\n getBorrowRate() - ' +
|
2022-09-30 06:07:43 -07:00
|
|
|
this.getBorrowRate().toString()
|
2022-07-05 10:31:47 -07:00
|
|
|
);
|
2022-04-02 23:57:45 -07:00
|
|
|
}
|
2022-06-21 03:38:01 -07:00
|
|
|
|
2023-10-19 01:03:07 -07:00
|
|
|
isOracleStaleOrUnconfident(nowSlot: number): boolean {
|
|
|
|
return isOracleStaleOrUnconfident(
|
|
|
|
nowSlot,
|
|
|
|
this.oracleConfig.maxStalenessSlots.toNumber(),
|
|
|
|
this.oracleLastUpdatedSlot,
|
|
|
|
this._oracleLastKnownDeviation,
|
|
|
|
this.oracleConfig.confFilter,
|
|
|
|
this.price,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-04-20 00:59:21 -07:00
|
|
|
areDepositsReduceOnly(): boolean {
|
|
|
|
return this.reduceOnly == 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
areBorrowsReduceOnly(): boolean {
|
|
|
|
return this.reduceOnly == 1 || this.reduceOnly == 2;
|
|
|
|
}
|
|
|
|
|
2023-02-10 00:00:36 -08:00
|
|
|
scaledInitAssetWeight(price: I80F48): I80F48 {
|
2024-01-22 09:56:50 -08:00
|
|
|
const depositsQuote = this.nativeDeposits()
|
|
|
|
.add(I80F48.fromU64(this.potentialSerumTokens))
|
|
|
|
.mul(price);
|
2022-12-08 01:16:06 -08:00
|
|
|
if (
|
2022-12-08 21:08:23 -08:00
|
|
|
this.depositWeightScaleStartQuote >= Number.MAX_SAFE_INTEGER ||
|
2022-12-08 01:16:06 -08:00
|
|
|
depositsQuote.lte(I80F48.fromNumber(this.depositWeightScaleStartQuote))
|
|
|
|
) {
|
|
|
|
return this.initAssetWeight;
|
|
|
|
}
|
|
|
|
return this.initAssetWeight.mul(
|
|
|
|
I80F48.fromNumber(this.depositWeightScaleStartQuote).div(depositsQuote),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-02-10 00:00:36 -08:00
|
|
|
scaledInitLiabWeight(price: I80F48): I80F48 {
|
|
|
|
const borrowsQuote = this.nativeBorrows().mul(price);
|
2022-12-08 21:08:23 -08:00
|
|
|
if (
|
|
|
|
this.borrowWeightScaleStartQuote >= Number.MAX_SAFE_INTEGER ||
|
|
|
|
borrowsQuote.lte(I80F48.fromNumber(this.borrowWeightScaleStartQuote))
|
|
|
|
) {
|
2022-12-08 01:16:06 -08:00
|
|
|
return this.initLiabWeight;
|
|
|
|
}
|
|
|
|
return this.initLiabWeight.mul(
|
|
|
|
borrowsQuote.div(I80F48.fromNumber(this.borrowWeightScaleStartQuote)),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-11-14 05:52:04 -08:00
|
|
|
maintWeights(): [I80F48, I80F48] {
|
|
|
|
const nowTs = new BN(Date.now() / 1000);
|
|
|
|
if (
|
|
|
|
this.maintWeightShiftDurationInv.isZero() ||
|
|
|
|
nowTs.lte(this.maintWeightShiftStart)
|
|
|
|
) {
|
|
|
|
return [this.maintAssetWeight, this.maintLiabWeight];
|
|
|
|
} else if (nowTs.gte(this.maintWeightShiftEnd)) {
|
|
|
|
return [
|
|
|
|
this.maintWeightShiftAssetTarget,
|
|
|
|
this.maintWeightShiftLiabTarget,
|
|
|
|
];
|
|
|
|
} else {
|
|
|
|
const scale = I80F48.fromU64(nowTs.sub(this.maintWeightShiftStart)).mul(
|
|
|
|
this.maintWeightShiftDurationInv,
|
|
|
|
);
|
|
|
|
const asset = this.maintAssetWeight.add(
|
|
|
|
this.maintWeightShiftAssetTarget.sub(this.maintAssetWeight).mul(scale),
|
|
|
|
);
|
|
|
|
const liab = this.maintLiabWeight.add(
|
|
|
|
this.maintWeightShiftLiabTarget.sub(this.maintLiabWeight).mul(scale),
|
|
|
|
);
|
|
|
|
return [asset, liab];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-07 04:12:37 -07:00
|
|
|
getAssetPrice(): I80F48 {
|
|
|
|
return this.price.min(I80F48.fromNumber(this.stablePriceModel.stablePrice));
|
|
|
|
}
|
|
|
|
|
|
|
|
getLiabPrice(): I80F48 {
|
|
|
|
return this.price.max(I80F48.fromNumber(this.stablePriceModel.stablePrice));
|
|
|
|
}
|
|
|
|
|
2022-09-27 04:59:00 -07:00
|
|
|
get price(): I80F48 {
|
2023-03-16 02:10:52 -07:00
|
|
|
if (this._price === undefined) {
|
2022-09-27 04:59:00 -07:00
|
|
|
throw new Error(
|
2022-09-29 06:51:09 -07:00
|
|
|
`Undefined price for bank ${this.publicKey} with tokenIndex ${this.tokenIndex}!`,
|
2022-09-27 04:59:00 -07:00
|
|
|
);
|
|
|
|
}
|
|
|
|
return this._price;
|
|
|
|
}
|
|
|
|
|
|
|
|
get uiPrice(): number {
|
2023-03-16 02:10:52 -07:00
|
|
|
if (this._uiPrice === undefined) {
|
2022-09-27 04:59:00 -07:00
|
|
|
throw new Error(
|
2022-09-29 06:51:09 -07:00
|
|
|
`Undefined uiPrice for bank ${this.publicKey} with tokenIndex ${this.tokenIndex}!`,
|
2022-09-27 04:59:00 -07:00
|
|
|
);
|
|
|
|
}
|
|
|
|
return this._uiPrice;
|
|
|
|
}
|
|
|
|
|
2023-01-17 10:03:16 -08:00
|
|
|
get oracleLastUpdatedSlot(): number {
|
2023-03-16 02:10:52 -07:00
|
|
|
if (this._oracleLastUpdatedSlot === undefined) {
|
2023-01-17 10:03:16 -08:00
|
|
|
throw new Error(
|
|
|
|
`Undefined oracleLastUpdatedSlot for bank ${this.publicKey} with tokenIndex ${this.tokenIndex}!`,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return this._oracleLastUpdatedSlot;
|
|
|
|
}
|
|
|
|
|
2023-03-15 06:44:51 -07:00
|
|
|
get oracleProvider(): OracleProvider {
|
2023-03-16 02:10:52 -07:00
|
|
|
if (this._oracleProvider === undefined) {
|
2023-03-15 06:44:51 -07:00
|
|
|
throw new Error(
|
|
|
|
`Undefined oracleProvider for bank ${this.publicKey} with tokenIndex ${this.tokenIndex}!`,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return this._oracleProvider;
|
|
|
|
}
|
|
|
|
|
2022-06-21 03:38:01 -07:00
|
|
|
nativeDeposits(): I80F48 {
|
2022-08-19 02:45:38 -07:00
|
|
|
return this.indexedDeposits.mul(this.depositIndex);
|
2022-06-21 03:38:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
nativeBorrows(): I80F48 {
|
2022-08-19 02:45:38 -07:00
|
|
|
return this.indexedBorrows.mul(this.borrowIndex);
|
2022-06-21 03:38:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
uiDeposits(): number {
|
2023-07-13 07:29:13 -07:00
|
|
|
return toUiDecimals(this.nativeDeposits(), this.mintDecimals);
|
2022-06-21 03:38:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
uiBorrows(): number {
|
2023-07-13 07:29:13 -07:00
|
|
|
return toUiDecimals(this.nativeBorrows(), this.mintDecimals);
|
2022-06-21 03:38:01 -07:00
|
|
|
}
|
|
|
|
|
2022-08-19 02:58:10 -07:00
|
|
|
/**
|
|
|
|
*
|
2023-05-16 10:20:43 -07:00
|
|
|
* @returns borrow rate, 0 is 0% where 1 is 100%; not including loan upkeep rate
|
2022-08-19 02:58:10 -07:00
|
|
|
*/
|
2023-05-16 10:20:43 -07:00
|
|
|
getBorrowRateWithoutUpkeepRate(): I80F48 {
|
2022-06-21 03:38:01 -07:00
|
|
|
const totalBorrows = this.nativeBorrows();
|
|
|
|
const totalDeposits = this.nativeDeposits();
|
|
|
|
|
2023-09-27 03:57:06 -07:00
|
|
|
if (totalDeposits.isZero() || totalBorrows.isZero()) {
|
2022-09-01 00:48:23 -07:00
|
|
|
return ZERO_I80F48();
|
2022-06-21 03:38:01 -07:00
|
|
|
}
|
|
|
|
|
2024-01-15 03:45:00 -08:00
|
|
|
const utilization = totalBorrows
|
|
|
|
.div(totalDeposits)
|
|
|
|
.max(ZERO_I80F48())
|
|
|
|
.min(ONE_I80F48());
|
2023-11-14 05:52:04 -08:00
|
|
|
const scaling = I80F48.fromNumber(
|
|
|
|
this.interestCurveScaling == 0.0 ? 1.0 : this.interestCurveScaling,
|
|
|
|
);
|
2023-09-27 03:57:06 -07:00
|
|
|
if (utilization.lt(this.util0)) {
|
2024-01-15 03:45:00 -08:00
|
|
|
const slope = this.rate0.sub(this.zeroUtilRate).div(this.util0);
|
|
|
|
return this.zeroUtilRate.add(slope.mul(utilization)).mul(scaling);
|
2023-03-27 01:39:01 -07:00
|
|
|
} else if (utilization.lt(this.util1)) {
|
|
|
|
const extraUtil = utilization.sub(this.util0);
|
|
|
|
const slope = this.rate1.sub(this.rate0).div(this.util1.sub(this.util0));
|
2023-11-14 05:52:04 -08:00
|
|
|
return this.rate0.add(slope.mul(extraUtil)).mul(scaling);
|
2023-03-27 01:39:01 -07:00
|
|
|
} else {
|
2022-06-21 03:38:01 -07:00
|
|
|
const extraUtil = utilization.sub(this.util1);
|
|
|
|
const slope = this.maxRate
|
|
|
|
.sub(this.rate1)
|
|
|
|
.div(I80F48.fromNumber(1).sub(this.util1));
|
2023-11-14 05:52:04 -08:00
|
|
|
return this.rate1.add(slope.mul(extraUtil)).mul(scaling);
|
2022-06-21 03:38:01 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-19 02:58:10 -07:00
|
|
|
/**
|
|
|
|
*
|
2023-05-16 10:20:43 -07:00
|
|
|
* @returns total borrow rate, 0 is 0% where 1 is 100% (including loan upkeep rate)
|
|
|
|
*/
|
|
|
|
getBorrowRate(): I80F48 {
|
|
|
|
return this.getBorrowRateWithoutUpkeepRate().add(this.loanFeeRate);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @returns total borrow rate percentage (including loan upkeep rate)
|
2022-08-19 02:58:10 -07:00
|
|
|
*/
|
|
|
|
getBorrowRateUi(): number {
|
|
|
|
return this.getBorrowRate().toNumber() * 100;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @returns deposit rate, 0 is 0% where 1 is 100%
|
|
|
|
*/
|
2022-06-21 03:38:01 -07:00
|
|
|
getDepositRate(): I80F48 {
|
|
|
|
const borrowRate = this.getBorrowRate();
|
|
|
|
const totalBorrows = this.nativeBorrows();
|
|
|
|
const totalDeposits = this.nativeDeposits();
|
|
|
|
|
2022-09-01 00:48:23 -07:00
|
|
|
if (totalDeposits.isZero() && totalBorrows.isZero()) {
|
|
|
|
return ZERO_I80F48();
|
|
|
|
} else if (totalDeposits.isZero()) {
|
2022-06-21 03:38:01 -07:00
|
|
|
return this.maxRate;
|
|
|
|
}
|
|
|
|
|
|
|
|
const utilization = totalBorrows.div(totalDeposits);
|
|
|
|
return utilization.mul(borrowRate);
|
|
|
|
}
|
2022-08-19 02:58:10 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @returns deposit rate percentage
|
|
|
|
*/
|
|
|
|
getDepositRateUi(): number {
|
|
|
|
return this.getDepositRate().toNumber() * 100;
|
|
|
|
}
|
2023-07-13 07:29:13 -07:00
|
|
|
|
|
|
|
getNetBorrowLimitPerWindow(): I80F48 {
|
|
|
|
return I80F48.fromI64(this.netBorrowLimitPerWindowQuote).div(this.price);
|
|
|
|
}
|
|
|
|
|
|
|
|
getBorrowLimitLeftInWindow(): I80F48 {
|
|
|
|
return this.getNetBorrowLimitPerWindow()
|
|
|
|
.sub(I80F48.fromI64(this.netBorrowsInWindow))
|
|
|
|
.max(ZERO_I80F48());
|
|
|
|
}
|
|
|
|
|
|
|
|
getNetBorrowLimitPerWindowUi(): number {
|
|
|
|
return toUiDecimals(this.getNetBorrowLimitPerWindow(), this.mintDecimals);
|
|
|
|
}
|
|
|
|
|
|
|
|
getMaxWithdraw(vaultBalance: BN, userDeposits = ZERO_I80F48()): I80F48 {
|
|
|
|
userDeposits = userDeposits.max(ZERO_I80F48());
|
|
|
|
|
|
|
|
// any borrow must respect the minVaultToDepositsRatio
|
|
|
|
const minVaultBalanceRequired = this.nativeDeposits().mul(
|
|
|
|
I80F48.fromNumber(this.minVaultToDepositsRatio),
|
|
|
|
);
|
|
|
|
const maxBorrowFromVault = I80F48.fromI64(vaultBalance)
|
|
|
|
.sub(minVaultBalanceRequired)
|
|
|
|
.max(ZERO_I80F48());
|
|
|
|
// User deposits can exceed maxWithdrawFromVault
|
|
|
|
let maxBorrow = maxBorrowFromVault.sub(userDeposits).max(ZERO_I80F48());
|
|
|
|
// any borrow must respect the limit left in window
|
|
|
|
maxBorrow = maxBorrow.min(this.getBorrowLimitLeftInWindow());
|
|
|
|
// borrows would be applied a fee
|
|
|
|
maxBorrow = maxBorrow.div(ONE_I80F48().add(this.loanOriginationFeeRate));
|
|
|
|
|
|
|
|
// user deposits can always be withdrawn
|
|
|
|
// even if vaults can be depleted
|
|
|
|
return maxBorrow.add(userDeposits).min(I80F48.fromI64(vaultBalance));
|
|
|
|
}
|
|
|
|
|
|
|
|
getTimeToNextBorrowLimitWindowStartsTs(): number {
|
2023-10-19 01:03:07 -07:00
|
|
|
const timeToNextBorrowLimitWindowStartsTs = this.netBorrowLimitWindowSizeTs
|
2023-07-13 07:29:13 -07:00
|
|
|
.sub(new BN(Date.now() / 1000).sub(this.lastNetBorrowsWindowStartTs))
|
|
|
|
.toNumber();
|
2023-10-19 01:03:07 -07:00
|
|
|
return Math.max(timeToNextBorrowLimitWindowStartsTs, 0);
|
2023-07-13 07:29:13 -07:00
|
|
|
}
|
2024-01-18 08:47:57 -08:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param mintPk
|
|
|
|
* @returns remaining deposit limit for mint, returns null if there is no limit for bank
|
|
|
|
*/
|
|
|
|
public getRemainingDepositLimit(): BN | null {
|
|
|
|
const nativeDeposits = this.nativeDeposits();
|
|
|
|
const isNoLimit = this.depositLimit.isZero();
|
|
|
|
|
|
|
|
const remainingDepositLimit = !isNoLimit
|
2024-01-24 05:26:33 -08:00
|
|
|
? this.depositLimit
|
|
|
|
.sub(new BN(nativeDeposits.toNumber()))
|
|
|
|
.sub(this.potentialSerumTokens)
|
2024-01-18 08:47:57 -08:00
|
|
|
: null;
|
|
|
|
|
|
|
|
return remainingDepositLimit
|
|
|
|
? remainingDepositLimit.isNeg()
|
|
|
|
? new BN(0)
|
|
|
|
: remainingDepositLimit
|
|
|
|
: null;
|
|
|
|
}
|
2022-04-02 23:57:45 -07:00
|
|
|
}
|
|
|
|
|
2022-04-03 08:26:45 -07:00
|
|
|
export class MintInfo {
|
|
|
|
static from(
|
|
|
|
publicKey: PublicKey,
|
|
|
|
obj: {
|
2022-08-04 01:41:54 -07:00
|
|
|
group: PublicKey;
|
|
|
|
tokenIndex: number;
|
2022-04-03 08:26:45 -07:00
|
|
|
mint: PublicKey;
|
2022-06-27 02:27:17 -07:00
|
|
|
banks: PublicKey[];
|
|
|
|
vaults: PublicKey[];
|
2022-04-03 08:26:45 -07:00
|
|
|
oracle: PublicKey;
|
2022-08-01 09:46:45 -07:00
|
|
|
registrationTime: BN;
|
2022-08-04 01:41:54 -07:00
|
|
|
groupInsuranceFund: number;
|
2022-04-03 08:26:45 -07:00
|
|
|
},
|
2022-09-29 06:51:09 -07:00
|
|
|
): MintInfo {
|
2022-06-11 04:49:45 -07:00
|
|
|
return new MintInfo(
|
|
|
|
publicKey,
|
2022-08-04 01:41:54 -07:00
|
|
|
obj.group,
|
2022-09-29 06:51:09 -07:00
|
|
|
obj.tokenIndex as TokenIndex,
|
2022-06-11 04:49:45 -07:00
|
|
|
obj.mint,
|
2022-06-27 02:27:17 -07:00
|
|
|
obj.banks,
|
|
|
|
obj.vaults,
|
2022-06-11 04:49:45 -07:00
|
|
|
obj.oracle,
|
2022-08-01 09:46:45 -07:00
|
|
|
obj.registrationTime,
|
2023-02-25 11:34:16 -08:00
|
|
|
obj.groupInsuranceFund == 1,
|
2022-06-11 04:49:45 -07:00
|
|
|
);
|
2022-04-03 08:26:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
public publicKey: PublicKey,
|
2022-08-04 01:41:54 -07:00
|
|
|
public group: PublicKey,
|
2022-09-29 06:51:09 -07:00
|
|
|
public tokenIndex: TokenIndex,
|
2022-04-03 11:08:56 -07:00
|
|
|
public mint: PublicKey,
|
2022-06-27 02:27:17 -07:00
|
|
|
public banks: PublicKey[],
|
|
|
|
public vaults: PublicKey[],
|
2022-04-03 11:08:56 -07:00
|
|
|
public oracle: PublicKey,
|
2022-08-04 01:41:54 -07:00
|
|
|
public registrationTime: BN,
|
2023-02-25 11:34:16 -08:00
|
|
|
public groupInsuranceFund: boolean,
|
2022-04-03 08:26:45 -07:00
|
|
|
) {}
|
2022-06-27 02:27:17 -07:00
|
|
|
|
2022-07-04 03:29:35 -07:00
|
|
|
public firstBank(): PublicKey {
|
2022-06-27 02:27:17 -07:00
|
|
|
return this.banks[0];
|
|
|
|
}
|
2022-07-04 03:29:35 -07:00
|
|
|
public firstVault(): PublicKey {
|
2022-06-27 02:27:17 -07:00
|
|
|
return this.vaults[0];
|
|
|
|
}
|
2022-07-04 03:29:35 -07:00
|
|
|
|
|
|
|
toString(): string {
|
2022-08-04 10:42:41 -07:00
|
|
|
const res =
|
2022-07-04 03:29:35 -07:00
|
|
|
'mint ' +
|
|
|
|
this.mint.toBase58() +
|
|
|
|
'\n oracle ' +
|
|
|
|
this.oracle.toBase58() +
|
|
|
|
'\n banks ' +
|
|
|
|
this.banks
|
|
|
|
.filter((pk) => pk.toBase58() !== PublicKey.default.toBase58())
|
|
|
|
.toString() +
|
|
|
|
'\n vaults ' +
|
|
|
|
this.vaults
|
|
|
|
.filter((pk) => pk.toBase58() !== PublicKey.default.toBase58())
|
|
|
|
.toString();
|
|
|
|
return res;
|
|
|
|
}
|
2022-04-03 08:26:45 -07:00
|
|
|
}
|