diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index 497db5640..92d748fc2 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -128,10 +128,9 @@ export class MangoClient { return group; } - public async getGroupForCreator( + public async getGroupsForCreator( creatorPk: PublicKey, - groupNum?: number, - ): Promise { + ): Promise { const filters: MemcmpFilter[] = [ { memcmp: { @@ -141,20 +140,24 @@ export class MangoClient { }, ]; - if (groupNum !== undefined) { - const bbuf = Buffer.alloc(4); - bbuf.writeUInt32LE(groupNum); - filters.push({ - memcmp: { - bytes: bs58.encode(bbuf), - offset: 40, - }, - }); - } - - const groups = (await this.program.account.group.all(filters)).map( + return (await this.program.account.group.all(filters)).map( (tuple) => Group.from(tuple.publicKey, tuple.account), ); + } + + public async getGroupForCreator( + creatorPk: PublicKey, + groupNum?: number, + ): Promise { + const groups = (await this.getGroupsForCreator(creatorPk)) + .filter((group) => { + if (groupNum !== undefined) { + return group.groupNum == groupNum; + } else { + return true; + } + }); + await groups[0].reloadAll(this); return groups[0]; } diff --git a/ts/client/src/scripts/mb-example1-admin-close.ts b/ts/client/src/scripts/mb-example1-admin-close.ts index cf7bff764..fce670549 100644 --- a/ts/client/src/scripts/mb-example1-admin-close.ts +++ b/ts/client/src/scripts/mb-example1-admin-close.ts @@ -8,11 +8,8 @@ import { MANGO_V4_ID } from '../constants'; // example script to close accounts - banks, markets, group etc. which require admin to be the signer // -const MAINNET_MINTS = new Map([ - ['USDC', 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'], - ['BTC', '9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E'], - ['SOL', 'So11111111111111111111111111111111111111112'], -]); +// Use to close only a specific group by number. Use "all" to close all groups. +const GROUP_NUM = process.env.GROUP_NUM; async function main() { const options = AnchorProvider.defaultOptions(); @@ -32,49 +29,56 @@ async function main() { MANGO_V4_ID['mainnet-beta'], ); - const group = await client.getGroupForCreator(admin.publicKey); - console.log(`Group ${group.publicKey}`); + const groups = await (async () => { + if (GROUP_NUM === "all") { + return await client.getGroupsForCreator(admin.publicKey); + } else { + return [await client.getGroupForCreator(admin.publicKey, Number(GROUP_NUM))]; + } + })(); + for (const group of groups) { + console.log(`Group ${group.publicKey}`); - let sig; + let sig; - // close stub oracle - const usdcMainnetBetaMint = new PublicKey(MAINNET_MINTS.get('USDC')!); - const usdcMainnetBetaOracle = ( - await client.getStubOracle(group, usdcMainnetBetaMint) - )[0]; - sig = await client.stubOracleClose(group, usdcMainnetBetaOracle.publicKey); - console.log( - `Closed USDC stub oracle, sig https://explorer.solana.com/tx/${sig}`, - ); + // close stub oracles + const stubOracles = await client.getStubOracle(group); + for (const stubOracle of stubOracles) { + sig = await client.stubOracleClose(group, stubOracle.publicKey); + console.log( + `Closed stub oracle ${stubOracle.publicKey}, sig https://explorer.solana.com/tx/${sig}`, + ); + } - // close all bank - for (const bank of group.banksMap.values()) { - sig = await client.tokenDeregister(group, bank.name); - console.log( - `Removed token ${bank.name}, sig https://explorer.solana.com/tx/${sig}`, - ); + // close all banks + for (const bank of group.banksMap.values()) { + sig = await client.tokenDeregister(group, bank.name); + console.log( + `Removed token ${bank.name}, sig https://explorer.solana.com/tx/${sig}`, + ); + } + + // deregister all serum markets + for (const market of group.serum3MarketsMap.values()) { + sig = await client.serum3deregisterMarket(group, market.name); + console.log( + `Deregistered serum market ${market.name}, sig https://explorer.solana.com/tx/${sig}`, + ); + } + + // close all perp markets + for (const market of group.perpMarketsMap.values()) { + sig = await client.perpCloseMarket(group, market.name); + console.log( + `Closed perp market ${market.name}, sig https://explorer.solana.com/tx/${sig}`, + ); + } + + // finally, close the group + sig = await client.groupClose(group); + console.log(`Closed group, sig https://explorer.solana.com/tx/${sig}`); } - // deregister all serum markets - for (const market of group.serum3MarketsMap.values()) { - sig = await client.serum3deregisterMarket(group, market.name); - console.log( - `Deregistered serum market ${market.name}, sig https://explorer.solana.com/tx/${sig}`, - ); - } - - // close all perp markets - for (const market of group.perpMarketsMap.values()) { - sig = await client.perpCloseMarket(group, market.name); - console.log( - `Closed perp market ${market.name}, sig https://explorer.solana.com/tx/${sig}`, - ); - } - - // finally, close the group - sig = await client.groupClose(group); - console.log(`Closed group, sig https://explorer.solana.com/tx/${sig}`); - process.exit(); }