fix buildHealthRemainingAccounts to not modify the mangoAccount obj (#369)

This commit is contained in:
tylersssss 2023-01-10 10:51:03 -05:00 committed by GitHub
parent 143d90ff23
commit 75593925aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 49 additions and 33 deletions

View File

@ -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);