2023-02-21 23:36:59 -08:00
|
|
|
import { AnchorProvider, Wallet } from '@coral-xyz/anchor';
|
2022-10-11 00:38:52 -07:00
|
|
|
import { Connection, Keypair } from '@solana/web3.js';
|
2022-08-08 07:13:57 -07:00
|
|
|
import fs from 'fs';
|
2023-02-21 23:36:59 -08:00
|
|
|
import { MangoClient } from '../src/client';
|
|
|
|
import { MANGO_V4_ID } from '../src/constants';
|
2022-08-08 07:13:57 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// This script tries to withdraw all positive balances for all accounts
|
|
|
|
// by MANGO_MAINNET_PAYER_KEYPAIR in the group.
|
|
|
|
//
|
|
|
|
|
2022-09-01 02:47:37 -07:00
|
|
|
const GROUP_NUM = Number(process.env.GROUP_NUM || 200);
|
2023-01-04 00:24:40 -08:00
|
|
|
const CLUSTER_URL = process.env.CLUSTER_URL;
|
2022-08-18 14:54:41 -07:00
|
|
|
const MANGO_MAINNET_PAYER_KEYPAIR =
|
|
|
|
process.env.MANGO_MAINNET_PAYER_KEYPAIR || '';
|
2022-08-08 07:13:57 -07:00
|
|
|
|
|
|
|
async function main() {
|
|
|
|
const options = AnchorProvider.defaultOptions();
|
2023-02-03 04:51:18 -08:00
|
|
|
options.commitment = 'processed';
|
|
|
|
options.preflightCommitment = 'finalized';
|
2022-09-01 02:47:37 -07:00
|
|
|
const connection = new Connection(CLUSTER_URL!, options);
|
2022-08-08 07:13:57 -07:00
|
|
|
|
|
|
|
const admin = Keypair.fromSecretKey(
|
|
|
|
Buffer.from(
|
2022-08-18 14:54:41 -07:00
|
|
|
JSON.parse(fs.readFileSync(MANGO_MAINNET_PAYER_KEYPAIR, 'utf-8')),
|
2022-08-08 07:13:57 -07:00
|
|
|
),
|
|
|
|
);
|
|
|
|
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'],
|
2022-11-04 07:35:40 -07:00
|
|
|
{
|
|
|
|
idsSource: 'get-program-accounts',
|
2023-02-03 04:51:18 -08:00
|
|
|
prioritizationFee: 100,
|
|
|
|
txConfirmationCommitment: 'confirmed',
|
2022-11-04 07:35:40 -07:00
|
|
|
},
|
2022-08-08 07:13:57 -07:00
|
|
|
);
|
|
|
|
console.log(`User ${userWallet.publicKey.toBase58()}`);
|
|
|
|
|
2022-08-18 14:54:41 -07:00
|
|
|
// const groups = await client.getGroupsForCreator(admin.publicKey);
|
|
|
|
// console.log(
|
|
|
|
// 'groups: ',
|
|
|
|
// groups.map((g) => g.publicKey.toString() + ' ' + g.groupNum.toString()),
|
|
|
|
// );
|
|
|
|
|
2022-08-08 07:13:57 -07:00
|
|
|
const group = await client.getGroupForCreator(admin.publicKey, GROUP_NUM);
|
|
|
|
console.log(group.toString());
|
|
|
|
|
2022-08-09 01:57:03 -07:00
|
|
|
let accounts = await client.getMangoAccountsForOwner(group, admin.publicKey);
|
2022-09-02 00:48:00 -07:00
|
|
|
for (let account of accounts) {
|
|
|
|
for (let serumOrders of account.serum3Active()) {
|
2022-10-11 00:38:52 -07:00
|
|
|
const serumMarket = group.getSerum3MarketByMarketIndex(
|
2022-09-25 18:11:38 -07:00
|
|
|
serumOrders.marketIndex,
|
|
|
|
)!;
|
2022-09-02 00:48:00 -07:00
|
|
|
const serumExternal = serumMarket.serumMarketExternal;
|
|
|
|
console.log(
|
|
|
|
`closing serum orders on: ${account} for market ${serumMarket.name}`,
|
|
|
|
);
|
2022-10-11 00:38:52 -07:00
|
|
|
await client.serum3CancelAllOrders(group, account, serumExternal, 10);
|
2022-09-02 00:48:00 -07:00
|
|
|
await client.serum3SettleFunds(group, account, serumExternal);
|
|
|
|
await client.serum3CloseOpenOrders(group, account, serumExternal);
|
|
|
|
}
|
|
|
|
|
2022-09-15 00:57:48 -07:00
|
|
|
for (let perpPosition of account.perpActive()) {
|
|
|
|
const perpMarket = group.findPerpMarket(perpPosition.marketIndex)!;
|
|
|
|
console.log(
|
|
|
|
`closing perp orders on: ${account} for market ${perpMarket.name}`,
|
|
|
|
);
|
2022-10-11 00:38:52 -07:00
|
|
|
await client.perpCancelAllOrders(
|
|
|
|
group,
|
|
|
|
account,
|
|
|
|
perpMarket.perpMarketIndex,
|
|
|
|
10,
|
|
|
|
);
|
2022-08-08 08:08:58 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-09 01:57:03 -07:00
|
|
|
accounts = await client.getMangoAccountsForOwner(group, admin.publicKey);
|
2022-08-08 08:08:58 -07:00
|
|
|
for (let account of accounts) {
|
|
|
|
// close account
|
2022-08-08 07:13:57 -07:00
|
|
|
try {
|
2022-08-08 08:08:58 -07:00
|
|
|
console.log(`closing account: ${account}`);
|
2022-12-15 12:10:56 -08:00
|
|
|
await client.closeMangoAccount(group, account, true);
|
2022-08-08 07:13:57 -07:00
|
|
|
} catch (error) {
|
|
|
|
console.log(`failed to close ${account.publicKey}: ${error}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
process.exit();
|
|
|
|
}
|
|
|
|
|
|
|
|
main();
|