optimized getAllMarginAccounts

This commit is contained in:
dd 2021-02-24 14:31:48 -05:00
parent 322468ce7e
commit 25a1873853
2 changed files with 52 additions and 12 deletions

View File

@ -921,7 +921,8 @@ export class MangoClient {
connection: Connection,
programId: PublicKey,
mangoGroup: MangoGroup
): Promise<MarginAccount[]>{
): Promise<MarginAccount[]> {
const filters = [
{
memcmp: {
@ -935,15 +936,53 @@ export class MangoClient {
},
];
const accounts = await getFilteredProgramAccounts(connection, programId, filters);
const marginAccounts = accounts.map(
({ publicKey, accountInfo }) =>
new MarginAccount(publicKey, MarginAccountLayout.decode(accountInfo == null ? undefined : accountInfo.data))
const marginAccountsProms = getFilteredProgramAccounts(connection, programId, filters)
.then((accounts) => (
accounts.map(({ publicKey, accountInfo }) =>
new MarginAccount(publicKey, MarginAccountLayout.decode(accountInfo == null ? undefined : accountInfo.data))
)
))
const ordersFilters = [
{
memcmp: {
offset: OpenOrders.getLayout(mangoGroup.dexProgramId).offsetOf('owner'),
bytes: mangoGroup.signerKey.toBase58()
}
},
{
dataSize: OpenOrders.getLayout(mangoGroup.dexProgramId).span
}
]
const openOrdersProms = getFilteredProgramAccounts(connection, programId, ordersFilters)
.then(
(accounts) => (
accounts.map(
( { publicKey, accountInfo } ) =>
OpenOrders.fromAccountInfo(publicKey, accountInfo, mangoGroup.dexProgramId)
)
)
)
const marginAccounts = await marginAccountsProms
const openOrders = await openOrdersProms
const pkToOpenOrdersAccount = {}
openOrders.forEach(
(openOrdersAccount) => (
pkToOpenOrdersAccount[openOrdersAccount.publicKey.toBase58()] = openOrdersAccount
)
)
await Promise.all(marginAccounts.map((ma) => ma.loadOpenOrders(connection, mangoGroup.dexProgramId)))
return marginAccounts
for (const ma of marginAccounts) {
for (let i = 0; i < ma.openOrders.length; i++) {
if (ma.openOrders[i].toBase58() in pkToOpenOrdersAccount) {
ma.openOrdersAccounts[i] = pkToOpenOrdersAccount[ma.openOrders[i].toBase58()]
}
}
}
return marginAccounts
}
async getMarginAccountsForOwner(
@ -973,11 +1012,14 @@ export class MangoClient {
];
const accounts = await getFilteredProgramAccounts(connection, programId, filters);
const marginAccounts = accounts.map(
({ publicKey, accountInfo }) =>
new MarginAccount(publicKey, MarginAccountLayout.decode(accountInfo == null ? undefined : accountInfo.data))
)
await Promise.all(marginAccounts.map((ma) => ma.loadOpenOrders(connection, mangoGroup.dexProgramId)))
return marginAccounts
}

View File

@ -1,17 +1,15 @@
import { MangoClient, MangoGroup } from './client';
import { NUM_TOKENS } from './layout';
import IDS from './ids.json';
export { MangoClient, MangoGroup, MarginAccount } from './client';
export { MangoIndexLayout, MarginAccountLayout, MangoGroupLayout } from './layout';
export * from './layout';
export * from './utils'
import IDS from "./ids.json";
// import { Connection, PublicKey } from '@solana/web3.js';
// import { Aggregator } from './schema';
export { IDS }
//
// async function testMangoGroup() {
// const cluster = "devnet";
// const client = new MangoClient();