error logging + patching spot market names for URL friendliness
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
parent
9a7004025b
commit
e41ffe8fec
|
@ -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;
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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],
|
||||||
});
|
});
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>(
|
||||||
|
|
|
@ -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],
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue