debug banks helper script
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
parent
21815612ae
commit
41e42da620
|
@ -26,6 +26,7 @@ export class Bank {
|
||||||
public util0: I80F48;
|
public util0: I80F48;
|
||||||
public util1: I80F48;
|
public util1: I80F48;
|
||||||
public price: I80F48;
|
public price: I80F48;
|
||||||
|
public collectedFeesNative: I80F48;
|
||||||
public loanFeeRate: I80F48;
|
public loanFeeRate: I80F48;
|
||||||
public loanOriginationFeeRate: I80F48;
|
public loanOriginationFeeRate: I80F48;
|
||||||
public initAssetWeight: I80F48;
|
public initAssetWeight: I80F48;
|
||||||
|
@ -166,6 +167,7 @@ export class Bank {
|
||||||
this.rate0 = I80F48.from(rate0);
|
this.rate0 = I80F48.from(rate0);
|
||||||
this.util1 = I80F48.from(util1);
|
this.util1 = I80F48.from(util1);
|
||||||
this.rate1 = I80F48.from(rate1);
|
this.rate1 = I80F48.from(rate1);
|
||||||
|
this.collectedFeesNative = I80F48.from(collectedFeesNative);
|
||||||
this.loanFeeRate = I80F48.from(loanFeeRate);
|
this.loanFeeRate = I80F48.from(loanFeeRate);
|
||||||
this.loanOriginationFeeRate = I80F48.from(loanOriginationFeeRate);
|
this.loanOriginationFeeRate = I80F48.from(loanOriginationFeeRate);
|
||||||
this.maintAssetWeight = I80F48.from(maintAssetWeight);
|
this.maintAssetWeight = I80F48.from(maintAssetWeight);
|
||||||
|
|
|
@ -15,7 +15,6 @@ import {
|
||||||
AccountMeta,
|
AccountMeta,
|
||||||
Cluster,
|
Cluster,
|
||||||
Keypair,
|
Keypair,
|
||||||
LAMPORTS_PER_SOL,
|
|
||||||
MemcmpFilter,
|
MemcmpFilter,
|
||||||
PublicKey,
|
PublicKey,
|
||||||
Signer,
|
Signer,
|
||||||
|
@ -596,6 +595,21 @@ export class MangoClient {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getAllMangoAccounts(group: Group): Promise<MangoAccount[]> {
|
||||||
|
return (
|
||||||
|
await this.program.account.mangoAccount.all([
|
||||||
|
{
|
||||||
|
memcmp: {
|
||||||
|
bytes: group.publicKey.toBase58(),
|
||||||
|
offset: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
])
|
||||||
|
).map((pa) => {
|
||||||
|
return MangoAccount.from(pa.publicKey, pa.account);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public async closeMangoAccount(
|
public async closeMangoAccount(
|
||||||
group: Group,
|
group: Group,
|
||||||
mangoAccount: MangoAccount,
|
mangoAccount: MangoAccount,
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
import { AnchorProvider, Wallet } from '@project-serum/anchor';
|
||||||
|
import { coder } from '@project-serum/anchor/dist/cjs/spl/token';
|
||||||
|
import { Connection, Keypair } from '@solana/web3.js';
|
||||||
|
import fs from 'fs';
|
||||||
|
import { ZERO_I80F48 } from '../accounts/I80F48';
|
||||||
|
import { MangoClient } from '../client';
|
||||||
|
import { MANGO_V4_ID } from '../constants';
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const options = AnchorProvider.defaultOptions();
|
||||||
|
const connection = new Connection(process.env.MB_CLUSTER_URL!, options);
|
||||||
|
|
||||||
|
const admin = Keypair.fromSecretKey(
|
||||||
|
Buffer.from(
|
||||||
|
JSON.parse(fs.readFileSync(process.env.MB_PAYER_KEYPAIR!, 'utf-8')),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
const adminWallet = new Wallet(admin);
|
||||||
|
const adminProvider = new AnchorProvider(connection, adminWallet, options);
|
||||||
|
const client = MangoClient.connect(
|
||||||
|
adminProvider,
|
||||||
|
'mainnet-beta',
|
||||||
|
MANGO_V4_ID['mainnet-beta'],
|
||||||
|
);
|
||||||
|
|
||||||
|
const group = await client.getGroupForCreator(admin.publicKey, 0);
|
||||||
|
console.log(`Group ${group.publicKey.toBase58()}`);
|
||||||
|
|
||||||
|
const banks = await client.getBanksForGroup(group);
|
||||||
|
const banksMapUsingTokenIndex = new Map(
|
||||||
|
banks.map((bank) => {
|
||||||
|
(bank as any).indexedDepositsByMangoAccounts = ZERO_I80F48;
|
||||||
|
(bank as any).indexedBorrowsByMangoAccounts = ZERO_I80F48;
|
||||||
|
return [bank.tokenIndex, bank];
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
const mangoAccounts = await client.getAllMangoAccounts(group);
|
||||||
|
mangoAccounts.forEach((mangoAccount) =>
|
||||||
|
console.log(
|
||||||
|
`MangoAccount pk - ${mangoAccount.publicKey}, owner - ${mangoAccount.owner}`,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
mangoAccounts.map((mangoAccount) =>
|
||||||
|
mangoAccount.tokensActive().forEach((token) => {
|
||||||
|
const bank = banksMapUsingTokenIndex.get(token.tokenIndex);
|
||||||
|
if (token.indexedPosition.isPos()) {
|
||||||
|
(bank as any).indexedDepositsByMangoAccounts = (
|
||||||
|
bank as any
|
||||||
|
).indexedDepositsByMangoAccounts.add(
|
||||||
|
token.indexedPosition.mul(
|
||||||
|
banksMapUsingTokenIndex.get(token.tokenIndex).depositIndex,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (token.indexedPosition.isNeg()) {
|
||||||
|
(bank as any).indexedBorrowsByMangoAccounts = (
|
||||||
|
bank as any
|
||||||
|
).indexedBorrowsByMangoAccounts.add(
|
||||||
|
token.indexedPosition
|
||||||
|
.abs()
|
||||||
|
.mul(banksMapUsingTokenIndex.get(token.tokenIndex).borrowIndex),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const bank of await Array.from(banksMapUsingTokenIndex.values()).sort(
|
||||||
|
(a, b) => a.tokenIndex - b.tokenIndex,
|
||||||
|
)) {
|
||||||
|
let res = `${bank.name}`;
|
||||||
|
res =
|
||||||
|
res +
|
||||||
|
`\n ${'collectedFeesNative'.padEnd(40)} ${bank.collectedFeesNative}` +
|
||||||
|
`\n ${'deposits'.padEnd(40)} ${bank.indexedDeposits.mul(
|
||||||
|
bank.depositIndex,
|
||||||
|
)}` +
|
||||||
|
`\n ${'deposits (sum over all mango accounts)'.padEnd(40)} ${
|
||||||
|
(bank as any).indexedDepositsByMangoAccounts
|
||||||
|
}` +
|
||||||
|
`\n ${'cachedIndexedTotalDeposits'.padEnd(40)} ${(
|
||||||
|
bank as any
|
||||||
|
).cachedIndexedTotalDeposits.mul(bank.depositIndex)}` +
|
||||||
|
`\n ${'indexedBorrows'.padEnd(40)} ${bank.indexedBorrows.mul(
|
||||||
|
bank.borrowIndex,
|
||||||
|
)}` +
|
||||||
|
`\n ${'borrows (sum over all mango accounts)'.padEnd(40)} ${
|
||||||
|
(bank as any).indexedBorrowsByMangoAccounts
|
||||||
|
}` +
|
||||||
|
`\n ${'cachedIndexedTotalBorrows'.padEnd(40)} ${(
|
||||||
|
bank as any
|
||||||
|
).cachedIndexedTotalBorrows.mul(bank.borrowIndex)}` +
|
||||||
|
`\n ${'avgUtilization'.padEnd(40)} ${bank.avgUtilization}` +
|
||||||
|
`\n ${'depositRate'.padEnd(40)} ${bank.getDepositRate()}` +
|
||||||
|
`\n ${'borrowRate'.padEnd(40)} ${bank.getBorrowRate()}` +
|
||||||
|
`\n ${'vault'.padEnd(40)} ${coder()
|
||||||
|
.accounts.decode(
|
||||||
|
'token',
|
||||||
|
await (
|
||||||
|
await client.program.provider.connection.getAccountInfo(bank.vault)
|
||||||
|
).data,
|
||||||
|
)
|
||||||
|
.amount.toNumber()}`;
|
||||||
|
|
||||||
|
console.log(`${res}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
main();
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ import {
|
||||||
} from '../accounts/serum3';
|
} from '../accounts/serum3';
|
||||||
import { MangoClient } from '../client';
|
import { MangoClient } from '../client';
|
||||||
import { MANGO_V4_ID } from '../constants';
|
import { MANGO_V4_ID } from '../constants';
|
||||||
|
import { toUiDecimalsForQuote } from '../utils';
|
||||||
|
|
||||||
//
|
//
|
||||||
// An example for users based on high level api i.e. the client
|
// An example for users based on high level api i.e. the client
|
||||||
|
@ -240,11 +241,15 @@ async function main() {
|
||||||
);
|
);
|
||||||
console.log(
|
console.log(
|
||||||
'...mangoAccount.getAssetsVal() ' +
|
'...mangoAccount.getAssetsVal() ' +
|
||||||
toUiDecimalsForQuote(mangoAccount.getAssetsVal().toNumber()),
|
toUiDecimalsForQuote(
|
||||||
|
mangoAccount.getAssetsVal(HealthType.init).toNumber(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
console.log(
|
console.log(
|
||||||
'...mangoAccount.getLiabsVal() ' +
|
'...mangoAccount.getLiabsVal() ' +
|
||||||
toUiDecimalsForQuote(mangoAccount.getLiabsVal().toNumber()),
|
toUiDecimalsForQuote(
|
||||||
|
mangoAccount.getLiabsVal(HealthType.init).toNumber(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
console.log(
|
console.log(
|
||||||
'...mangoAccount.getMaxWithdrawWithBorrowForToken(group, "SOL") ' +
|
'...mangoAccount.getMaxWithdrawWithBorrowForToken(group, "SOL") ' +
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { Connection, Keypair } from '@solana/web3.js';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { Serum3Side } from '../accounts/serum3';
|
import { Serum3Side } from '../accounts/serum3';
|
||||||
import { MangoClient } from '../client';
|
import { MangoClient } from '../client';
|
||||||
|
import { MANGO_V4_ID } from '../constants';
|
||||||
|
|
||||||
//
|
//
|
||||||
// (untested?) script which closes a mango account cleanly, first closes all positions, withdraws all tokens and then closes it
|
// (untested?) script which closes a mango account cleanly, first closes all positions, withdraws all tokens and then closes it
|
||||||
|
@ -14,14 +15,15 @@ async function main() {
|
||||||
// user
|
// user
|
||||||
const user = Keypair.fromSecretKey(
|
const user = Keypair.fromSecretKey(
|
||||||
Buffer.from(
|
Buffer.from(
|
||||||
JSON.parse(fs.readFileSync(process.env.MB_PAYER_KEYPAIR!, 'utf-8')),
|
JSON.parse(fs.readFileSync(process.env.USER_KEYPAIR!, 'utf-8')),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
const userWallet = new Wallet(user);
|
const userWallet = new Wallet(user);
|
||||||
const userProvider = new AnchorProvider(connection, userWallet, options);
|
const userProvider = new AnchorProvider(connection, userWallet, options);
|
||||||
const client = await MangoClient.connectForGroupName(
|
const client = await MangoClient.connect(
|
||||||
userProvider,
|
userProvider,
|
||||||
'mainnet-beta.microwavedcola' /* Use ids json instead of getProgramAccounts */,
|
'mainnet-beta',
|
||||||
|
MANGO_V4_ID['mainnet-beta'],
|
||||||
);
|
);
|
||||||
console.log(`User ${userWallet.publicKey.toBase58()}`);
|
console.log(`User ${userWallet.publicKey.toBase58()}`);
|
||||||
|
|
||||||
|
@ -34,7 +36,7 @@ async function main() {
|
||||||
console.log(`Admin ${admin.publicKey.toBase58()}`);
|
console.log(`Admin ${admin.publicKey.toBase58()}`);
|
||||||
|
|
||||||
// fetch group
|
// fetch group
|
||||||
const group = await client.getGroupForCreator(admin.publicKey);
|
const group = await client.getGroupForCreator(admin.publicKey, 0);
|
||||||
console.log(`Found group ${group.publicKey.toBase58()}`);
|
console.log(`Found group ${group.publicKey.toBase58()}`);
|
||||||
|
|
||||||
// account
|
// account
|
||||||
|
|
Loading…
Reference in New Issue