fix bug where serum oo where not loaded (#403)

* fix bug where serum oo where not loaded

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* fixes from review

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* fixes from review

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2023-01-19 11:31:54 +01:00 committed by GitHub
parent 44f599ca62
commit 919f09bb8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 71 additions and 26 deletions

View File

@ -90,7 +90,7 @@ export class MangoAccount {
public async reload(client: MangoClient): Promise<MangoAccount> {
const mangoAccount = await client.getMangoAccount(this);
await mangoAccount.reloadAccountData(client);
await mangoAccount.reloadSerum3OpenOrders(client);
Object.assign(this, mangoAccount);
return mangoAccount;
}
@ -99,12 +99,12 @@ export class MangoAccount {
client: MangoClient,
): Promise<{ value: MangoAccount; slot: number }> {
const resp = await client.getMangoAccountWithSlot(this.publicKey);
await resp?.value.reloadAccountData(client);
await resp?.value.reloadSerum3OpenOrders(client);
Object.assign(this, resp?.value);
return { value: resp!.value, slot: resp!.slot };
}
async reloadAccountData(client: MangoClient): Promise<MangoAccount> {
async reloadSerum3OpenOrders(client: MangoClient): Promise<MangoAccount> {
const serum3Active = this.serum3Active();
const ais =
await client.program.provider.connection.getMultipleAccountsInfo(

View File

@ -431,7 +431,9 @@ export class PerpMarket {
direction: 'negative' | 'positive',
count = 2,
): Promise<{ account: MangoAccount; settleablePnl: I80F48 }[]> {
let accountsWithSettleablePnl = (await client.getAllMangoAccounts(group))
let accountsWithSettleablePnl = (
await client.getAllMangoAccounts(group, true)
)
.filter((acc) => acc.perpPositionExistsForMarket(this))
.map((acc) => {
const pp = acc

View File

@ -53,10 +53,10 @@ import { I80F48 } from './numbers/I80F48';
import { FlashLoanType, InterestRateParams, OracleConfigParams } from './types';
import {
I64_MAX_BN,
U64_MAX_BN,
createAssociatedTokenAccountIdempotentInstruction,
getAssociatedTokenAddress,
toNative,
U64_MAX_BN,
} from './utils';
import { sendTransaction } from './utils/rpc';
@ -540,16 +540,24 @@ export class MangoClient {
// MangoAccount
public async getOrCreateMangoAccount(group: Group): Promise<MangoAccount> {
public async getOrCreateMangoAccount(
group: Group,
loadSerum3Oo = false,
): Promise<MangoAccount> {
const clientOwner = (this.program.provider as AnchorProvider).wallet
.publicKey;
let mangoAccounts = await this.getMangoAccountsForOwner(
group,
(this.program.provider as AnchorProvider).wallet.publicKey,
loadSerum3Oo,
);
if (mangoAccounts.length === 0) {
await this.createMangoAccount(group);
mangoAccounts = await this.getMangoAccountsForOwner(group, clientOwner);
mangoAccounts = await this.getMangoAccountsForOwner(
group,
clientOwner,
loadSerum3Oo,
);
}
return mangoAccounts.sort((a, b) => a.accountNum - b.accountNum)[0];
}
@ -593,6 +601,7 @@ export class MangoClient {
serum3Count?: number,
perpCount?: number,
perpOoCount?: number,
loadSerum3Oo = false,
): Promise<MangoAccount | undefined> {
const accNum = accountNumber ?? 0;
await this.createMangoAccount(
@ -608,6 +617,7 @@ export class MangoClient {
group,
(this.program.provider as AnchorProvider).wallet.publicKey,
accNum,
loadSerum3Oo,
);
}
@ -668,28 +678,25 @@ export class MangoClient {
public async getMangoAccount(
mangoAccount: MangoAccount | PublicKey,
loadSerum3Oo = false,
): Promise<MangoAccount> {
const mangoAccountPk =
mangoAccount instanceof MangoAccount
? mangoAccount.publicKey
: mangoAccount;
return MangoAccount.from(
mangoAccountPk,
await this.program.account.mangoAccount.fetch(mangoAccountPk),
);
}
public async getMangoAccountForPublicKey(
mangoAccountPk: PublicKey,
): Promise<MangoAccount> {
return MangoAccount.from(
const mangoAccount_ = MangoAccount.from(
mangoAccountPk,
await this.program.account.mangoAccount.fetch(mangoAccountPk),
);
if (loadSerum3Oo) {
await mangoAccount_?.reloadSerum3OpenOrders(this);
}
return mangoAccount_;
}
public async getMangoAccountWithSlot(
mangoAccountPk: PublicKey,
loadSerum3Oo = false,
): Promise<{ slot: number; value: MangoAccount } | undefined> {
const resp =
await this.program.provider.connection.getAccountInfoAndContext(
@ -701,6 +708,9 @@ export class MangoClient {
resp.value.data,
);
const mangoAccount = MangoAccount.from(mangoAccountPk, decodedMangoAccount);
if (loadSerum3Oo) {
await mangoAccount?.reloadSerum3OpenOrders(this);
}
return { slot: resp.context.slot, value: mangoAccount };
}
@ -708,8 +718,13 @@ export class MangoClient {
group: Group,
ownerPk: PublicKey,
accountNumber: number,
loadSerum3Oo = false,
): Promise<MangoAccount | undefined> {
const mangoAccounts = await this.getMangoAccountsForOwner(group, ownerPk);
const mangoAccounts = await this.getMangoAccountsForOwner(
group,
ownerPk,
loadSerum3Oo,
);
const foundMangoAccount = mangoAccounts.find(
(a) => a.accountNum == accountNumber,
);
@ -720,8 +735,9 @@ export class MangoClient {
public async getMangoAccountsForOwner(
group: Group,
ownerPk: PublicKey,
loadSerum3Oo = false,
): Promise<MangoAccount[]> {
return (
const accounts = (
await this.program.account.mangoAccount.all([
{
memcmp: {
@ -739,13 +755,22 @@ export class MangoClient {
).map((pa) => {
return MangoAccount.from(pa.publicKey, pa.account);
});
if (loadSerum3Oo) {
await Promise.all(
accounts.map(async (a) => await a.reloadSerum3OpenOrders(this)),
);
}
return accounts;
}
public async getMangoAccountsForDelegate(
group: Group,
delegate: PublicKey,
loadSerum3Oo = false,
): Promise<MangoAccount[]> {
return (
const accounts = (
await this.program.account.mangoAccount.all([
{
memcmp: {
@ -763,10 +788,21 @@ export class MangoClient {
).map((pa) => {
return MangoAccount.from(pa.publicKey, pa.account);
});
if (loadSerum3Oo) {
await Promise.all(
accounts.map(async (a) => await a.reloadSerum3OpenOrders(this)),
);
}
return accounts;
}
public async getAllMangoAccounts(group: Group): Promise<MangoAccount[]> {
return (
public async getAllMangoAccounts(
group: Group,
loadSerum3Oo = false,
): Promise<MangoAccount[]> {
const accounts = (
await this.program.account.mangoAccount.all([
{
memcmp: {
@ -778,6 +814,14 @@ export class MangoClient {
).map((pa) => {
return MangoAccount.from(pa.publicKey, pa.account);
});
if (loadSerum3Oo) {
await Promise.all(
accounts.map(async (a) => await a.reloadSerum3OpenOrders(this)),
);
}
return accounts;
}
/**

View File

@ -28,7 +28,7 @@ async function main() {
);
// Load mango account
let mangoAccount = await client.getMangoAccountForPublicKey(
let mangoAccount = await client.getMangoAccount(
new PublicKey(MANGO_ACCOUNT_PK),
);
await mangoAccount.reload(client);

View File

@ -28,7 +28,6 @@ import {
makeInitSequenceEnforcerAccountIx,
seqEnforcerProgramIds,
} from './sequence-enforcer-util';
import * as defaultParams from './params/default.json';
// Future
// * use async nodejs logging
@ -248,7 +247,7 @@ async function fullMarketMaker() {
);
// Load mango account
let mangoAccount = await client.getMangoAccountForPublicKey(
let mangoAccount = await client.getMangoAccount(
new PublicKey(MANGO_ACCOUNT_PK),
);
console.log(

View File

@ -177,7 +177,7 @@ async function main() {
);
// Load mango account
let mangoAccount = await client.getMangoAccountForPublicKey(
let mangoAccount = await client.getMangoAccount(
new PublicKey(MANGO_ACCOUNT_PK),
);
await mangoAccount.reload(client);