error logging + patching spot market names for URL friendliness

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2021-09-26 14:31:57 +02:00
parent 9a7004025b
commit e41ffe8fec
6 changed files with 82 additions and 32 deletions

View File

@ -8,6 +8,11 @@ import Controller from "controller.interface";
import { RequestErrorCustom } from "dtos";
import { NextFunction, Request, Response, Router } from "express";
import MangoSimpleClient from "mango.simple.client";
import {
logger,
patchExternalMarketName,
patchInternalMarketName,
} from "./utils";
class AccountController implements Controller {
public path = "/api/positions";
@ -32,6 +37,7 @@ class AccountController implements Controller {
response.send({ success: true, result: postionDtos } as PositionsDto);
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -127,7 +133,7 @@ class AccountController implements Controller {
cumulativeSellSize: undefined,
entryPrice,
estimatedLiquidationPrice: undefined,
future: marketConfig.name,
future: patchInternalMarketName(marketConfig.name),
initialMarginRequirement: undefined,
longOrderSize: undefined,
maintenanceMarginRequirement: undefined,
@ -194,7 +200,7 @@ interface PositionDto {
cumulativeSellSize: number;
entryPrice: number;
estimatedLiquidationPrice: number;
future: "ETH-PERP";
future: string;
initialMarginRequirement: number;
longOrderSize: number;
maintenanceMarginRequirement: number;

View File

@ -1,6 +1,7 @@
import bodyParser from "body-parser";
import Controller from "controller.interface";
import express from "express";
import { logger } from "./utils";
import AccountController from "./account.controller";
import CoinController from "./coin.controller";
import MangoSimpleClient from "./mango.simple.client";
@ -36,7 +37,9 @@ class App {
}
public listen() {
this.app.listen(process.env.PORT || 3000);
const port = process.env.PORT || 3000;
this.app.listen(port);
logger.info(`App listening on port ${port}`);
}
public getServer() {

View File

@ -14,7 +14,12 @@ import fetch from "node-fetch";
import { OrderInfo } from "types";
import Controller from "./controller.interface";
import MangoSimpleClient from "./mango.simple.client";
import { isValidMarket } from "./utils";
import {
isValidMarket,
logger,
patchExternalMarketName,
patchInternalMarketName,
} from "./utils";
class MarketsController implements Controller {
public path = "/api/markets";
@ -73,6 +78,7 @@ class MarketsController implements Controller {
} as MarketsDto);
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -91,7 +97,7 @@ class MarketsController implements Controller {
.json({ errors: errors.array() as BadRequestError[] });
}
const marketName = request.params.market_name;
const marketName = patchExternalMarketName(request.params.market_name);
this.fetchMarketsInternal(marketName)
.then((marketsDto) => {
@ -101,6 +107,7 @@ class MarketsController implements Controller {
} as MarketsDto);
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -209,7 +216,7 @@ class MarketsController implements Controller {
}
return {
name: marketConfig.name,
name: patchInternalMarketName(marketConfig.name),
baseCurrency: marketConfig.baseSymbol,
quoteCurrency: "USDC",
quoteVolume24h: volume,
@ -245,7 +252,7 @@ class MarketsController implements Controller {
.json({ errors: errors.array() as BadRequestError[] });
}
const marketName = request.params.market_name;
const marketName = patchExternalMarketName(request.params.market_name);
const depth = Number(request.query.depth) || 20;
this.getOrderBookInternal(marketName, depth)
@ -259,6 +266,7 @@ class MarketsController implements Controller {
});
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -304,7 +312,7 @@ class MarketsController implements Controller {
const allMarketConfigs = getAllMarkets(
this.mangoSimpleClient.mangoGroupConfig
);
const marketName = request.params.market_name;
const marketName = patchExternalMarketName(request.params.market_name);
const marketPk = allMarketConfigs.filter(
(marketConfig) => marketConfig.name === marketName
)[0].publicKey;
@ -317,6 +325,7 @@ class MarketsController implements Controller {
});
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -355,7 +364,7 @@ class MarketsController implements Controller {
.json({ errors: errors.array() as BadRequestError[] });
}
const marketName = request.params.market_name;
const marketName = patchExternalMarketName(request.params.market_name);
const resolution = String(request.query.resolution);
const fromEpochS = Number(request.query.start_time);
const toEpochS = Number(request.query.end_time);
@ -379,6 +388,7 @@ class MarketsController implements Controller {
});
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});

View File

@ -6,7 +6,12 @@ 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 {
isValidMarket,
logger,
patchExternalMarketName,
patchInternalMarketName,
} from "./utils";
class OrdersController implements Controller {
public path = "/api/orders";
@ -68,7 +73,7 @@ class OrdersController implements Controller {
}
const marketName = request.query.market
? String(request.query.market)
? patchExternalMarketName(String(request.query.market))
: undefined;
this.getOpenOrdersInternal(marketName)
@ -76,6 +81,7 @@ class OrdersController implements Controller {
return response.send({ success: true, result: orderDtos } as OrdersDto);
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -99,7 +105,7 @@ class OrdersController implements Controller {
this.mangoSimpleClient
.placeOrder(
placeOrderDto.market,
patchExternalMarketName(placeOrderDto.market),
placeOrderDto.type,
placeOrderDto.side,
placeOrderDto.size,
@ -115,6 +121,7 @@ class OrdersController implements Controller {
return response.status(200).send();
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -133,6 +140,7 @@ class OrdersController implements Controller {
return response.status(200).send();
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -157,16 +165,16 @@ class OrdersController implements Controller {
this.mangoSimpleClient
.cancelOrder(orderInfos[0])
.then(() => response.send())
.catch(() => {
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response
.status(500)
.json({ errors: [{ msg: "Unexpected error occured!" }] });
.json({ errors: [{ msg: error.message }] });
});
})
.catch(() => {
return response
.status(500)
.json({ errors: [{ msg: "Unexpected error occured!" }] });
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).json({ errors: [{ msg: error.message }] });
});
};
@ -188,16 +196,16 @@ class OrdersController implements Controller {
this.mangoSimpleClient
.cancelOrder(orderInfos[0])
.then(() => response.send())
.catch(() => {
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response
.status(500)
.json({ errors: [{ msg: "Unexpected error occured!" }] });
.json({ errors: [{ msg: error.message }] });
});
})
.catch(() => {
return response
.status(500)
.json({ errors: [{ msg: "Unexpected error occured!" }] });
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).json({ errors: [{ msg: error.message }] });
});
};
@ -213,9 +221,9 @@ class OrdersController implements Controller {
return {
createdAt: new Date(perpOrder.timestamp.toNumber() * 1000),
filledSize: undefined,
future: orderInfo.market.config.name,
future: patchInternalMarketName(orderInfo.market.config.name),
id: perpOrder.orderId.toString(),
market: orderInfo.market.config.name,
market: patchInternalMarketName(orderInfo.market.config.name),
price: perpOrder.price,
avgFillPrice: undefined,
remainingSize: undefined,
@ -237,9 +245,9 @@ class OrdersController implements Controller {
return {
createdAt: undefined,
filledSize: undefined,
future: orderInfo.market.config.name,
future: patchInternalMarketName(orderInfo.market.config.name),
id: spotOrder.orderId.toString(),
market: orderInfo.market.config.name,
market: patchInternalMarketName(orderInfo.market.config.name),
price: spotOrder.price,
avgFillPrice: undefined,
remainingSize: undefined,

View File

@ -30,7 +30,7 @@ const mangoGroupConfig: GroupConfig = Config.ids().groups.filter(
)[0];
const allMarketNames = mangoGroupConfig.spotMarkets
.map((spotMarketConfig) => spotMarketConfig.name)
.map((spotMarketConfig) => spotMarketConfig.baseSymbol + "-SPOT")
.concat(
mangoGroupConfig.perpMarkets.map(
(perpMarketConfig) => perpMarketConfig.name
@ -41,6 +41,20 @@ const allCoins = mangoGroupConfig.tokens.map(
(tokenConfig) => tokenConfig.symbol
);
export function patchExternalMarketName(marketName: string) {
if (marketName.includes("-SPOT")) {
marketName = marketName.replace("-SPOT", "/USDC");
}
return marketName;
}
export function patchInternalMarketName(marketName: string) {
if (marketName.includes("/USDC")) {
marketName = marketName.replace("/USDC", "-SPOT");
}
return marketName;
}
/// general
export function zipDict<K extends string | number | symbol, V>(

View File

@ -13,7 +13,12 @@ import { body } from "express-validator";
import { sumBy } from "lodash";
import MangoSimpleClient from "mango.simple.client";
import { Balances } from "./types";
import { i80f48ToPercent, isValidCoin } from "./utils";
import {
i80f48ToPercent,
isValidCoin,
logger,
patchInternalMarketName,
} from "./utils";
class WalletController implements Controller {
public path = "/api/wallet";
@ -49,6 +54,7 @@ class WalletController implements Controller {
} as BalancesDto);
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});
@ -216,7 +222,7 @@ class WalletController implements Controller {
// append balances for base symbols
const balanceDtos = baseBalances.map((baseBalance) => {
return {
coin: baseBalance.key,
coin: patchInternalMarketName(baseBalance.key),
free: baseBalance.deposits.toNumber(),
spotBorrow: baseBalance.borrows.toNumber(),
total: baseBalance.net.toNumber(),
@ -229,7 +235,9 @@ class WalletController implements Controller {
// append balance for quote symbol
balanceDtos.push({
coin: this.mangoSimpleClient.mangoGroupConfig.quoteSymbol,
coin: patchInternalMarketName(
this.mangoSimpleClient.mangoGroupConfig.quoteSymbol
),
free: quoteMeta.deposits.toNumber(),
spotBorrow: quoteMeta.borrows.toNumber(),
total: net.toNumber(),
@ -251,6 +259,7 @@ class WalletController implements Controller {
response.status(200);
})
.catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom],
});