use getMultipleAccounts instead of gPA for serum oo
This commit is contained in:
parent
1e22b639f6
commit
3015f73724
|
@ -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) => (
|
||||||
|
|
27
src/utils.ts
27
src/utils.ts
|
@ -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,
|
||||||
|
|
|
@ -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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue