From 6f5e917f4b43f253dd7977074c82051490f816fc Mon Sep 17 00:00:00 2001 From: Zahrun <10415894+Zahrun@users.noreply.github.com> Date: Sun, 18 Dec 2022 12:56:06 +0100 Subject: [PATCH] feat: support KuCoin trades import --- components/TradesTable/index.tsx | 2 ++ src/parsers/trades/index.ts | 2 ++ src/parsers/trades/kucoin/index.ts | 53 ++++++++++++++++++++++++++++++ src/types/locations.ts | 4 ++- src/types/trade.ts | 2 ++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/parsers/trades/kucoin/index.ts diff --git a/components/TradesTable/index.tsx b/components/TradesTable/index.tsx index c92de882..d244c28d 100644 --- a/components/TradesTable/index.tsx +++ b/components/TradesTable/index.tsx @@ -55,6 +55,7 @@ export class TradesTable extends React.Component [ @@ -66,6 +67,7 @@ export class TradesTable extends React.Component{trade.boughtCurrency}, {(trade.amountSold / trade.rate).toFixed(8)}, {`${trade.transactionFee} ${trade.transactionFeeCurrency}`}, + {`${trade.tradeFee} ${trade.tradeFeeCurrency}`}, , ])} /> diff --git a/src/parsers/trades/index.ts b/src/parsers/trades/index.ts index 30b720d4..24ae4814 100644 --- a/src/parsers/trades/index.ts +++ b/src/parsers/trades/index.ts @@ -2,6 +2,7 @@ import { EXCHANGES, ExchangesTradeHeaders, IImport, ITrade } from '@types'; import * as crypto from 'crypto'; import binanceParser from './binance'; import bittrexParser from './bittrex'; +import kuCoinParser from './kucoin' import geminiParser from './gemini'; import krakenParser from './kraken'; import poloniexParser from './poloniex'; @@ -10,6 +11,7 @@ import revolutParser from './revolut'; const parserMapping: {[key in EXCHANGES]: any} = { [EXCHANGES.Binance]: binanceParser, [EXCHANGES.Bittrex]: bittrexParser, + [EXCHANGES.KuCoin]: kuCoinParser, [EXCHANGES.Gemini]: geminiParser, [EXCHANGES.Kraken]: krakenParser, [EXCHANGES.Poloniex]: poloniexParser, diff --git a/src/parsers/trades/kucoin/index.ts b/src/parsers/trades/kucoin/index.ts new file mode 100644 index 00000000..2289fb28 --- /dev/null +++ b/src/parsers/trades/kucoin/index.ts @@ -0,0 +1,53 @@ +import { getCSVData } from '../../'; +import { EXCHANGES, IImport, IPartialTrade, ITrade } from '../../../types'; +import { createDateAsUTC, createID } from '../../utils'; + +enum KuCoinTradeDirection { + SELL = 'SELL', + BUY = 'BUY', +} + +interface IKuCoin { + user_id: string; + trade_id: string; + symbol: string; + order_type: string; + deal_price: string; + amount: string; + direction: string; + funds: string; + fee_currency: string; + fee: string; + created_at: string; + created_date: string; +} + +export default async function processData(importDetails: IImport): Promise { + const data: IKuCoin[] = await getCSVData(importDetails.data) as IKuCoin[]; + const internalFormat: ITrade[] = []; + for (const trade of data) { + const tradeToAdd: IPartialTrade = { + date : createDateAsUTC(new Date(parseInt(trade.created_at)*1000)).getTime(), + exchange : EXCHANGES.KuCoin, + exchangeID : trade.trade_id, + }; + if (trade.direction.toUpperCase() === KuCoinTradeDirection.BUY) { + [tradeToAdd.boughtCurrency, tradeToAdd.soldCurrency] = trade.symbol.split('-'); + tradeToAdd.amountSold = parseFloat(trade.funds); + tradeToAdd.rate = parseFloat(trade.deal_price); + } else if (trade.direction.toUpperCase() === KuCoinTradeDirection.SELL) { + [tradeToAdd.soldCurrency, tradeToAdd.boughtCurrency] = trade.symbol.split('-'); + tradeToAdd.amountSold = parseFloat(trade.amount); + tradeToAdd.rate = 1 / parseFloat(trade.deal_price); + } else { + console.error(`Error parsing ${tradeToAdd.exchange} trade. +Unknown direction ${trade.direction}`); + continue; + } + tradeToAdd.tradeFee = parseFloat(trade.fee); + tradeToAdd.tradeFeeCurrency = trade.fee_currency; + tradeToAdd.ID = createID(tradeToAdd); + internalFormat.push(tradeToAdd as ITrade); + } + return internalFormat; +} diff --git a/src/types/locations.ts b/src/types/locations.ts index c0053d4b..f9335963 100644 --- a/src/types/locations.ts +++ b/src/types/locations.ts @@ -2,7 +2,8 @@ export type Location = EXCHANGES | string; export enum EXCHANGES { Bittrex = 'BITTREX', - Gemini= 'GEMINI', + Gemini = 'GEMINI', + KuCoin = 'KUCOIN', Poloniex = 'POLONIEX', Kraken = 'KRAKEN', Binance = 'BINANCE', @@ -16,6 +17,7 @@ export enum IncomeImportTypes { export enum ExchangesTradeHeaders { BITTREX = '07230399aaa8d1f15e88e38bd43a01c5ef1af6c1f9131668d346e196ff090d80', GEMINI = '996edee25db7f3d1dd16c83c164c6cff8c6d0f5d6b3aafe6d1700f2a830f6c9e', + KUCOIN = '8d808dd554b5b1a6cd5c7d64e900a1af7fdf47483288e4a8cc8ea121e6129cd2', POLONIEX = 'd7484d726e014edaa059c0137ac91183a7eaa9ee5d52713aa48bb4104b01afb0', KRAKEN = '85bf27e799cc0a30fe5b201cd6a4724e4a52feb433f41a1e8b046924e3bf8dc5', BINANCE = '4d0d5df894fe488872e513f6148dfa14ff29272e759b7fb3c86d264687a7cf99', diff --git a/src/types/trade.ts b/src/types/trade.ts index 07731197..1de8b25b 100644 --- a/src/types/trade.ts +++ b/src/types/trade.ts @@ -13,6 +13,8 @@ export interface ITrade { ID: string; transactionFee: number; transactionFeeCurrency: string; + tradeFee?: number; + tradeFeeCurrency?: string; } export interface ITradeWithFiatRate extends ITrade {