diff --git a/src/parsers/trades/index.ts b/src/parsers/trades/index.ts index 30b720d..186db73 100644 --- a/src/parsers/trades/index.ts +++ b/src/parsers/trades/index.ts @@ -6,6 +6,7 @@ import geminiParser from './gemini'; import krakenParser from './kraken'; import poloniexParser from './poloniex'; import revolutParser from './revolut'; +import viteParser from './vite' const parserMapping: {[key in EXCHANGES]: any} = { [EXCHANGES.Binance]: binanceParser, @@ -14,6 +15,7 @@ const parserMapping: {[key in EXCHANGES]: any} = { [EXCHANGES.Kraken]: krakenParser, [EXCHANGES.Poloniex]: poloniexParser, [EXCHANGES.Revolut]: revolutParser, + [EXCHANGES.Vite]: viteParser, } export default async function processTradesImport(importDetails: IImport): Promise { diff --git a/src/parsers/trades/vite/index.ts b/src/parsers/trades/vite/index.ts new file mode 100644 index 0000000..e8cb8e8 --- /dev/null +++ b/src/parsers/trades/vite/index.ts @@ -0,0 +1,80 @@ +import { getCSVData } from '../../'; +import { EXCHANGES, IImport, IPartialTrade, ITrade } from '../../../types'; +import { createDateAsUTC, createID } from '../../utils'; + +enum ViteOrderSide { + SELL = 'SELL ORDER', + BUY = 'BUY ORDER', +} + +interface IVite { + address: string; + orderId: string; + symbol: string; + tradeTokenSymbol: string; + quoteTokenSymbol: string; + side: string; + price: string; + quantity: string; + amount: string; + executedQuantity: string; + executedAmount: string; + executedPercent: string; + executedAvgPrice: string; + fee: string; + status: string; + type: string; + createTime: string; + dt: string; +} + +export default async function processData(importDetails: IImport): Promise { + const data: IVite[] = await getCSVData(importDetails.data) as IVite[]; + const internalFormat: ITrade[] = []; + for (const trade of data) { + const tradeToAdd: IPartialTrade = { + date : createDateAsUTC(new Date(parseInt(trade.createTime)*1000)).getTime(), + exchange : EXCHANGES.Vite, + exchangeID : trade.orderId, + }; + switch (trade.status) { + case 'Filled': { + switch (trade.side.toUpperCase()) { + case ViteOrderSide.BUY: { + tradeToAdd.boughtCurrency = trade.tradeTokenSymbol.split('-')[0]; + tradeToAdd.soldCurrency = trade.quoteTokenSymbol.split('-')[0]; + tradeToAdd.amountSold = parseFloat(trade.executedAmount); + tradeToAdd.rate = parseFloat(trade.executedAvgPrice); + break; + } + case ViteOrderSide.SELL: { + tradeToAdd.soldCurrency = trade.tradeTokenSymbol.split('-')[0]; + tradeToAdd.boughtCurrency = trade.quoteTokenSymbol.split('-')[0]; + tradeToAdd.amountSold = parseFloat(trade.executedQuantity); + tradeToAdd.rate = 1 / parseFloat(trade.executedAvgPrice); + break; + } + default: { + console.error(`Error parsing ${tradeToAdd.exchange} trade. + Unknown side ${trade.side}`); + continue; + } + } + tradeToAdd.ID = createID(tradeToAdd); + internalFormat.push(tradeToAdd as ITrade); + break; + } + case 'Cancelled': { + console.log(`Skipping ${tradeToAdd.exchange} trade. + with status: ${trade.status}`) + break; + } + default: { + console.error(`Error parsing ${tradeToAdd.exchange} trade. + Unknown status ${trade.status}`); + break; + } + } + } + return internalFormat; +} diff --git a/src/types/locations.ts b/src/types/locations.ts index c0053d4..01846c7 100644 --- a/src/types/locations.ts +++ b/src/types/locations.ts @@ -7,6 +7,7 @@ export enum EXCHANGES { Kraken = 'KRAKEN', Binance = 'BINANCE', Revolut = 'REVOLUT', + Vite = 'VITE', } export enum IncomeImportTypes { @@ -20,4 +21,5 @@ export enum ExchangesTradeHeaders { KRAKEN = '85bf27e799cc0a30fe5b201cd6a4724e4a52feb433f41a1e8b046924e3bf8dc5', BINANCE = '4d0d5df894fe488872e513f6148dfa14ff29272e759b7fb3c86d264687a7cf99', REVOLUT = 'ef10a780b82fdd31bb5b5f4f21eb7332c46b324513ab15418448f360f268e37c', + VITE = 'ec54965569d5c6da1338697a73711c0ecbfc54e7106d64e259dc430ff2766cc3', }