mango-v4/ts/types.ts

178 lines
4.0 KiB
TypeScript

import { PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY } from '@solana/web3.js';
import BN from 'bn.js';
import { I80F48 } from './I80F48';
export class Group {
constructor(admin: PublicKey, bump: number) {}
}
export class Bank {
public depositIndex: I80F48;
public borrowIndex: I80F48;
static from(
publicKey: PublicKey,
obj: {
group: PublicKey;
mint: PublicKey;
vault: PublicKey;
oracle: PublicKey;
depositIndex: I80F48Dto;
borrowIndex: I80F48Dto;
indexedTotalDeposits: I80F48Dto;
indexedTotalBorrows: I80F48Dto;
maintAssetWeight: I80F48Dto;
initAssetWeight: I80F48Dto;
maintLiabWeight: I80F48Dto;
initLiabWeight: I80F48Dto;
liquidationFee: I80F48Dto;
dust: Object;
tokenIndex: number;
},
) {
return new Bank(
publicKey,
obj.group,
obj.mint,
obj.vault,
obj.oracle,
obj.depositIndex,
obj.borrowIndex,
obj.indexedTotalDeposits,
obj.indexedTotalBorrows,
obj.maintAssetWeight,
obj.initAssetWeight,
obj.maintLiabWeight,
obj.initLiabWeight,
obj.liquidationFee,
obj.dust,
obj.tokenIndex,
);
}
constructor(
public publicKey: PublicKey,
group: PublicKey,
mint: PublicKey,
public vault: PublicKey,
oracle: PublicKey,
depositIndex: I80F48Dto,
borrowIndex: I80F48Dto,
indexedTotalDeposits: I80F48Dto,
indexedTotalBorrows: I80F48Dto,
maintAssetWeight: I80F48Dto,
initAssetWeight: I80F48Dto,
maintLiabWeight: I80F48Dto,
initLiabWeight: I80F48Dto,
liquidationFee: I80F48Dto,
dust: Object,
public tokenIndex: number,
) {
this.depositIndex = I80F48.from(depositIndex);
this.borrowIndex = I80F48.from(borrowIndex);
}
toString(): string {
return `Bank ${
this.tokenIndex
} deposit index - ${this.depositIndex.toNumber()}, borrow index - ${this.borrowIndex.toNumber()}`;
}
}
export class MangoAccount {
public tokenAccountMap: TokenAccount[];
static from(
publicKey: PublicKey,
obj: {
group: PublicKey;
owner: PublicKey;
delegate: PublicKey;
tokenAccountMap: unknown;
serum3AccountMap: Object;
perp: unknown;
beingLiquidated: number;
isBankrupt: number;
accountNum: number;
bump: number;
reserved: number[];
},
) {
return new MangoAccount(
publicKey,
obj.group,
obj.owner,
obj.delegate,
obj.tokenAccountMap as { values: TokenAccountDto[] },
obj.serum3AccountMap,
obj.perp,
obj.beingLiquidated,
obj.isBankrupt,
obj.accountNum,
obj.bump,
obj.reserved,
);
}
constructor(
public publicKey: PublicKey,
group: PublicKey,
owner: PublicKey,
delegate: PublicKey,
tokenAccountMap: { values: TokenAccountDto[] },
serum3AccountMap: Object,
perp: unknown,
beingLiquidated: number,
isBankrupt: number,
accountNum: number,
bump: number,
reserved: number[],
) {
this.tokenAccountMap = tokenAccountMap.values.map((dto) =>
TokenAccount.from(dto),
);
}
find(tokenIndex: number): TokenAccount | undefined {
return this.tokenAccountMap.find((ta) => ta.tokenIndex == tokenIndex);
}
getNativeDeposit(bank: Bank): I80F48 {
const ta = this.find(bank.tokenIndex);
return bank.depositIndex.mul(ta?.indexedValue!);
}
getNativeBorrow(bank: Bank): I80F48 {
const ta = this.find(bank.tokenIndex);
return bank.borrowIndex.mul(ta?.indexedValue!);
}
}
export class I80F48Dto {
constructor(public val: BN) {}
}
export class TokenAccount {
static from(dto: TokenAccountDto) {
return new TokenAccount(
I80F48.from(dto.indexedValue),
dto.tokenIndex,
dto.inUseCount,
);
}
constructor(
public indexedValue: I80F48,
public tokenIndex: number,
public inUseCount: number,
) {}
}
export class TokenAccountDto {
constructor(
public indexedValue: I80F48Dto,
public tokenIndex: number,
public inUseCount: number,
public reserved: number[],
) {}
}