add account info

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2021-11-17 17:46:42 +01:00
parent 23c82b747d
commit 8d65d476e5
6 changed files with 142 additions and 616 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
.idea
__pycache__/
mango-service-v3/node_modules
mango-service-v3/dist
mango-service-v3/run-dev-server.sh

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,85 @@
import Controller from "./controller.interface";
import { NextFunction, Request, Response, Router } from "express";
import MangoSimpleClient from "./mango.simple.client";
import { patchInternalMarketName } from "./utils";
import {
getAllMarkets,
MarketConfig,
} from "@blockworks-foundation/mango-client";
/**
* Houses every non-ftx style, mango specific information
*/
export class AccountController implements Controller {
public path = "/api/mango";
public router = Router();
constructor(public mangoSimpleClient: MangoSimpleClient) {
this.initializeRoutes();
}
private initializeRoutes() {
// GET /account
this.router.get(`${this.path}/account`, this.fetchMangoAccount);
}
private fetchMangoAccount = async (
request: Request,
response: Response,
next: NextFunction
) => {
const accountInternalDto = this.fetchAccountInternal();
response.send({
success: true,
result: accountInternalDto,
} as AccountDto);
};
private fetchAccountInternal(): AccountInternalDto {
let allMarketConfigs = getAllMarkets(
this.mangoSimpleClient.mangoGroupConfig
);
const spotOpenOrdersAccountDtos = allMarketConfigs
// filter only spot markets
.filter((marketConfig) => !marketConfig.name.includes("PERP"))
.map((spotMarketConfig) =>
this.getSpotOpenOrdersAccountForMarket(spotMarketConfig)
)
// filter markets where a spotOpenOrdersAccount exists
.filter(
(spotOpenOrdersAccount) => spotOpenOrdersAccount.publicKey != null
);
return {
spotOpenOrdersAccounts: spotOpenOrdersAccountDtos,
} as AccountInternalDto;
}
private getSpotOpenOrdersAccountForMarket(
marketConfig: MarketConfig
): SpotOpenOrdersAccountDto {
const spotOpenOrdersAccount =
this.mangoSimpleClient.getSpotOpenOrdersAccount(marketConfig);
return {
name: patchInternalMarketName(marketConfig.name),
publicKey: spotOpenOrdersAccount
? spotOpenOrdersAccount.toBase58()
: null,
} as SpotOpenOrdersAccountDto;
}
}
interface AccountDto {
success: boolean;
result: AccountInternalDto;
}
interface AccountInternalDto {
spotOpenOrdersAccounts: SpotOpenOrdersAccountDto[];
}
interface SpotOpenOrdersAccountDto {
name: string;
publicKey: string;
}

View File

@ -8,6 +8,7 @@ import MangoSimpleClient from "./mango.simple.client";
import MarketsController from "./markets.controller";
import OrdersController from "./orders.controller";
import WalletController from "./wallet.controller";
import { AccountController } from "./account.controller";
class App {
public app: express.Application;
@ -26,6 +27,7 @@ class App {
new OrdersController(this.mangoSimpleClient),
new MarketsController(this.mangoSimpleClient),
new PositionsController(this.mangoSimpleClient),
new AccountController(this.mangoSimpleClient),
]);
});
}

View File

@ -253,6 +253,19 @@ class MangoSimpleClient {
});
}
public getSpotOpenOrdersAccount(
marketConfig: MarketConfig
): PublicKey | null {
// not loaded by default, load explicitly
this.mangoAccount.loadOpenOrders(
this.connection,
new PublicKey(this.mangoGroupConfig.serumProgramId)
);
const spotOpenOrdersAccount =
this.mangoAccount.spotOpenOrdersAccounts[marketConfig.marketIndex];
return spotOpenOrdersAccount ? spotOpenOrdersAccount.publicKey : null;
}
public async fetchAllSpotFills(): Promise<any[]> {
const allMarketConfigs = getAllMarkets(this.mangoGroupConfig);
const allMarkets = await this.fetchAllMarkets();

2
py/poetry.toml Normal file
View File

@ -0,0 +1,2 @@
[virtualenvs]
in-project = true