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

View File

@ -1,6 +1,7 @@
import bodyParser from "body-parser"; import bodyParser from "body-parser";
import Controller from "controller.interface"; import Controller from "controller.interface";
import express from "express"; import express from "express";
import { logger } from "./utils";
import AccountController from "./account.controller"; import AccountController from "./account.controller";
import CoinController from "./coin.controller"; import CoinController from "./coin.controller";
import MangoSimpleClient from "./mango.simple.client"; import MangoSimpleClient from "./mango.simple.client";
@ -36,7 +37,9 @@ class App {
} }
public listen() { 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() { public getServer() {

View File

@ -14,7 +14,12 @@ import fetch from "node-fetch";
import { OrderInfo } from "types"; import { OrderInfo } from "types";
import Controller from "./controller.interface"; import Controller from "./controller.interface";
import MangoSimpleClient from "./mango.simple.client"; import MangoSimpleClient from "./mango.simple.client";
import { isValidMarket } from "./utils"; import {
isValidMarket,
logger,
patchExternalMarketName,
patchInternalMarketName,
} from "./utils";
class MarketsController implements Controller { class MarketsController implements Controller {
public path = "/api/markets"; public path = "/api/markets";
@ -73,6 +78,7 @@ class MarketsController implements Controller {
} as MarketsDto); } as MarketsDto);
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });
@ -91,7 +97,7 @@ class MarketsController implements Controller {
.json({ errors: errors.array() as BadRequestError[] }); .json({ errors: errors.array() as BadRequestError[] });
} }
const marketName = request.params.market_name; const marketName = patchExternalMarketName(request.params.market_name);
this.fetchMarketsInternal(marketName) this.fetchMarketsInternal(marketName)
.then((marketsDto) => { .then((marketsDto) => {
@ -101,6 +107,7 @@ class MarketsController implements Controller {
} as MarketsDto); } as MarketsDto);
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });
@ -209,7 +216,7 @@ class MarketsController implements Controller {
} }
return { return {
name: marketConfig.name, name: patchInternalMarketName(marketConfig.name),
baseCurrency: marketConfig.baseSymbol, baseCurrency: marketConfig.baseSymbol,
quoteCurrency: "USDC", quoteCurrency: "USDC",
quoteVolume24h: volume, quoteVolume24h: volume,
@ -245,7 +252,7 @@ class MarketsController implements Controller {
.json({ errors: errors.array() as BadRequestError[] }); .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; const depth = Number(request.query.depth) || 20;
this.getOrderBookInternal(marketName, depth) this.getOrderBookInternal(marketName, depth)
@ -259,6 +266,7 @@ class MarketsController implements Controller {
}); });
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });
@ -304,7 +312,7 @@ class MarketsController implements Controller {
const allMarketConfigs = getAllMarkets( const allMarketConfigs = getAllMarkets(
this.mangoSimpleClient.mangoGroupConfig this.mangoSimpleClient.mangoGroupConfig
); );
const marketName = request.params.market_name; const marketName = patchExternalMarketName(request.params.market_name);
const marketPk = allMarketConfigs.filter( const marketPk = allMarketConfigs.filter(
(marketConfig) => marketConfig.name === marketName (marketConfig) => marketConfig.name === marketName
)[0].publicKey; )[0].publicKey;
@ -317,6 +325,7 @@ class MarketsController implements Controller {
}); });
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });
@ -355,7 +364,7 @@ class MarketsController implements Controller {
.json({ errors: errors.array() as BadRequestError[] }); .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 resolution = String(request.query.resolution);
const fromEpochS = Number(request.query.start_time); const fromEpochS = Number(request.query.start_time);
const toEpochS = Number(request.query.end_time); const toEpochS = Number(request.query.end_time);
@ -379,6 +388,7 @@ class MarketsController implements Controller {
}); });
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], 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 Controller from "./controller.interface";
import MangoSimpleClient from "./mango.simple.client"; import MangoSimpleClient from "./mango.simple.client";
import { OrderInfo } from "./types"; import { OrderInfo } from "./types";
import { isValidMarket, logger } from "./utils"; import {
isValidMarket,
logger,
patchExternalMarketName,
patchInternalMarketName,
} from "./utils";
class OrdersController implements Controller { class OrdersController implements Controller {
public path = "/api/orders"; public path = "/api/orders";
@ -68,7 +73,7 @@ class OrdersController implements Controller {
} }
const marketName = request.query.market const marketName = request.query.market
? String(request.query.market) ? patchExternalMarketName(String(request.query.market))
: undefined; : undefined;
this.getOpenOrdersInternal(marketName) this.getOpenOrdersInternal(marketName)
@ -76,6 +81,7 @@ class OrdersController implements Controller {
return response.send({ success: true, result: orderDtos } as OrdersDto); return response.send({ success: true, result: orderDtos } as OrdersDto);
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });
@ -99,7 +105,7 @@ class OrdersController implements Controller {
this.mangoSimpleClient this.mangoSimpleClient
.placeOrder( .placeOrder(
placeOrderDto.market, patchExternalMarketName(placeOrderDto.market),
placeOrderDto.type, placeOrderDto.type,
placeOrderDto.side, placeOrderDto.side,
placeOrderDto.size, placeOrderDto.size,
@ -115,6 +121,7 @@ class OrdersController implements Controller {
return response.status(200).send(); return response.status(200).send();
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });
@ -133,6 +140,7 @@ class OrdersController implements Controller {
return response.status(200).send(); return response.status(200).send();
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });
@ -157,16 +165,16 @@ class OrdersController implements Controller {
this.mangoSimpleClient this.mangoSimpleClient
.cancelOrder(orderInfos[0]) .cancelOrder(orderInfos[0])
.then(() => response.send()) .then(() => response.send())
.catch(() => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response return response
.status(500) .status(500)
.json({ errors: [{ msg: "Unexpected error occured!" }] }); .json({ errors: [{ msg: error.message }] });
}); });
}) })
.catch(() => { .catch((error) => {
return response logger.error(`message - ${error.message}, ${error.stack}`);
.status(500) return response.status(500).json({ errors: [{ msg: error.message }] });
.json({ errors: [{ msg: "Unexpected error occured!" }] });
}); });
}; };
@ -188,16 +196,16 @@ class OrdersController implements Controller {
this.mangoSimpleClient this.mangoSimpleClient
.cancelOrder(orderInfos[0]) .cancelOrder(orderInfos[0])
.then(() => response.send()) .then(() => response.send())
.catch(() => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response return response
.status(500) .status(500)
.json({ errors: [{ msg: "Unexpected error occured!" }] }); .json({ errors: [{ msg: error.message }] });
}); });
}) })
.catch(() => { .catch((error) => {
return response logger.error(`message - ${error.message}, ${error.stack}`);
.status(500) return response.status(500).json({ errors: [{ msg: error.message }] });
.json({ errors: [{ msg: "Unexpected error occured!" }] });
}); });
}; };
@ -213,9 +221,9 @@ class OrdersController implements Controller {
return { return {
createdAt: new Date(perpOrder.timestamp.toNumber() * 1000), createdAt: new Date(perpOrder.timestamp.toNumber() * 1000),
filledSize: undefined, filledSize: undefined,
future: orderInfo.market.config.name, future: patchInternalMarketName(orderInfo.market.config.name),
id: perpOrder.orderId.toString(), id: perpOrder.orderId.toString(),
market: orderInfo.market.config.name, market: patchInternalMarketName(orderInfo.market.config.name),
price: perpOrder.price, price: perpOrder.price,
avgFillPrice: undefined, avgFillPrice: undefined,
remainingSize: undefined, remainingSize: undefined,
@ -237,9 +245,9 @@ class OrdersController implements Controller {
return { return {
createdAt: undefined, createdAt: undefined,
filledSize: undefined, filledSize: undefined,
future: orderInfo.market.config.name, future: patchInternalMarketName(orderInfo.market.config.name),
id: spotOrder.orderId.toString(), id: spotOrder.orderId.toString(),
market: orderInfo.market.config.name, market: patchInternalMarketName(orderInfo.market.config.name),
price: spotOrder.price, price: spotOrder.price,
avgFillPrice: undefined, avgFillPrice: undefined,
remainingSize: undefined, remainingSize: undefined,

View File

@ -30,7 +30,7 @@ const mangoGroupConfig: GroupConfig = Config.ids().groups.filter(
)[0]; )[0];
const allMarketNames = mangoGroupConfig.spotMarkets const allMarketNames = mangoGroupConfig.spotMarkets
.map((spotMarketConfig) => spotMarketConfig.name) .map((spotMarketConfig) => spotMarketConfig.baseSymbol + "-SPOT")
.concat( .concat(
mangoGroupConfig.perpMarkets.map( mangoGroupConfig.perpMarkets.map(
(perpMarketConfig) => perpMarketConfig.name (perpMarketConfig) => perpMarketConfig.name
@ -41,6 +41,20 @@ const allCoins = mangoGroupConfig.tokens.map(
(tokenConfig) => tokenConfig.symbol (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 /// general
export function zipDict<K extends string | number | symbol, V>( 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 { sumBy } from "lodash";
import MangoSimpleClient from "mango.simple.client"; import MangoSimpleClient from "mango.simple.client";
import { Balances } from "./types"; import { Balances } from "./types";
import { i80f48ToPercent, isValidCoin } from "./utils"; import {
i80f48ToPercent,
isValidCoin,
logger,
patchInternalMarketName,
} from "./utils";
class WalletController implements Controller { class WalletController implements Controller {
public path = "/api/wallet"; public path = "/api/wallet";
@ -49,6 +54,7 @@ class WalletController implements Controller {
} as BalancesDto); } as BalancesDto);
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });
@ -216,7 +222,7 @@ class WalletController implements Controller {
// append balances for base symbols // append balances for base symbols
const balanceDtos = baseBalances.map((baseBalance) => { const balanceDtos = baseBalances.map((baseBalance) => {
return { return {
coin: baseBalance.key, coin: patchInternalMarketName(baseBalance.key),
free: baseBalance.deposits.toNumber(), free: baseBalance.deposits.toNumber(),
spotBorrow: baseBalance.borrows.toNumber(), spotBorrow: baseBalance.borrows.toNumber(),
total: baseBalance.net.toNumber(), total: baseBalance.net.toNumber(),
@ -229,7 +235,9 @@ class WalletController implements Controller {
// append balance for quote symbol // append balance for quote symbol
balanceDtos.push({ balanceDtos.push({
coin: this.mangoSimpleClient.mangoGroupConfig.quoteSymbol, coin: patchInternalMarketName(
this.mangoSimpleClient.mangoGroupConfig.quoteSymbol
),
free: quoteMeta.deposits.toNumber(), free: quoteMeta.deposits.toNumber(),
spotBorrow: quoteMeta.borrows.toNumber(), spotBorrow: quoteMeta.borrows.toNumber(),
total: net.toNumber(), total: net.toNumber(),
@ -251,6 +259,7 @@ class WalletController implements Controller {
response.status(200); response.status(200);
}) })
.catch((error) => { .catch((error) => {
logger.error(`message - ${error.message}, ${error.stack}`);
return response.status(500).send({ return response.status(500).send({
errors: [{ msg: error.message } as RequestErrorCustom], errors: [{ msg: error.message } as RequestErrorCustom],
}); });