mango-v4/ts/client/scripts/mb-liqtest-settle-and-close...

95 lines
3.0 KiB
TypeScript

import { AnchorProvider, Wallet } from '@coral-xyz/anchor';
import { Connection, Keypair } from '@solana/web3.js';
import fs from 'fs';
import { MangoClient } from '../src/client';
import { MANGO_V4_ID } from '../src/constants';
//
// This script tries to withdraw all positive balances for all accounts
// by MANGO_MAINNET_PAYER_KEYPAIR in the group.
//
const GROUP_NUM = Number(process.env.GROUP_NUM || 200);
const CLUSTER_URL = process.env.CLUSTER_URL;
const MANGO_MAINNET_PAYER_KEYPAIR =
process.env.MANGO_MAINNET_PAYER_KEYPAIR || '';
async function main() {
const options = AnchorProvider.defaultOptions();
options.commitment = 'processed';
options.preflightCommitment = 'finalized';
const connection = new Connection(CLUSTER_URL!, options);
const admin = Keypair.fromSecretKey(
Buffer.from(
JSON.parse(fs.readFileSync(MANGO_MAINNET_PAYER_KEYPAIR, 'utf-8')),
),
);
const userWallet = new Wallet(admin);
const userProvider = new AnchorProvider(connection, userWallet, options);
const client = await MangoClient.connect(
userProvider,
'mainnet-beta',
MANGO_V4_ID['mainnet-beta'],
{
idsSource: 'get-program-accounts',
prioritizationFee: 100,
txConfirmationCommitment: 'confirmed',
},
);
console.log(`User ${userWallet.publicKey.toBase58()}`);
// const groups = await client.getGroupsForCreator(admin.publicKey);
// console.log(
// 'groups: ',
// groups.map((g) => g.publicKey.toString() + ' ' + g.groupNum.toString()),
// );
const group = await client.getGroupForCreator(admin.publicKey, GROUP_NUM);
console.log(group.toString());
let accounts = await client.getMangoAccountsForOwner(group, admin.publicKey);
for (let account of accounts) {
for (let serumOrders of account.serum3Active()) {
const serumMarket = group.getSerum3MarketByMarketIndex(
serumOrders.marketIndex,
)!;
const serumExternal = serumMarket.serumMarketExternal;
console.log(
`closing serum orders on: ${account} for market ${serumMarket.name}`,
);
await client.serum3CancelAllOrders(group, account, serumExternal, 10);
await client.serum3SettleFunds(group, account, serumExternal);
await client.serum3CloseOpenOrders(group, account, serumExternal);
}
for (let perpPosition of account.perpActive()) {
const perpMarket = group.findPerpMarket(perpPosition.marketIndex)!;
console.log(
`closing perp orders on: ${account} for market ${perpMarket.name}`,
);
await client.perpCancelAllOrders(
group,
account,
perpMarket.perpMarketIndex,
10,
);
}
}
accounts = await client.getMangoAccountsForOwner(group, admin.publicKey);
for (let account of accounts) {
// close account
try {
console.log(`closing account: ${account}`);
await client.closeMangoAccount(group, account, true);
} catch (error) {
console.log(`failed to close ${account.publicKey}: ${error}`);
}
}
process.exit();
}
main();