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