change format of ids json (#73)

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2022-06-21 20:04:21 +02:00 committed by GitHub
parent 46f3fd4c29
commit c19c3480e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 271 additions and 110 deletions

View File

@ -1,34 +1,66 @@
{ {
"testnet": {}, "groups": [
"devnet": { {
"m43thNJ58XCjL798ZSq6JGAG1BnWskhdq5or6kcnfsD": { "cluster": "devnet",
"8nBa69Ed8LCeP5YpZ1qB58DTEXq8fq7epfH5RsUVFATb": { "name": "devnet.microwavedcola",
"banks": { "publicKey": "8SPemjpDsXAqJNCL5vF2qk1XsocPVDTdY7sWVeU7t4NV",
"USDC": "ChuTYko8TLHb8Xn72gAe7PQTS9ULvrTayjMzjRGSmUn8", "serum3ProgramId": "DESVgJVGajEgKGXhb6XmqDHGz3VjdgP7rEVESBgxmroY",
"SOL": "3V7vwKfQPhJn2bSywqsrvJwwCK9B5Dy3mE2SXCFxfW1N", "mangoProgramId": "m43thNJ58XCjL798ZSq6JGAG1BnWskhdq5or6kcnfsD",
"ORCA": "fiHgPevezzWH3zWFsqnHdcA9Qeg6B15HfsDXGygBcqF", "banks": [
"BTC": "HGw2wgfnytS3uEwPeyNijhoruA3K7msQaogkxC8EKdGX" {
"name": "BTC",
"publicKey": "7JRb4RzjAwTffgsLBh65gL4fyLJqzZc98Z1WKBDCJopZ"
}, },
"stubOracles": { {
"USDC": "DfbZP2mdLnHKWT5tVGb3MyaqEJpEfVQGi8LSP1gxgCeN" "name": "USDC",
"publicKey": "97hK4n6sZFDJAnCfyS3vSWeugZmdyhvMJv3WjLNuZAdo"
}, },
"mintInfos": { {
"ORCA": "GXW8pBd3wZx8QZCoxsTj4CT3qGfoSGED6SB2bKXonZAs", "name": "ORCA",
"BTC": "6onpaK9yFJBcV5d6Vs8vUnWF5pKDBDCo3rq4E9gva6nh", "publicKey": "Dmh7P1gsZdLrPabuDtTzPYPgTLJWwu8e59TxXQ2Q5V9u"
"USDC": "4gdSUfDBo5YibmanYL1N5uDdcBSdkpx75AwmUZWasFPW",
"SOL": "BEckAgpZQmSpcA2ncgb3LWfRHxnwG3WsNqpkaXQzAMA2"
}, },
"serum3Markets": { {
"BTC/USDC": "AThBBA35mBxnUi3rT7YPVZKDnpZbi2ZsNSzJZkfJrFoA" "name": "SOL",
}, "publicKey": "GyCanBHkomvNZGJiDyRZpajXjZ5GWGN6KL4JXtcM9Fnn"
"serum3MarketExternals": {
"BTC/USDC": "DW83EpHFywBxCHmyARxwj3nzxJd7MUdSeznmrdzZKNZB"
},
"perpMarkets": {
"BTC/USDC": "D2cYz3LdYfzcpNcbx4TFr4P8C24XUzPtXPnyZSyhA8oa"
} }
} ],
"stubOracles": [
{
"name": "USDC",
"publicKey": "6vWHjKupnkpRfN61DvESQwKt4cNSAkXbej7aQ4TRwFEm"
}
],
"mintInfos": [
{
"name": "USDC",
"publicKey": "FiDdmANpx3JDdDEJpvDimpVUhAnnduGZ5YPyd6yWovkt"
},
{
"name": "BTC",
"publicKey": "A2jFoKiSLoRbtgJUiXGnRGCVrMTwZNth3K7rcxc9pu57"
},
{
"name": "ORCA",
"publicKey": "3cZZk1jZDZqh2HzgvFvMQ67QDWMZfLbcFp9uziE63iSS"
},
{
"name": "SOL",
"publicKey": "9UqfN1us6YYigrXjWA6yazeTg9EUfNa5eiJSFJj4qbeq"
}
],
"serum3Markets": [
{
"name": "BTC/USDC",
"publicKey": "3BABCXXwr9UG782xPHaVjBYG7H2B9HkuY4tGZy9MtU5T",
"marketExternal": "DW83EpHFywBxCHmyARxwj3nzxJd7MUdSeznmrdzZKNZB"
}
],
"perpMarkets": [
{
"name": "BTC/USDC",
"publicKey": "5ZwVhP5PYkKtx2H4WL2JxSvWL6AALFzwubwM5dsR5XHF"
}
]
} }
}, ]
"mainnet": {} }
}

View File

@ -1,7 +1,7 @@
import { Market } from '@project-serum/serum'; import { Market } from '@project-serum/serum';
import { PublicKey } from '@solana/web3.js'; import { PublicKey } from '@solana/web3.js';
import { MangoClient } from '../client'; import { MangoClient } from '../client';
import { MANGO_V4_ID, SERUM3_PROGRAM_ID } from '../constants'; import { SERUM3_PROGRAM_ID } from '../constants';
import { Id } from '../ids'; import { Id } from '../ids';
import { Bank, MintInfo } from './bank'; import { Bank, MintInfo } from './bank';
import { PerpMarket } from './perp'; import { PerpMarket } from './perp';
@ -44,12 +44,8 @@ export class Group {
public async reloadAll(client: MangoClient) { public async reloadAll(client: MangoClient) {
let ids: Id | undefined = undefined; let ids: Id | undefined = undefined;
if (client.useIds) { if (client.groupName) {
ids = Id.fromIds( ids = Id.fromIds(client.groupName);
client.cluster,
MANGO_V4_ID[client.cluster],
this.publicKey,
);
} }
// console.time('group.reload'); // console.time('group.reload');

View File

@ -35,6 +35,7 @@ import {
Serum3Side, Serum3Side,
} from './accounts/serum3'; } from './accounts/serum3';
import { SERUM3_PROGRAM_ID } from './constants'; import { SERUM3_PROGRAM_ID } from './constants';
import { Id } from './ids';
import { import {
buildOrcaInstruction, buildOrcaInstruction,
ORCA_TOKEN_SWAP_ID_DEVNET, ORCA_TOKEN_SWAP_ID_DEVNET,
@ -53,7 +54,7 @@ export class MangoClient {
public program: Program<MangoV4>, public program: Program<MangoV4>,
public programId: PublicKey, public programId: PublicKey,
public cluster: Cluster, public cluster: Cluster,
public useIds: boolean, public groupName?: string,
) {} ) {}
/// public /// public
@ -1193,7 +1194,6 @@ export class MangoClient {
provider: Provider, provider: Provider,
cluster: Cluster, cluster: Cluster,
programId: PublicKey, programId: PublicKey,
useIds: boolean,
): MangoClient { ): MangoClient {
// TODO: use IDL on chain or in repository? decide... // TODO: use IDL on chain or in repository? decide...
// Alternatively we could fetch IDL from chain. // Alternatively we could fetch IDL from chain.
@ -1204,7 +1204,29 @@ export class MangoClient {
new Program<MangoV4>(idl as MangoV4, programId, provider), new Program<MangoV4>(idl as MangoV4, programId, provider),
programId, programId,
cluster, cluster,
useIds, );
}
static connectForGroupName(
provider: Provider,
groupName: string,
): MangoClient {
// TODO: use IDL on chain or in repository? decide...
// Alternatively we could fetch IDL from chain.
// const idl = await Program.fetchIdl(MANGO_V4_ID, provider);
let idl = IDL;
const id = Id.fromIds(groupName);
return new MangoClient(
new Program<MangoV4>(
idl as MangoV4,
new PublicKey(id.publicKey),
provider,
),
new PublicKey(id.publicKey),
id.cluster,
groupName,
); );
} }

View File

@ -1,47 +1,67 @@
import { Cluster, PublicKey } from '@solana/web3.js'; import { Cluster, PublicKey } from '@solana/web3.js';
import ids from '../ids.json'; import ids from '../ids.json';
import { MANGO_V4_ID } from './constants';
export class Id { export class Id {
constructor( constructor(
public banks: Map<String, PublicKey>, public cluster: Cluster,
public stubOracles: Map<String, PublicKey>, public name: string,
public mintInfos: Map<String, PublicKey>, public publicKey: string,
public serum3Markets: Map<String, PublicKey>, public serum3ProgramId: string,
public serum3MarketExternals: Map<String, PublicKey>, public mangoProgramId: string,
public perpMarkets: Map<String, PublicKey>, public banks: { name: string; publicKey: string }[],
public stubOracles: { name: string; publicKey: string }[],
public mintInfos: { name: string; publicKey: string }[],
public serum3Markets: {
name: string;
publicKey: string;
marketExternal: string;
}[],
public perpMarkets: { name: string; publicKey: string }[],
) {} ) {}
public getBanks(): PublicKey[] { public getBanks(): PublicKey[] {
return Array.from(this.banks.values()); return Array.from(this.banks.map((bank) => new PublicKey(bank.publicKey)));
} }
public getStubOracles(): PublicKey[] { public getStubOracles(): PublicKey[] {
return Array.from(this.stubOracles.values()); return Array.from(
this.stubOracles.map((stubOracle) => new PublicKey(stubOracle.publicKey)),
);
} }
public getMintInfos(): PublicKey[] { public getMintInfos(): PublicKey[] {
return Array.from(this.mintInfos.values()); return Array.from(
this.mintInfos.map((mintInfo) => new PublicKey(mintInfo.publicKey)),
);
} }
public getSerum3Markets(): PublicKey[] { public getSerum3Markets(): PublicKey[] {
return Array.from(this.serum3Markets.values()); return Array.from(
this.serum3Markets.map(
(serum3Market) => new PublicKey(serum3Market.publicKey),
),
);
} }
public getPerpMarkets(): PublicKey[] { public getPerpMarkets(): PublicKey[] {
return Array.from(this.perpMarkets.values()); return Array.from(
this.perpMarkets.map((perpMarket) => new PublicKey(perpMarket.publicKey)),
);
} }
static fromIds(cluster: Cluster, programId: PublicKey, group: PublicKey): Id { static fromIds(name: string): Id {
let groupConfig = let groupConfig = ids.groups.find((id) => id['name'] === name);
ids['devnet'][MANGO_V4_ID['devnet'].toBase58()][group.toString()];
return new Id( return new Id(
new Map(Object.entries(groupConfig['banks'])), groupConfig.cluster as Cluster,
new Map(Object.entries(groupConfig['stubOracles'])), name,
new Map(Object.entries(groupConfig['mintInfos'])), groupConfig.publicKey,
new Map(Object.entries(groupConfig['serum3Markets'])), groupConfig.serum3ProgramId,
new Map(Object.entries(groupConfig['serum3MarketExternals'])), groupConfig.mangoProgramId,
new Map(Object.entries(groupConfig['perpMarkets'])), groupConfig['banks'],
groupConfig['stubOracles'],
groupConfig['mintInfos'],
groupConfig['serum3Markets'],
groupConfig['perpMarkets'],
); );
} }
} }

View File

@ -1875,6 +1875,32 @@ export type MangoV4 = {
], ],
"args": [] "args": []
}, },
{
"name": "computeHealth",
"accounts": [
{
"name": "group",
"isMut": false,
"isSigner": false
},
{
"name": "account",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "healthType",
"type": {
"defined": "HealthType"
}
}
],
"returns": {
"defined": "I80F48"
}
},
{ {
"name": "benchmark", "name": "benchmark",
"accounts": [], "accounts": [],
@ -2267,13 +2293,22 @@ export type MangoV4 = {
"defined": "BookSideType" "defined": "BookSideType"
} }
}, },
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{ {
"name": "bumpIndex", "name": "bumpIndex",
"type": "u64" "type": "u32"
}, },
{ {
"name": "freeListLen", "name": "freeListLen",
"type": "u64" "type": "u32"
}, },
{ {
"name": "freeListHead", "name": "freeListHead",
@ -2285,7 +2320,7 @@ export type MangoV4 = {
}, },
{ {
"name": "leafCount", "name": "leafCount",
"type": "u64" "type": "u32"
}, },
{ {
"name": "nodes", "name": "nodes",
@ -2660,6 +2695,14 @@ export type MangoV4 = {
"name": "openOrders", "name": "openOrders",
"type": "publicKey" "type": "publicKey"
}, },
{
"name": "previousNativeCoinReserved",
"type": "u64"
},
{
"name": "previousNativePcReserved",
"type": "u64"
},
{ {
"name": "marketIndex", "name": "marketIndex",
"type": "u16" "type": "u16"
@ -2861,11 +2904,11 @@ export type MangoV4 = {
"fields": [ "fields": [
{ {
"name": "head", "name": "head",
"type": "u64" "type": "u32"
}, },
{ {
"name": "count", "name": "count",
"type": "u64" "type": "u32"
}, },
{ {
"name": "seqNum", "name": "seqNum",
@ -5124,6 +5167,32 @@ export const IDL: MangoV4 = {
], ],
"args": [] "args": []
}, },
{
"name": "computeHealth",
"accounts": [
{
"name": "group",
"isMut": false,
"isSigner": false
},
{
"name": "account",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "healthType",
"type": {
"defined": "HealthType"
}
}
],
"returns": {
"defined": "I80F48"
}
},
{ {
"name": "benchmark", "name": "benchmark",
"accounts": [], "accounts": [],
@ -5516,13 +5585,22 @@ export const IDL: MangoV4 = {
"defined": "BookSideType" "defined": "BookSideType"
} }
}, },
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{ {
"name": "bumpIndex", "name": "bumpIndex",
"type": "u64" "type": "u32"
}, },
{ {
"name": "freeListLen", "name": "freeListLen",
"type": "u64" "type": "u32"
}, },
{ {
"name": "freeListHead", "name": "freeListHead",
@ -5534,7 +5612,7 @@ export const IDL: MangoV4 = {
}, },
{ {
"name": "leafCount", "name": "leafCount",
"type": "u64" "type": "u32"
}, },
{ {
"name": "nodes", "name": "nodes",
@ -5909,6 +5987,14 @@ export const IDL: MangoV4 = {
"name": "openOrders", "name": "openOrders",
"type": "publicKey" "type": "publicKey"
}, },
{
"name": "previousNativeCoinReserved",
"type": "u64"
},
{
"name": "previousNativePcReserved",
"type": "u64"
},
{ {
"name": "marketIndex", "name": "marketIndex",
"type": "u16" "type": "u16"
@ -6110,11 +6196,11 @@ export const IDL: MangoV4 = {
"fields": [ "fields": [
{ {
"name": "head", "name": "head",
"type": "u64" "type": "u32"
}, },
{ {
"name": "count", "name": "count",
"type": "u64" "type": "u32"
}, },
{ {
"name": "seqNum", "name": "seqNum",

View File

@ -1,9 +1,10 @@
import { AnchorProvider, Wallet } from '@project-serum/anchor'; import { AnchorProvider, Wallet } from '@project-serum/anchor';
import { Connection, Keypair } from '@solana/web3.js'; import { Connection, Keypair } from '@solana/web3.js';
import fs from 'fs'; import fs from 'fs';
import idsJson from '../../ids.json'; import idsJson from '../../ids.json';
import { MangoClient } from '../client'; import { MangoClient } from '../client';
import { MANGO_V4_ID } from '../constants'; import { MANGO_V4_ID, SERUM3_PROGRAM_ID } from '../constants';
import { Id } from '../ids'; import { Id } from '../ids';
function replacer(key, value) { function replacer(key, value) {
@ -15,6 +16,9 @@ function replacer(key, value) {
} }
async function main() { async function main() {
const groupName = 'devnet.microwavedcola';
const cluster = 'devnet';
// build client and fetch group for admin // build client and fetch group for admin
const options = AnchorProvider.defaultOptions(); const options = AnchorProvider.defaultOptions();
const connection = new Connection( const connection = new Connection(
@ -30,9 +34,8 @@ async function main() {
const userProvider = new AnchorProvider(connection, userWallet, options); const userProvider = new AnchorProvider(connection, userWallet, options);
const client = await MangoClient.connect( const client = await MangoClient.connect(
userProvider, userProvider,
'devnet', cluster,
MANGO_V4_ID['devnet'], MANGO_V4_ID[cluster],
false,
); );
const admin = Keypair.fromSecretKey( const admin = Keypair.fromSecretKey(
Buffer.from( Buffer.from(
@ -54,31 +57,43 @@ async function main() {
// build ids // build ids
const toDump = new Id( const toDump = new Id(
new Map(banks.map((tuple) => [tuple.name, tuple.publicKey])), cluster,
new Map( groupName,
stubOracles.map((tuple) => [ group.publicKey.toBase58(),
banksMapByMint.get(tuple.mint.toBase58())!.name, SERUM3_PROGRAM_ID[cluster].toBase58(),
tuple.publicKey, MANGO_V4_ID[cluster].toBase58(),
]), banks.map((tuple) => ({
), name: tuple.name,
new Map( publicKey: tuple.publicKey.toBase58(),
mintInfos.map((tuple) => [ })),
banksMapByMint.get(tuple.mint.toBase58())!.name, stubOracles.map((tuple) => ({
tuple.publicKey, name: banksMapByMint.get(tuple.mint.toBase58())!.name,
]), publicKey: tuple.publicKey.toBase58(),
), })),
new Map(serum3Markets.map((tuple) => [tuple.name, tuple.publicKey])), mintInfos.map((tuple) => ({
new Map( name: banksMapByMint.get(tuple.mint.toBase58())!.name,
serum3Markets.map((tuple) => [tuple.name, tuple.serumMarketExternal]), publicKey: tuple.publicKey.toBase58(),
), })),
new Map(perpMarkets.map((tuple) => [tuple.name, tuple.publicKey])), serum3Markets.map((tuple) => ({
name: tuple.name,
publicKey: tuple.publicKey.toBase58(),
marketExternal: tuple.serumMarketExternal.toBase58(),
})),
perpMarkets.map((tuple) => ({
name: tuple.name,
publicKey: tuple.publicKey.toBase58(),
})),
); );
// adds ids for group in existing ids.json // adds ids for group in existing ids.json
idsJson['devnet'][MANGO_V4_ID['devnet'].toBase58()] = {}; const existingGroup = idsJson.groups.find((group) => group.name == groupName);
idsJson['devnet'][MANGO_V4_ID['devnet'].toBase58()][ if (existingGroup) {
group.publicKey.toBase58() console.log('Updating existing group with latest state...');
] = toDump; } else {
console.log('Group does not exist yet...');
}
idsJson.groups = idsJson.groups.filter((group) => group.name !== groupName);
idsJson.groups.push(toDump);
// dump // dump
const file = `${process.cwd()}/ts/client/ids.json`; const file = `${process.cwd()}/ts/client/ids.json`;

View File

@ -27,7 +27,6 @@ async function main() {
adminProvider, adminProvider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
const group = await client.getGroupForAdmin(admin.publicKey); const group = await client.getGroupForAdmin(admin.publicKey);

View File

@ -48,7 +48,6 @@ async function main() {
adminProvider, adminProvider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
// group // group
@ -99,7 +98,9 @@ async function main() {
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
const usdcDevnetOracle = (await client.getStubOracle(group, usdcDevnetMint))[0]; const usdcDevnetOracle = (
await client.getStubOracle(group, usdcDevnetMint)
)[0];
console.log(`...created stub oracle ${usdcDevnetOracle.publicKey}`); console.log(`...created stub oracle ${usdcDevnetOracle.publicKey}`);
try { try {
await client.tokenRegister( await client.tokenRegister(

View File

@ -2,7 +2,6 @@ import { AnchorProvider, Wallet } from '@project-serum/anchor';
import { Connection, Keypair } from '@solana/web3.js'; import { Connection, Keypair } from '@solana/web3.js';
import fs from 'fs'; import fs from 'fs';
import { MangoClient } from '../client'; import { MangoClient } from '../client';
import { MANGO_V4_ID } from '../constants';
async function main() { async function main() {
const options = AnchorProvider.defaultOptions(); const options = AnchorProvider.defaultOptions();
@ -18,11 +17,9 @@ async function main() {
); );
const userWallet = new Wallet(user); const userWallet = new Wallet(user);
const userProvider = new AnchorProvider(connection, userWallet, options); const userProvider = new AnchorProvider(connection, userWallet, options);
const client = await MangoClient.connect( const client = await MangoClient.connectForGroupName(
userProvider, userProvider,
'devnet', 'devnet.microwavedcola' /* Use ids json instead of getProgramAccounts */,
MANGO_V4_ID['devnet'],
true /* Use ids json instead of getProgramAccounts */,
); );
console.log(`User ${userWallet.publicKey.toBase58()}`); console.log(`User ${userWallet.publicKey.toBase58()}`);

View File

@ -34,7 +34,6 @@ async function main() {
userProvider, userProvider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
console.log(`User ${userWallet.publicKey.toBase58()}`); console.log(`User ${userWallet.publicKey.toBase58()}`);

View File

@ -23,7 +23,6 @@ async function main() {
user1Provider, user1Provider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
console.log(`user1 ${user1Wallet.publicKey.toBase58()}`); console.log(`user1 ${user1Wallet.publicKey.toBase58()}`);
@ -64,7 +63,6 @@ async function main() {
user2Provider, user2Provider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
console.log(`user2 ${user2Wallet.publicKey.toBase58()}`); console.log(`user2 ${user2Wallet.publicKey.toBase58()}`);
@ -111,7 +109,6 @@ async function main() {
adminProvider, adminProvider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
await client.setStubOracle(group, group.banksMap.get('USDC')?.oracle!, 0.5); await client.setStubOracle(group, group.banksMap.get('USDC')?.oracle!, 0.5);

View File

@ -28,7 +28,6 @@ async function main() {
userProvider, userProvider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
console.log(`User ${userWallet.publicKey.toBase58()}`); console.log(`User ${userWallet.publicKey.toBase58()}`);

View File

@ -29,7 +29,6 @@ async function main() {
userProvider, userProvider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
console.log(`User ${userWallet.publicKey.toBase58()}`); console.log(`User ${userWallet.publicKey.toBase58()}`);

View File

@ -28,7 +28,6 @@ const main = async () => {
adminProvider, adminProvider,
'devnet', 'devnet',
MANGO_V4_ID['devnet'], MANGO_V4_ID['devnet'],
false,
); );
const btcMint = new PublicKey('3UNBZ6o52WTWwjac2kPUb4FyodhU1vFkRJheu1Sh2TvU'); const btcMint = new PublicKey('3UNBZ6o52WTWwjac2kPUb4FyodhU1vFkRJheu1Sh2TvU');