2023-02-21 23:36:59 -08:00
|
|
|
import { AnchorProvider, Wallet } from '@coral-xyz/anchor';
|
2023-01-21 03:43:25 -08:00
|
|
|
import { Cluster, Connection, Keypair, PublicKey } from '@solana/web3.js';
|
|
|
|
import * as dotenv from 'dotenv';
|
2023-02-21 23:36:59 -08:00
|
|
|
import { MangoClient } from '../../src/client';
|
|
|
|
import { MANGO_V4_ID } from '../../src/constants';
|
2023-03-30 01:10:00 -07:00
|
|
|
import { toUiDecimalsForQuote } from '../../src/utils';
|
2023-01-21 03:43:25 -08:00
|
|
|
dotenv.config();
|
|
|
|
|
|
|
|
const CLUSTER_URL =
|
|
|
|
process.env.CLUSTER_URL_OVERRIDE || process.env.MB_CLUSTER_URL;
|
|
|
|
const PAYER_KEYPAIR =
|
|
|
|
process.env.PAYER_KEYPAIR_OVERRIDE || process.env.MB_PAYER_KEYPAIR;
|
|
|
|
const GROUP_PK =
|
|
|
|
process.env.GROUP_PK || '78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX';
|
|
|
|
const CLUSTER: Cluster =
|
|
|
|
(process.env.CLUSTER_OVERRIDE as Cluster) || 'mainnet-beta';
|
|
|
|
|
|
|
|
async function main(): Promise<void> {
|
|
|
|
const options = AnchorProvider.defaultOptions();
|
|
|
|
const connection = new Connection(CLUSTER_URL!, options);
|
|
|
|
|
|
|
|
const wallet = new Wallet(new Keypair());
|
|
|
|
const provider = new AnchorProvider(connection, wallet, options);
|
|
|
|
const client = MangoClient.connect(provider, CLUSTER, MANGO_V4_ID[CLUSTER], {
|
|
|
|
idsSource: 'get-program-accounts',
|
|
|
|
});
|
|
|
|
|
|
|
|
const group = await client.getGroup(new PublicKey(GROUP_PK));
|
|
|
|
const mangoAccounts = await client.getAllMangoAccounts(group);
|
|
|
|
|
|
|
|
Array.from(group.perpMarketsMapByMarketIndex.values())
|
|
|
|
.filter((perpMarket) => perpMarket.name != 'SOMETHING-PERP')
|
|
|
|
.map((perpMarket) => {
|
|
|
|
console.log(`name ${perpMarket.name}`);
|
|
|
|
let getUnsettledPnlUiAgg = 0;
|
|
|
|
let getBasePositionUiAgg = 0;
|
|
|
|
let longSettledFundingAgg = 0;
|
|
|
|
let shortSettledFundingAgg = 0;
|
|
|
|
mangoAccounts.map((mangoAccount) => {
|
|
|
|
const pp = mangoAccount
|
|
|
|
.perpActive()
|
|
|
|
.find((pp) => pp.marketIndex === perpMarket.perpMarketIndex);
|
|
|
|
if (pp) {
|
2023-01-21 05:10:34 -08:00
|
|
|
getUnsettledPnlUiAgg += pp.getUnsettledPnlUi(perpMarket);
|
2023-01-21 03:43:25 -08:00
|
|
|
getBasePositionUiAgg += pp.getBasePositionUi(perpMarket);
|
|
|
|
longSettledFundingAgg += pp.longSettledFunding.toNumber();
|
|
|
|
shortSettledFundingAgg += pp.shortSettledFunding.toNumber();
|
|
|
|
// console.log(` - ${mangoAccount.publicKey.toBase58().padStart(45)}`);
|
|
|
|
// console.log(
|
|
|
|
// ` - unsettled pnl ${pp
|
|
|
|
// .getUnsettledPnlUi(group, perpMarket)
|
|
|
|
// .toFixed(4)
|
|
|
|
// .padStart(10)}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// ` - base position ${pp
|
|
|
|
// .getBasePositionUi(perpMarket)
|
|
|
|
// .toFixed(4)
|
|
|
|
// .padStart(10)}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// ` - avgEntryPricePerBaseLot ${pp.avgEntryPricePerBaseLot}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// ` - realizedTradePnl ${toUiDecimalsForQuote(
|
|
|
|
// pp.realizedTradePnlNative,
|
|
|
|
// )}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// ` - realizedOtherPnl ${toUiDecimalsForQuote(
|
|
|
|
// pp.realizedOtherPnlNative,
|
|
|
|
// )}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// ` - settlePnlLimitRealizedTrade ${pp.settlePnlLimitRealizedTrade.toNumber()}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// ` - realizedPnlForPosition ${toUiDecimalsForQuote(
|
|
|
|
// pp.realizedPnlForPositionNative,
|
|
|
|
// )}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// ` - settlePnlLimitSettledInCurrentWindow ${toUiDecimalsForQuote(
|
|
|
|
// pp.settlePnlLimitSettledInCurrentWindowNative,
|
|
|
|
// )}`,
|
|
|
|
// );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// console.log(
|
|
|
|
// `- feesAccrued ${toUiDecimalsForQuote(perpMarket.feesAccrued)}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// `- feesSettled ${toUiDecimalsForQuote(perpMarket.feesSettled)}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// `- longSettledFundingAgg ${longSettledFundingAgg
|
|
|
|
// .toFixed(4)
|
|
|
|
// .padStart(10)}`,
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// `- shortSettledFunding ${shortSettledFundingAgg
|
|
|
|
// .toFixed(4)
|
|
|
|
// .padStart(10)}`,
|
|
|
|
// );
|
|
|
|
console.log(
|
|
|
|
`- unsettled pnl aggr ${getUnsettledPnlUiAgg.toFixed(4).padStart(10)}`,
|
|
|
|
);
|
|
|
|
console.log(
|
|
|
|
`- base position aggr ${getBasePositionUiAgg.toFixed(4).padStart(10)}`,
|
|
|
|
);
|
|
|
|
console.log(
|
|
|
|
`- base position aggr * price ${(
|
|
|
|
getBasePositionUiAgg * perpMarket.uiPrice
|
|
|
|
)
|
|
|
|
.toFixed(4)
|
|
|
|
.padStart(10)}`,
|
|
|
|
);
|
2023-03-30 01:10:00 -07:00
|
|
|
console.log(
|
|
|
|
`- perp.feesAccrued ${toUiDecimalsForQuote(perpMarket.feesAccrued)}`,
|
|
|
|
);
|
|
|
|
console.log(
|
|
|
|
`- perp.feesSettled ${toUiDecimalsForQuote(perpMarket.feesSettled)}`,
|
|
|
|
);
|
2023-01-21 03:43:25 -08:00
|
|
|
console.log(
|
|
|
|
`- unsettled pnl aggr - base position aggr * price ${(
|
|
|
|
getUnsettledPnlUiAgg -
|
|
|
|
getBasePositionUiAgg * perpMarket.uiPrice
|
|
|
|
)
|
|
|
|
.toFixed(4)
|
|
|
|
.padStart(10)}`,
|
|
|
|
);
|
2023-03-30 01:10:00 -07:00
|
|
|
console.log(
|
2023-03-30 01:40:33 -07:00
|
|
|
`- perp.feesAccrued - perp.feesSettled + unsettled pnl aggr ${
|
2023-03-30 01:10:00 -07:00
|
|
|
toUiDecimalsForQuote(
|
|
|
|
perpMarket.feesAccrued.sub(perpMarket.feesSettled),
|
2023-03-30 01:40:33 -07:00
|
|
|
) + getUnsettledPnlUiAgg
|
2023-03-30 01:10:00 -07:00
|
|
|
}`,
|
|
|
|
);
|
2023-01-21 03:43:25 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
process.exit();
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
main();
|
|
|
|
} catch (error) {
|
|
|
|
console.log(error);
|
|
|
|
}
|