ts: mb-admin-close script closes all groups for the key
This commit is contained in:
parent
13e4d0a432
commit
29c7d5b45a
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue