2022-06-11 04:49:45 -07:00
|
|
|
import { Cluster, PublicKey } from '@solana/web3.js';
|
2022-08-17 23:48:45 -07:00
|
|
|
import fetch from 'cross-fetch';
|
2022-06-11 04:49:45 -07:00
|
|
|
import ids from '../ids.json';
|
|
|
|
export class Id {
|
|
|
|
constructor(
|
2022-06-21 11:04:21 -07:00
|
|
|
public cluster: Cluster,
|
|
|
|
public name: string,
|
|
|
|
public publicKey: string,
|
|
|
|
public serum3ProgramId: string,
|
|
|
|
public mangoProgramId: string,
|
2023-09-04 18:04:42 -07:00
|
|
|
public banks: {
|
|
|
|
name: string;
|
|
|
|
mint: string;
|
|
|
|
tokenIndex: number;
|
|
|
|
publicKey: string;
|
|
|
|
active: boolean;
|
|
|
|
decimals: number;
|
|
|
|
}[],
|
2022-06-21 11:04:21 -07:00
|
|
|
public stubOracles: { name: string; publicKey: string }[],
|
|
|
|
public mintInfos: { name: string; publicKey: string }[],
|
|
|
|
public serum3Markets: {
|
|
|
|
name: string;
|
|
|
|
publicKey: string;
|
2023-01-12 11:43:37 -08:00
|
|
|
active: boolean;
|
2022-06-21 11:04:21 -07:00
|
|
|
marketExternal: string;
|
|
|
|
}[],
|
2023-01-12 11:43:37 -08:00
|
|
|
public perpMarkets: { name: string; publicKey: string; active: boolean }[],
|
2022-06-11 04:49:45 -07:00
|
|
|
) {}
|
|
|
|
|
|
|
|
public getBanks(): PublicKey[] {
|
2023-09-06 11:11:25 -07:00
|
|
|
return Array.from(
|
|
|
|
this.banks
|
|
|
|
.filter((bank) => bank.active)
|
|
|
|
.map((bank) => new PublicKey(bank.publicKey)),
|
|
|
|
);
|
2022-06-11 04:49:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
public getStubOracles(): PublicKey[] {
|
2022-06-21 11:04:21 -07:00
|
|
|
return Array.from(
|
|
|
|
this.stubOracles.map((stubOracle) => new PublicKey(stubOracle.publicKey)),
|
|
|
|
);
|
2022-06-11 04:49:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
public getMintInfos(): PublicKey[] {
|
2022-06-21 11:04:21 -07:00
|
|
|
return Array.from(
|
|
|
|
this.mintInfos.map((mintInfo) => new PublicKey(mintInfo.publicKey)),
|
|
|
|
);
|
2022-06-11 04:49:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
public getSerum3Markets(): PublicKey[] {
|
2022-06-21 11:04:21 -07:00
|
|
|
return Array.from(
|
2023-09-06 11:11:25 -07:00
|
|
|
this.serum3Markets
|
|
|
|
.filter((serum3Market) => serum3Market.active)
|
|
|
|
.map((serum3Market) => new PublicKey(serum3Market.publicKey)),
|
2022-06-21 11:04:21 -07:00
|
|
|
);
|
2022-06-11 04:49:45 -07:00
|
|
|
}
|
|
|
|
|
2023-09-04 18:04:42 -07:00
|
|
|
public getSerum3ExternalMarkets(): PublicKey[] {
|
|
|
|
return Array.from(
|
2023-09-06 11:11:25 -07:00
|
|
|
this.serum3Markets
|
|
|
|
.filter((serum3Market) => serum3Market.active)
|
|
|
|
.map((serum3Market) => new PublicKey(serum3Market.marketExternal)),
|
2023-09-04 18:04:42 -07:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-06-11 04:49:45 -07:00
|
|
|
public getPerpMarkets(): PublicKey[] {
|
2022-06-21 11:04:21 -07:00
|
|
|
return Array.from(
|
2023-09-06 10:51:40 -07:00
|
|
|
this.perpMarkets.map((perpMarket) => new PublicKey(perpMarket.publicKey)),
|
2022-06-21 11:04:21 -07:00
|
|
|
);
|
2022-06-11 04:49:45 -07:00
|
|
|
}
|
|
|
|
|
2023-09-04 18:04:42 -07:00
|
|
|
// DEPRECATED
|
2022-08-17 23:48:45 -07:00
|
|
|
static fromIdsByName(name: string): Id {
|
2022-08-04 10:42:41 -07:00
|
|
|
const groupConfig = ids.groups.find((id) => id['name'] === name);
|
2022-09-29 06:51:09 -07:00
|
|
|
if (!groupConfig) throw new Error(`No group config ${name} found in Ids!`);
|
2022-06-11 04:49:45 -07:00
|
|
|
return new Id(
|
2022-06-21 11:04:21 -07:00
|
|
|
groupConfig.cluster as Cluster,
|
2022-08-17 23:48:45 -07:00
|
|
|
groupConfig.name,
|
2022-06-21 11:04:21 -07:00
|
|
|
groupConfig.publicKey,
|
|
|
|
groupConfig.serum3ProgramId,
|
|
|
|
groupConfig.mangoProgramId,
|
|
|
|
groupConfig['banks'],
|
|
|
|
groupConfig['stubOracles'],
|
|
|
|
groupConfig['mintInfos'],
|
|
|
|
groupConfig['serum3Markets'],
|
|
|
|
groupConfig['perpMarkets'],
|
2022-06-11 04:49:45 -07:00
|
|
|
);
|
|
|
|
}
|
2022-08-17 23:48:45 -07:00
|
|
|
|
2023-09-04 18:04:42 -07:00
|
|
|
// DEPRECATED
|
2022-08-17 23:48:45 -07:00
|
|
|
static fromIdsByPk(groupPk: PublicKey): Id {
|
|
|
|
const groupConfig = ids.groups.find(
|
|
|
|
(id) => id['publicKey'] === groupPk.toString(),
|
|
|
|
);
|
2022-08-31 02:41:12 -07:00
|
|
|
if (!groupConfig)
|
2022-09-29 06:51:09 -07:00
|
|
|
throw new Error(`No group config ${groupPk.toString()} found in Ids!`);
|
2022-08-17 23:48:45 -07:00
|
|
|
return new Id(
|
|
|
|
groupConfig.cluster as Cluster,
|
|
|
|
groupConfig.name,
|
|
|
|
groupConfig.publicKey,
|
|
|
|
groupConfig.serum3ProgramId,
|
|
|
|
groupConfig.mangoProgramId,
|
|
|
|
groupConfig['banks'],
|
|
|
|
groupConfig['stubOracles'],
|
|
|
|
groupConfig['mintInfos'],
|
|
|
|
groupConfig['serum3Markets'],
|
|
|
|
groupConfig['perpMarkets'],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
static async fromApi(groupPk: PublicKey): Promise<Id> {
|
2023-03-30 08:38:20 -07:00
|
|
|
const groupMetadataApiUrl = 'https://api.mngo.cloud/data/v4/group-metadata';
|
2022-08-17 23:48:45 -07:00
|
|
|
const response = await fetch(groupMetadataApiUrl);
|
|
|
|
const jsonData = await response.json();
|
|
|
|
|
|
|
|
const groupConfig = jsonData.groups.find(
|
|
|
|
(group) => group.publicKey === groupPk.toString(),
|
|
|
|
);
|
|
|
|
|
|
|
|
return new Id(
|
|
|
|
groupConfig.cluster as Cluster,
|
|
|
|
groupConfig.name,
|
|
|
|
groupConfig.publicKey,
|
|
|
|
groupConfig.serum3ProgramId,
|
|
|
|
groupConfig.mangoProgramId,
|
|
|
|
groupConfig.tokens.flatMap((t) =>
|
|
|
|
t.banks.map((b) => ({
|
|
|
|
name: t.symbol,
|
|
|
|
mint: t.mint,
|
|
|
|
tokenIndex: t.tokenIndex,
|
|
|
|
bankNum: b.bankNum,
|
|
|
|
publicKey: b.publicKey,
|
2023-09-04 18:04:42 -07:00
|
|
|
active: t.active,
|
|
|
|
decimals: t.decimals,
|
2022-08-17 23:48:45 -07:00
|
|
|
})),
|
|
|
|
),
|
|
|
|
groupConfig.stubOracles.map((s) => ({
|
|
|
|
mint: s.mint,
|
|
|
|
publicKey: s.publicKey,
|
|
|
|
})),
|
|
|
|
groupConfig.tokens.map((t) => ({
|
|
|
|
name: t.symbol,
|
|
|
|
mint: t.mint,
|
|
|
|
tokenIndex: t.tokenIndex,
|
|
|
|
publicKey: t.mintInfo,
|
2023-09-04 18:04:42 -07:00
|
|
|
active: t.active,
|
2022-08-17 23:48:45 -07:00
|
|
|
})),
|
|
|
|
groupConfig.serum3Markets.map((s) => ({
|
|
|
|
name: s.name,
|
|
|
|
publicKey: s.publicKey,
|
2023-09-04 18:04:42 -07:00
|
|
|
marketExternal: s.serumMarketExternal,
|
|
|
|
active: s.active,
|
2022-08-17 23:48:45 -07:00
|
|
|
})),
|
|
|
|
groupConfig.perpMarkets.map((p) => ({
|
|
|
|
name: p.name,
|
|
|
|
publicKey: p.publicKey,
|
2023-09-04 18:04:42 -07:00
|
|
|
active: p.active,
|
2022-08-17 23:48:45 -07:00
|
|
|
})),
|
|
|
|
);
|
|
|
|
}
|
2022-06-11 04:49:45 -07:00
|
|
|
}
|