fix some todods

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2021-09-17 23:04:06 +02:00
parent ed174fb95b
commit 87a64b8843
5 changed files with 52 additions and 37 deletions

View File

@ -23,7 +23,7 @@ class CoinController implements Controller {
const coinDtos = this.mangoSimpleClient.mangoGroupConfig.tokens.map(
(tokenConfig) => {
return {
name: tokenConfig.symbol, // todo add full name to tokencofig
name: tokenConfig.symbol,
id: tokenConfig.symbol,
} as CoinDto;
}

View File

@ -1,10 +1,10 @@
export interface BadParamError {
export interface BadRequestError {
value: string;
msg: string;
param: string;
location: string;
}
export interface BadRequestError {
export interface BadRequestErrorCustom {
msg: string;
}

View File

@ -6,7 +6,7 @@ import {
} from "@blockworks-foundation/mango-client";
import { Market } from "@project-serum/serum";
import Big from "big.js";
import { BadParamError } from "dtos";
import { BadRequestError } from "dtos";
import { NextFunction, Request, Response, Router } from "express";
import { param, query, validationResult } from "express-validator";
import fetch from "node-fetch";
@ -25,11 +25,9 @@ class MarketsController implements Controller {
private initializeRoutes() {
// GET /markets
// todo fetch vs get naming
this.router.get(this.path, this.fetchMarkets);
// GET /markets/{market_name}
// todo fetch or get as prefix for methods?
this.router.get(
`${this.path}/:market_name`,
param("market_name").custom(isValidMarket),
@ -79,7 +77,7 @@ class MarketsController implements Controller {
) => {
const errors = validationResult(request);
if (!errors.isEmpty()) {
return response.status(400).json({ errors: errors.array() as BadParamError[] });
return response.status(400).json({ errors: errors.array() as BadRequestError[] });
}
const marketName = request.params.market_name;
@ -134,7 +132,6 @@ class MarketsController implements Controller {
marketConfig.name
)) as OrderInfo[][],
fetch(
// todo: replace toBase58 with toString() everywhere
`https://serum-history.herokuapp.com/trades/address/${marketConfig.publicKey.toBase58()}`
),
]);
@ -225,7 +222,7 @@ class MarketsController implements Controller {
) => {
const errors = validationResult(request);
if (!errors.isEmpty()) {
return response.status(400).json({ errors: errors.array() as BadParamError[] });
return response.status(400).json({ errors: errors.array() as BadRequestError[] });
}
const marketName = request.params.market_name;
@ -264,7 +261,7 @@ class MarketsController implements Controller {
) => {
const errors = validationResult(request);
if (!errors.isEmpty()) {
return response.status(400).json({ errors: errors.array() as BadParamError[] });
return response.status(400).json({ errors: errors.array() as BadRequestError[] });
}
const allMarketConfigs = getAllMarkets(
@ -304,7 +301,7 @@ class MarketsController implements Controller {
) => {
const errors = validationResult(request);
if (!errors.isEmpty()) {
return response.status(400).json({ errors: errors.array() as BadParamError[] }); }
return response.status(400).json({ errors: errors.array() as BadRequestError[] }); }
const marketName = request.params.market_name;
const resolution = String(request.query.resolution);
@ -397,7 +394,7 @@ export async function getVolumeForMarket(
marketConfig: MarketConfig
): Promise<Number> {
const perpVolume = await fetch(
`https://event-history-api.herokuapp.com/stats/perps/${marketConfig.publicKey.toString()}`
`https://event-history-api.herokuapp.com/stats/perps/${marketConfig.publicKey.toBase58()}`
);
const parsedPerpVolume = await perpVolume.json();
return Number(parsedPerpVolume?.data?.volume);

View File

@ -1,12 +1,12 @@
import { PerpOrder } from "@blockworks-foundation/mango-client";
import { Order } from "@project-serum/serum/lib/market";
import { BadRequestError, BadRequestErrorCustom } from "dtos";
import { NextFunction, Request, Response, Router } from "express";
import { body, query, validationResult } from "express-validator";
import Controller from "./controller.interface";
import MangoSimpleClient from "./mango.simple.client";
import { OrderInfo } from "./types";
import { isValidMarket, logger } from "./utils";
import { PerpOrder } from "@blockworks-foundation/mango-client";
import { Order } from "@project-serum/serum/lib/market";
import { NextFunction, Request, Response, Router } from "express";
import { param, query, validationResult } from "express-validator";
import { BadParamError, BadRequestError } from "dtos";
class OrdersController implements Controller {
public path = "/api/orders";
@ -25,7 +25,19 @@ class OrdersController implements Controller {
);
// POST /orders
this.router.post(this.path, this.placeOrder);
this.router.post(
this.path,
body("market").not().isEmpty().custom(isValidMarket),
body("side").not().isEmpty().isIn(["sell", "buy"]),
body("type").not().isEmpty().isIn(["limit", "market"]),
body("price").isNumeric(),
body("size").not().isEmpty().isNumeric(),
body("reduceOnly").isBoolean(),
body("ioc").isBoolean(),
body("postOnly").isBoolean(),
body("clientId").isNumeric(),
this.placeOrder
);
// // POST /orders/{order_id}/modify todo
// this.router.post(this.path, this.modifyOrder);
@ -50,7 +62,9 @@ class OrdersController implements Controller {
) => {
const errors = validationResult(request);
if (!errors.isEmpty()) {
return response.status(400).json({ errors: errors.array() as BadParamError[] });
return response
.status(400)
.json({ errors: errors.array() as BadRequestError[] });
}
const openOrders = await this.mangoSimpleClient.fetchAllBidsAndAsks(
@ -73,7 +87,7 @@ class OrdersController implements Controller {
side: perpOrder.side,
size: perpOrder.size,
status: "open",
type: undefined, // todo should this always be limit?
type: "limit",
reduceOnly: undefined,
ioc: undefined,
postOnly: undefined,
@ -115,10 +129,16 @@ class OrdersController implements Controller {
response: Response,
next: NextFunction
) => {
const errors = validationResult(request);
if (!errors.isEmpty()) {
return response
.status(400)
.json({ errors: errors.array() as BadRequestError[] });
}
const placeOrderDto = request.body as PlaceOrderDto;
logger.info("placing order...")
// todo validation on placeOrderDto
// todo validation of marketname
logger.info(`placing order`);
try {
await this.mangoSimpleClient.placeOrder(
placeOrderDto.market,
@ -135,7 +155,7 @@ class OrdersController implements Controller {
);
} catch (error) {
return response.status(400).send({
errors: [{ msg: error.message } as BadRequestError],
errors: [{ msg: error.message } as BadRequestErrorCustom],
});
}
@ -168,7 +188,7 @@ class OrdersController implements Controller {
response: Response,
next: NextFunction
) => {
// todo log info
logger.info(`cancelling all orders...`);
// todo: leads to 429 if too many orders exist, needs optimization
await this.mangoSimpleClient.cancelAllOrders();
response.send();
@ -179,8 +199,8 @@ class OrdersController implements Controller {
response: Response,
next: NextFunction
) => {
// todo log info
const orderId = request.params.order_id;
logger.info(`cancelling order with orderId ${orderId}...`);
this.mangoSimpleClient
.getOrderByOrderId(orderId)
.then((orderInfos) => {
@ -210,8 +230,8 @@ class OrdersController implements Controller {
response: Response,
next: NextFunction
) => {
// todo log info
const clientId = request.params.client_id;
logger.info(`cancelling order with clientId ${clientId}...`);
this.mangoSimpleClient
.getOrderByClientId(clientId)
.then((orderInfos) => {
@ -312,7 +332,7 @@ interface PlaceOrderDto {
reduceOnly: boolean;
ioc: boolean;
postOnly: boolean;
clientId: number; // todo: ftx uses string
clientId: number;
}
interface PlaceOrderResponseDto {

View File

@ -1,17 +1,15 @@
import { Balances } from "./types";
import { i80f48ToPercent } from "./utils";
import {
I80F48,
getTokenBySymbol,
nativeI80F48ToUi,
getTokenBySymbol, I80F48, nativeI80F48ToUi,
nativeToUi,
QUOTE_INDEX,
QUOTE_INDEX
} from "@blockworks-foundation/mango-client";
import { Market, OpenOrders } from "@project-serum/serum";
import { OpenOrders } from "@project-serum/serum";
import Controller from "controller.interface";
import { NextFunction, Request, Response, Router } from "express";
import { sumBy } from "lodash";
import MangoSimpleClient from "mango.simple.client";
import { Balances } from "./types";
import { i80f48ToPercent } from "./utils";
class WalletController implements Controller {
public path = "/api/wallet";
@ -22,10 +20,10 @@ class WalletController implements Controller {
}
private initializeRoutes() {
this.router.get(`${this.path}/balances`, this.getBalances);
this.router.get(`${this.path}/balances`, this.fetchBalances);
}
private getBalances = async (
private fetchBalances = async (
request: Request,
response: Response,
next: NextFunction