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, 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(