ts: mb-admin-close script closes all groups for the key

This commit is contained in:
Christian Kamm 2022-08-08 10:48:05 +02:00
parent 13e4d0a432
commit 29c7d5b45a
2 changed files with 65 additions and 58 deletions

View File

@ -128,10 +128,9 @@ export class MangoClient {
return group; return group;
} }
public async getGroupForCreator( public async getGroupsForCreator(
creatorPk: PublicKey, creatorPk: PublicKey,
groupNum?: number, ): Promise<Group[]> {
): Promise<Group> {
const filters: MemcmpFilter[] = [ const filters: MemcmpFilter[] = [
{ {
memcmp: { memcmp: {
@ -141,20 +140,24 @@ export class MangoClient {
}, },
]; ];
if (groupNum !== undefined) { return (await this.program.account.group.all(filters)).map(
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(
(tuple) => Group.from(tuple.publicKey, tuple.account), (tuple) => Group.from(tuple.publicKey, tuple.account),
); );
}
public async getGroupForCreator(
creatorPk: PublicKey,
groupNum?: number,
): Promise<Group> {
const groups = (await this.getGroupsForCreator(creatorPk))
.filter((group) => {
if (groupNum !== undefined) {
return group.groupNum == groupNum;
} else {
return true;
}
});
await groups[0].reloadAll(this); await groups[0].reloadAll(this);
return groups[0]; return groups[0];
} }

View File

@ -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 // example script to close accounts - banks, markets, group etc. which require admin to be the signer
// //
const MAINNET_MINTS = new Map([ // Use to close only a specific group by number. Use "all" to close all groups.
['USDC', 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'], const GROUP_NUM = process.env.GROUP_NUM;
['BTC', '9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E'],
['SOL', 'So11111111111111111111111111111111111111112'],
]);
async function main() { async function main() {
const options = AnchorProvider.defaultOptions(); const options = AnchorProvider.defaultOptions();
@ -32,49 +29,56 @@ async function main() {
MANGO_V4_ID['mainnet-beta'], MANGO_V4_ID['mainnet-beta'],
); );
const group = await client.getGroupForCreator(admin.publicKey); const groups = await (async () => {
console.log(`Group ${group.publicKey}`); 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 // close stub oracles
const usdcMainnetBetaMint = new PublicKey(MAINNET_MINTS.get('USDC')!); const stubOracles = await client.getStubOracle(group);
const usdcMainnetBetaOracle = ( for (const stubOracle of stubOracles) {
await client.getStubOracle(group, usdcMainnetBetaMint) sig = await client.stubOracleClose(group, stubOracle.publicKey);
)[0]; console.log(
sig = await client.stubOracleClose(group, usdcMainnetBetaOracle.publicKey); `Closed stub oracle ${stubOracle.publicKey}, sig https://explorer.solana.com/tx/${sig}`,
console.log( );
`Closed USDC stub oracle, sig https://explorer.solana.com/tx/${sig}`, }
);
// close all bank // close all banks
for (const bank of group.banksMap.values()) { for (const bank of group.banksMap.values()) {
sig = await client.tokenDeregister(group, bank.name); sig = await client.tokenDeregister(group, bank.name);
console.log( console.log(
`Removed token ${bank.name}, sig https://explorer.solana.com/tx/${sig}`, `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(); process.exit();
} }