59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
import { PublicKey } from '@solana/web3.js';
|
|
import { Group } from '../src/accounts/group';
|
|
import { ZERO_I80F48 } from '../src/numbers/I80F48';
|
|
|
|
/**
|
|
* scans mango group for all oracles that need updating
|
|
* includes bank oracle, fallback oracle and perp market oracles
|
|
*/
|
|
export function getOraclesForMangoGroup(
|
|
group: Group,
|
|
): { oraclePk: PublicKey; name: string }[] {
|
|
// oracles for tokens
|
|
const oracles1 = Array.from(group.banksMapByName.values())
|
|
.filter(
|
|
(b) =>
|
|
!(
|
|
b[0].nativeDeposits().eq(ZERO_I80F48()) &&
|
|
b[0].nativeBorrows().eq(ZERO_I80F48()) &&
|
|
b[0].reduceOnly == 1
|
|
),
|
|
)
|
|
.map((b) => {
|
|
return {
|
|
oraclePk: b[0].oracle,
|
|
|
|
name: b[0].name,
|
|
};
|
|
});
|
|
|
|
// oracles for perp markets
|
|
const oracles2 = Array.from(group.perpMarketsMapByName.values()).map((pM) => {
|
|
return {
|
|
oraclePk: pM.oracle,
|
|
|
|
name: pM.name,
|
|
};
|
|
});
|
|
|
|
// fallback oracles for tokens
|
|
const oracles3 = Array.from(group.banksMapByName.values())
|
|
.filter(
|
|
(b) =>
|
|
!(
|
|
b[0].nativeDeposits().eq(ZERO_I80F48()) &&
|
|
b[0].nativeBorrows().eq(ZERO_I80F48()) &&
|
|
b[0].reduceOnly == 1
|
|
),
|
|
)
|
|
.map((b) => {
|
|
return {
|
|
oraclePk: b[0].fallbackOracle,
|
|
name: b[0].name,
|
|
};
|
|
})
|
|
.filter((item) => !item.oraclePk.equals(PublicKey.default));
|
|
const oracles = oracles1.concat(oracles2).concat(oracles3);
|
|
return oracles;
|
|
}
|