mango-v4/ts/client/scripts/sb-on-demand-crank-utils.ts

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;
}