75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import { PublicKey } from '@solana/web3.js';
|
|
import { Bank } from '../src/accounts/bank';
|
|
import { Group } from '../src/accounts/group';
|
|
import { isSwitchboardOracle } from '../src/accounts/oracle';
|
|
import { PerpMarket } from '../src/accounts/perp';
|
|
import { MangoClient } from '../src/client';
|
|
import { buildFetch } from '../src/utils';
|
|
|
|
function getBankForOracle(group: Group, oracle: PublicKey): Bank | PerpMarket {
|
|
let match: Bank[] | PerpMarket[] = Array.from(group.banksMapByName.values())
|
|
.flat()
|
|
.filter((b) => b.oracle.equals(oracle));
|
|
if (match.length > 0) {
|
|
return match[0];
|
|
}
|
|
|
|
match = Array.from(group.perpMarketsMapByName.values()).filter((p) =>
|
|
p.oracle.equals(oracle),
|
|
);
|
|
if (match.length > 0) {
|
|
return match[0];
|
|
}
|
|
|
|
throw new Error(`No token or perp market found for ${oracle}`);
|
|
}
|
|
|
|
async function main(): Promise<void> {
|
|
const client = await MangoClient.connectDefault(process.env.MB_CLUSTER_URL!);
|
|
const group = await client.getGroup(
|
|
new PublicKey('78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX'),
|
|
);
|
|
|
|
const oracles1 = Array.from(group.banksMapByName.values()).map(
|
|
(b) => b[0].oracle,
|
|
);
|
|
const oracles2 = Array.from(group.perpMarketsMapByName.values()).map(
|
|
(p) => p.oracle,
|
|
);
|
|
const oracles = oracles1.concat(oracles2);
|
|
|
|
const ais =
|
|
await client.program.provider.connection.getMultipleAccountsInfo(oracles);
|
|
|
|
const switcboardOracles: PublicKey[] = ais
|
|
.map((ai, i) => [isSwitchboardOracle(ai!), oracles[i]])
|
|
.filter((r) => r[0])
|
|
.map((r) => r[1]) as PublicKey[];
|
|
|
|
for (const o of switcboardOracles) {
|
|
const r = await (
|
|
await buildFetch()
|
|
)('https://stats.switchboard.xyz/logs', {
|
|
headers: {
|
|
accept: '*/*',
|
|
'content-type': 'application/json',
|
|
},
|
|
body: `{"cluster":"solana-mainnet","query":"${o.toString()}","number":100,"severity":"INFO"}`,
|
|
method: 'POST',
|
|
});
|
|
|
|
const bOrPm = getBankForOracle(group, o);
|
|
console.log(`${bOrPm.name} ${bOrPm.oracleLastUpdatedSlot} ${o}`);
|
|
|
|
(await r.json()).forEach((e: { message: string; timestamp: string }) => {
|
|
if (e.message.toLowerCase().includes('error')) {
|
|
console.log(`${e.timestamp}: ${e.message}`);
|
|
}
|
|
});
|
|
|
|
console.log(``);
|
|
}
|
|
}
|
|
|
|
main();
|