91 lines
2.8 KiB
TypeScript
91 lines
2.8 KiB
TypeScript
import { AnchorProvider, Wallet } from '@project-serum/anchor';
|
|
import { Connection, Keypair } from '@solana/web3.js';
|
|
import fs from 'fs';
|
|
import { MangoClient } from '../client';
|
|
import { MANGO_V4_ID } from '../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();
|
|
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',
|
|
},
|
|
);
|
|
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();
|