ts client: Fix remaining accounts when opening a perp position

This commit is contained in:
Christian Kamm 2022-09-21 12:50:10 +02:00
parent 3c98a9fd0a
commit ecbd4028f7
1 changed files with 33 additions and 57 deletions

View File

@ -31,6 +31,7 @@ import {
MangoAccount,
MangoAccountData,
TokenPosition,
PerpPosition,
} from './accounts/mangoAccount';
import { StubOracle } from './accounts/oracle';
import { PerpMarket, PerpOrderType, Side } from './accounts/perp';
@ -1518,7 +1519,8 @@ export class MangoClient {
AccountRetriever.Fixed,
group,
[mangoAccount],
[],
// Settlement token bank, because a position for it may be created
[group.getFirstBankByTokenIndex(0)],
[perpMarket],
);
return await this.program.methods
@ -1930,40 +1932,29 @@ export class MangoClient {
...mintInfos.map((mintInfo) => mintInfo.oracle),
);
healthRemainingAccounts.push(
...mangoAccount.perps
.filter((perp) => perp.marketIndex !== 65535)
.map(
(perp) =>
Array.from(group.perpMarketsMap.values()).filter(
(perpMarket) => perpMarket.perpMarketIndex === perp.marketIndex,
)[0].publicKey,
),
);
healthRemainingAccounts.push(
...mangoAccount.perps
.filter((perp) => perp.marketIndex !== 65535)
.map(
(perp) =>
Array.from(group.perpMarketsMap.values()).filter(
(perpMarket) => perpMarket.perpMarketIndex === perp.marketIndex,
)[0].oracle,
),
);
const allPerpIndices = mangoAccount.perps.map((perp) => perp.marketIndex);
// insert any extra perp markets in the free perp position slots
if (perpMarkets) {
for (const perpMarket of perpMarkets) {
const alreadyAdded = mangoAccount.perps.find(
(p) => p.marketIndex === perpMarket.perpMarketIndex,
);
if (!alreadyAdded) {
if (allPerpIndices.indexOf(perpMarket.perpMarketIndex) < 0) {
allPerpIndices[
mangoAccount.perps.findIndex(
(perp, index) =>
!perp.isActive() &&
allPerpIndices[index] == PerpPosition.PerpMarketIndexUnset,
)
] = perpMarket.perpMarketIndex;
}
}
}
const allPerpMarkets = allPerpIndices
.filter((index) => index != PerpPosition.PerpMarketIndexUnset)
.map((index) => group.findPerpMarket(index)!);
healthRemainingAccounts.push(
Array.from(group.perpMarketsMap.values()).filter(
(p) => p.perpMarketIndex === perpMarket.perpMarketIndex,
)[0].publicKey,
...allPerpMarkets.map((perp) => perp.publicKey),
);
}
}
healthRemainingAccounts.push(...allPerpMarkets.map((perp) => perp.oracle));
healthRemainingAccounts.push(
...mangoAccount.serum3
@ -2010,39 +2001,24 @@ export class MangoClient {
...mintInfos.map((mintInfo) => mintInfo.oracle),
);
const perpsToAdd: PerpMarket[] = [];
let perpIndices: number[] = [];
for (const mangoAccount of mangoAccounts) {
perpsToAdd.push(
perpIndices.push(
...mangoAccount.perps
.filter((perp) => perp.marketIndex !== 65535)
.map(
(perp) =>
Array.from(group.perpMarketsMap.values()).filter(
(perpMarket) => perpMarket.perpMarketIndex === perp.marketIndex,
)[0],
),
.map((perp) => perp.marketIndex),
);
}
for (const mangoAccount of mangoAccounts) {
for (const perpMarket of perpMarkets) {
const alreadyAdded = mangoAccount.perps.find(
(p) => p.marketIndex === perpMarket.perpMarketIndex,
perpIndices.push(...perpMarkets.map((perp) => perp.perpMarketIndex));
const allPerpMarkets = [...new Set(perpIndices)].map(
(marketIndex) => group.findPerpMarket(marketIndex)!,
);
if (!alreadyAdded) {
perpsToAdd.push(
Array.from(group.perpMarketsMap.values()).filter(
(p) => p.perpMarketIndex === perpMarket.perpMarketIndex,
)[0],
);
}
}
}
// Add perp accounts
healthRemainingAccounts.push(...perpsToAdd.map((p) => p.publicKey));
healthRemainingAccounts.push(...allPerpMarkets.map((p) => p.publicKey));
// Add oracle for each perp
healthRemainingAccounts.push(...perpsToAdd.map((p) => p.oracle));
healthRemainingAccounts.push(...allPerpMarkets.map((p) => p.oracle));
for (const mangoAccount of mangoAccounts) {
healthRemainingAccounts.push(