Skip to content

Commit

Permalink
Merge pull request #791 from ExchangeUnion/listTrades-grpc
Browse files Browse the repository at this point in the history
feat: listtrades grpc command #667
  • Loading branch information
sangaman authored Aug 20, 2019
2 parents adb8b14 + 740b174 commit 608a176
Show file tree
Hide file tree
Showing 13 changed files with 1,019 additions and 1 deletion.
53 changes: 53 additions & 0 deletions docs/api.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 53 additions & 0 deletions lib/cli/commands/listtrades.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { Arguments } from 'yargs';
import { callback, loadXudClient } from '../command';
import { ListTradesRequest, ListTradesResponse, Trade } from '../../proto/xudrpc_pb';
import Table, { HorizontalTable } from 'cli-table3';
import colors from 'colors/safe';
import { satsToCoinsStr } from '../utils';

const HEADERS = [
colors.blue('Trading Pair'),
colors.blue('Trade Quantity'),
colors.blue('Price'),
colors.blue('Order Type'),
];

const displayTrades = (trades: ListTradesResponse.AsObject) => {
const table = new Table({ head: HEADERS }) as HorizontalTable;
trades.tradesList.forEach((trade: Trade.AsObject) => {
const type = trade.makerOrder ? 'maker' : 'taker';
let price = 0;
if (trade.makerOrder) {
price = trade.makerOrder.price;
} else if (trade.takerOrder) {
price = trade.takerOrder.price;
}

table.push([
trade.pairId,
satsToCoinsStr(trade.quantity),
parseFloat(price.toFixed(5)),
type,
]);
});
console.log(colors.underline(colors.bold('\Trades:')));
console.log(table.toString());
};

export const command = 'listtrades [limit]';

export const describe = 'list completed trades';

export const builder = {
limit: {
description: 'the maximum number of trades to display',
type: 'number',
default: 15,
},
};

export const handler = (argv: Arguments) => {
const request = new ListTradesRequest();
request.setLimit(argv.limit);
loadXudClient(argv).listTrades(request, callback(argv, displayTrades));
};
48 changes: 48 additions & 0 deletions lib/grpc/GrpcService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { errorCodes as lndErrorCodes } from '../lndclient/errors';
import { LndInfo } from '../lndclient/types';
import { SwapSuccess, SwapFailure } from '../swaps/types';
import { SwapFailureReason } from '../constants/enums';
import { TradeInstance, OrderInstance } from '../db/types';

/**
* Creates an xudrpc Order message from an [[Order]].
Expand Down Expand Up @@ -69,6 +70,26 @@ const createSwapFailure = (swapFailure: SwapFailure) => {
return grpcSwapFailure;
};

/**
* Creates an xudrpc Order from OrderInstance.
*/
const getGrpcOrderFromOrderInstance = (order: OrderInstance) => {
const grpcOrder = new xudrpc.Order();
grpcOrder.setCreatedAt(order.createdAt);
grpcOrder.setId(order.id);
grpcOrder.setIsOwnOrder(order.nodeId === undefined);
if (order.localId) {
grpcOrder.setLocalId(order.localId);
}
grpcOrder.setPairId(order.pairId);
// TODO: set peer pub key if order.nodeId has a value
if (order.price) {
grpcOrder.setPrice(order.price);
}
grpcOrder.setSide(order.isBuy ? xudrpc.OrderSide.BUY : xudrpc.OrderSide.SELL);
return grpcOrder;
};

/**
* Creates an xudrpc PlaceOrderResponse message from a [[PlaceOrderResult]].
*/
Expand Down Expand Up @@ -503,6 +524,33 @@ class GrpcService {
}
}

/**
* See [[Service.listTrades]]
*/
public listTrades: grpc.handleUnaryCall<xudrpc.ListTradesRequest, xudrpc.ListTradesResponse> = async (call, callback) => {
try {
const trades = await this.service.listTrades(call.request.toObject());
const response = new xudrpc.ListTradesResponse();
const tradesList: xudrpc.Trade[] = [];
await Promise.all(trades.map(async (trade: TradeInstance) => {
const grpcTrade = new xudrpc.Trade();
const makerOrder = await trade.getMakerOrder();
const takerOrder = await trade.getTakerOrder();
grpcTrade.setQuantity(trade.quantity);
grpcTrade.setRHash(trade.rHash ? trade.rHash : '');
grpcTrade.setMakerOrder(getGrpcOrderFromOrderInstance(makerOrder!));
grpcTrade.setTakerOrder(takerOrder ? getGrpcOrderFromOrderInstance(takerOrder) : undefined);
grpcTrade.setPairId(makerOrder!.pairId);
tradesList.push(grpcTrade);
}));

response.setTradesList(tradesList);
callback(null, response);
} catch (err) {
callback(this.getGrpcError(err), null);
}
}

/**
* See [[Service.listPeers]]
*/
Expand Down
8 changes: 8 additions & 0 deletions lib/orderbook/OrderBook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,14 @@ class OrderBook extends EventEmitter {
return currencyInstance ? currencyInstance.toJSON() : undefined;
}

/**
* Gets all trades or a limited number of trades from the database.
*/
public getTrades = async (limit?: number) => {
const response = await this.repository.getTrades(limit);
return response;
}

/**
* Get lists of buy and sell orders of peers.
*/
Expand Down
8 changes: 8 additions & 0 deletions lib/orderbook/OrderBookRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,14 @@ class OrderbookRepository {
public addTrade = (trade: db.TradeFactory) => {
return this.models.Trade.create(trade);
}

public getTrades = (limit?: number): Bluebird<db.TradeInstance[]> => {
if (limit) {
return this.models.Trade.findAll({ limit, order: [['createdAt', 'DESC']] });
} else {
return this.models.Trade.findAll({ order: [['createdAt', 'DESC']] });
}
}
}

export default OrderbookRepository;
2 changes: 1 addition & 1 deletion lib/proto/xudp2p_grpc_pb.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

73 changes: 73 additions & 0 deletions lib/proto/xudrpc.swagger.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions lib/proto/xudrpc_grpc_pb.d.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 608a176

Please sign in to comment.