use getMultipleAccounts instead of gPA for serum oo

This commit is contained in:
Tyler Shipe 2021-09-10 12:12:50 -04:00
parent 1e22b639f6
commit 3015f73724
3 changed files with 49 additions and 29 deletions

View File

@ -56,6 +56,7 @@ import {
} from './instruction'; } from './instruction';
import { Aggregator } from './schema'; import { Aggregator } from './schema';
import { TOKEN_PROGRAM_ID } from '@solana/spl-token'; import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
import { getMultipleAccounts } from '.';
export const tokenToDecimals = { export const tokenToDecimals = {
"BTC": 4, "BTC": 4,
@ -1381,37 +1382,32 @@ export class MangoClient {
marginAccountsFilters.push(...filters); marginAccountsFilters.push(...filters);
} }
const marginAccountsProms = getFilteredProgramAccounts(connection, programId, marginAccountsFilters) const marginAccounts = await getFilteredProgramAccounts(connection, programId, marginAccountsFilters)
.then((accounts) => ( .then((accounts) => (
accounts.map(({ publicKey, accountInfo }) => accounts.map(({ publicKey, accountInfo }) =>
new MarginAccount(publicKey, MarginAccountLayout.decode(accountInfo == null ? undefined : accountInfo.data)) 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, mangoGroup.dexProgramId, ordersFilters) const openOrderPks = marginAccounts
.then( .map((ma) => ma.openOrders.filter((pk) => !pk.equals(zeroKey)))
(accounts) => ( .flat();
accounts.map(
( { publicKey, accountInfo } ) => const openOrderAccountInfos = await getMultipleAccounts(
OpenOrders.fromAccountInfo(publicKey, accountInfo, mangoGroup.dexProgramId) connection,
) openOrderPks,
) );
)
const openOrders = openOrderAccountInfos.map(
({ publicKey, accountInfo }) =>
OpenOrders.fromAccountInfo(
publicKey,
accountInfo,
mangoGroup.dexProgramId,
),
);
const marginAccounts = await marginAccountsProms
const openOrders = await openOrdersProms
const pkToOpenOrdersAccount = {} const pkToOpenOrdersAccount = {}
openOrders.forEach( openOrders.forEach(
(openOrdersAccount) => ( (openOrdersAccount) => (

View File

@ -278,19 +278,36 @@ export function parseTokenAccount(
export async function getMultipleAccounts( export async function getMultipleAccounts(
connection: Connection, connection: Connection,
publicKeys: PublicKey[], publicKeys: PublicKey[],
commitment?: Commitment commitment?: Commitment,
): Promise<{ publicKey: PublicKey; accountInfo: AccountInfo<Buffer> }[]> { ): Promise<
const publickKeyStrs = publicKeys.map((pk) => (pk.toBase58())); {
publicKey: PublicKey;
context: { slot: number };
accountInfo: AccountInfo<Buffer>;
}[]
> {
const len = publicKeys.length;
if (len > 100) {
const mid = Math.floor(publicKeys.length / 2);
return Promise.all([
getMultipleAccounts(connection, publicKeys.slice(0, mid), commitment),
getMultipleAccounts(connection, publicKeys.slice(mid, len), commitment),
]).then((a) => a[0].concat(a[1]));
}
const publicKeyStrs = publicKeys.map((pk) => pk.toBase58());
// load connection commitment as a default
commitment ||= connection.commitment;
const args = commitment ? [publickKeyStrs, {commitment}] : [publickKeyStrs]; const args = commitment ? [publicKeyStrs, { commitment }] : [publicKeyStrs];
// @ts-ignore // @ts-ignore
const resp = await connection._rpcRequest('getMultipleAccounts', args); const resp = await connection._rpcRequest('getMultipleAccounts', args);
if (resp.error) { if (resp.error) {
throw new Error(resp.error.message); throw new Error(resp.error.message);
} }
return resp.result.value.map( return resp.result.value.map(
({ data, executable, lamports, owner } , i) => ({ ({ data, executable, lamports, owner }, i: number) => ({
publicKey: publicKeys[i], publicKey: publicKeys[i],
context: resp.result.context,
accountInfo: { accountInfo: {
data: Buffer.from(data[0], 'base64'), data: Buffer.from(data[0], 'base64'),
executable, executable,

View File

@ -2,6 +2,8 @@
"extends": "@tsconfig/node10/tsconfig.json", "extends": "@tsconfig/node10/tsconfig.json",
"compilerOptions": { "compilerOptions": {
"target": "es6",
"lib": ["es2019"],
"outDir": "./lib", "outDir": "./lib",
"allowJs": true, "allowJs": true,
"checkJs": true, "checkJs": true,
@ -13,5 +15,10 @@
"jsx": "react" "jsx": "react"
}, },
"include": ["./tests/**/*", "./src/**/*"], "include": ["./tests/**/*", "./src/**/*"],
"exclude": ["./tests/**/*.test.js", "./src/**/*.test.js", "node_modules", "**/node_modules"] "exclude": [
"./tests/**/*.test.js",
"./src/**/*.test.js",
"node_modules",
"**/node_modules"
]
} }