fix buildHealthRemainingAccounts to not modify the mangoAccount obj (#369)
This commit is contained in:
parent
143d90ff23
commit
75593925aa
|
@ -22,7 +22,12 @@ import {
|
||||||
import bs58 from 'bs58';
|
import bs58 from 'bs58';
|
||||||
import { Bank, MintInfo, TokenIndex } from './accounts/bank';
|
import { Bank, MintInfo, TokenIndex } from './accounts/bank';
|
||||||
import { Group } from './accounts/group';
|
import { Group } from './accounts/group';
|
||||||
import { MangoAccount } from './accounts/mangoAccount';
|
import {
|
||||||
|
MangoAccount,
|
||||||
|
PerpPosition,
|
||||||
|
Serum3Orders,
|
||||||
|
TokenPosition,
|
||||||
|
} from './accounts/mangoAccount';
|
||||||
import { StubOracle } from './accounts/oracle';
|
import { StubOracle } from './accounts/oracle';
|
||||||
import {
|
import {
|
||||||
FillEvent,
|
FillEvent,
|
||||||
|
@ -2588,22 +2593,23 @@ export class MangoClient {
|
||||||
): PublicKey[] {
|
): PublicKey[] {
|
||||||
const healthRemainingAccounts: PublicKey[] = [];
|
const healthRemainingAccounts: PublicKey[] = [];
|
||||||
|
|
||||||
const tokenPositions = [...mangoAccount.tokens];
|
const tokenPositionIndices = mangoAccount.tokens.map((t) => t.tokenIndex);
|
||||||
for (const bank of banks) {
|
for (const bank of banks) {
|
||||||
const tokenPositionExists = tokenPositions.find(
|
const tokenPositionExists =
|
||||||
(t) => t.tokenIndex === bank.tokenIndex,
|
tokenPositionIndices.indexOf(bank.tokenIndex) > 0;
|
||||||
);
|
|
||||||
if (!tokenPositionExists) {
|
if (!tokenPositionExists) {
|
||||||
const inActiveTokenPosition = tokenPositions.find((t) => !t.isActive());
|
const inactiveTokenPosition = tokenPositionIndices.findIndex(
|
||||||
if (inActiveTokenPosition) {
|
(index) => index === TokenPosition.TokenIndexUnset,
|
||||||
inActiveTokenPosition.tokenIndex = bank.tokenIndex;
|
);
|
||||||
|
if (inactiveTokenPosition) {
|
||||||
|
tokenPositionIndices[inactiveTokenPosition] = bank.tokenIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const mintInfos = tokenPositions
|
const mintInfos = tokenPositionIndices
|
||||||
.filter((token) => token.isActive())
|
.filter((tokenIndex) => tokenIndex !== TokenPosition.TokenIndexUnset)
|
||||||
.map((token) => group.mintInfosMapByTokenIndex.get(token.tokenIndex)!);
|
.map((tokenIndex) => group.mintInfosMapByTokenIndex.get(tokenIndex)!);
|
||||||
healthRemainingAccounts.push(
|
healthRemainingAccounts.push(
|
||||||
...mintInfos.map((mintInfo) => mintInfo.firstBank()),
|
...mintInfos.map((mintInfo) => mintInfo.firstBank()),
|
||||||
);
|
);
|
||||||
|
@ -2612,48 +2618,58 @@ export class MangoClient {
|
||||||
);
|
);
|
||||||
|
|
||||||
// insert any extra perp markets in the free perp position slots
|
// insert any extra perp markets in the free perp position slots
|
||||||
const perpPositions = [...mangoAccount.perps];
|
const perpPositionIndices = mangoAccount.perps.map((p) => p.marketIndex);
|
||||||
for (const perpMarket of perpMarkets) {
|
for (const perpMarket of perpMarkets) {
|
||||||
const perpPositionExists = perpPositions.find(
|
const perpPositionExists =
|
||||||
(p) => p.marketIndex === perpMarket.perpMarketIndex,
|
perpPositionIndices.indexOf(perpMarket.perpMarketIndex) > 0;
|
||||||
);
|
|
||||||
if (!perpPositionExists) {
|
if (!perpPositionExists) {
|
||||||
const perpPosition = perpPositions.find((perp) => !perp.isActive());
|
const inactivePerpPosition = perpPositionIndices.find(
|
||||||
if (perpPosition) {
|
(perpIdx) => perpIdx === PerpPosition.PerpMarketIndexUnset,
|
||||||
perpPosition.marketIndex = perpMarket.perpMarketIndex;
|
);
|
||||||
|
if (inactivePerpPosition) {
|
||||||
|
perpPositionIndices[inactivePerpPosition] =
|
||||||
|
perpMarket.perpMarketIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const allPerpMarkets = perpPositions
|
const allPerpMarkets = perpPositionIndices
|
||||||
.filter((perp) => perp.isActive())
|
.filter((perpIdx) => perpIdx !== PerpPosition.PerpMarketIndexUnset)
|
||||||
.map((perp) => group.getPerpMarketByMarketIndex(perp.marketIndex)!);
|
.map((perpIdx) => group.getPerpMarketByMarketIndex(perpIdx)!);
|
||||||
healthRemainingAccounts.push(
|
healthRemainingAccounts.push(
|
||||||
...allPerpMarkets.map((perp) => perp.publicKey),
|
...allPerpMarkets.map((perp) => perp.publicKey),
|
||||||
);
|
);
|
||||||
healthRemainingAccounts.push(...allPerpMarkets.map((perp) => perp.oracle));
|
healthRemainingAccounts.push(...allPerpMarkets.map((perp) => perp.oracle));
|
||||||
|
|
||||||
// insert any extra open orders accounts in the cooresponding free serum market slot
|
// insert any extra open orders accounts in the cooresponding free serum market slot
|
||||||
const serumOpenOrders = [...mangoAccount.serum3];
|
const serumPositionIndices = mangoAccount.serum3.map((s) => ({
|
||||||
|
marketIndex: s.marketIndex,
|
||||||
|
openOrders: s.openOrders,
|
||||||
|
}));
|
||||||
for (const [serum3Market, openOrderPk] of openOrdersForMarket) {
|
for (const [serum3Market, openOrderPk] of openOrdersForMarket) {
|
||||||
const ooPositionExists = serumOpenOrders.find(
|
const ooPositionExists =
|
||||||
(oo) => oo.marketIndex === serum3Market.marketIndex,
|
serumPositionIndices.findIndex(
|
||||||
);
|
(i) => i.marketIndex === serum3Market.marketIndex,
|
||||||
|
) > 0;
|
||||||
if (!ooPositionExists) {
|
if (!ooPositionExists) {
|
||||||
const serum3Order = serumOpenOrders.find(
|
const inactiveSerumPosition = serumPositionIndices.find(
|
||||||
(serumOrder) => !serumOrder.isActive(),
|
(serumPos) =>
|
||||||
|
serumPos.marketIndex === Serum3Orders.Serum3MarketIndexUnset,
|
||||||
);
|
);
|
||||||
if (serum3Order) {
|
if (inactiveSerumPosition) {
|
||||||
serum3Order.marketIndex = serum3Market.marketIndex;
|
inactiveSerumPosition.marketIndex = serum3Market.marketIndex;
|
||||||
serum3Order.openOrders = openOrderPk;
|
inactiveSerumPosition.openOrders = openOrderPk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
healthRemainingAccounts.push(
|
healthRemainingAccounts.push(
|
||||||
...serumOpenOrders
|
...serumPositionIndices
|
||||||
.filter((serum3Account) => serum3Account.isActive())
|
.filter(
|
||||||
.map((serum3Account) => serum3Account.openOrders),
|
(serumPosition) =>
|
||||||
|
serumPosition.marketIndex !== Serum3Orders.Serum3MarketIndexUnset,
|
||||||
|
)
|
||||||
|
.map((serumPosition) => serumPosition.openOrders),
|
||||||
);
|
);
|
||||||
|
|
||||||
// debugHealthAccounts(group, mangoAccount, healthRemainingAccounts);
|
// debugHealthAccounts(group, mangoAccount, healthRemainingAccounts);
|
||||||
|
|
Loading…
Reference in New Issue