const csvToJson = require('convert-csv-to-json') const converter = require('json-2-csv') const fs = require('fs') const BN = require('bignumber.js') const coin = process.argv[2] const pre2022 = csvToJson.fieldDelimiter(',').getJsonFromCsv(`./${coin}.csv`) const lots = [] const handleBuy = (lot) => { lot.Remaining = new BN(lot.ReceivedQuantity) lots.push(lot) } const handleTrade = (trade) => { if (trade.ReceivedCurrency === coin) return handleBuy(trade) consumeLots(new BN(trade.SentQuantity)) } const consumeLots = (amount) => { for (let i = lots.length - 1; i >= 0; i--) { const lot = lots[i] if (!lot.Remaining) continue if (lot.Remaining.gt(amount)) { lot.Remaining = lot.Remaining.minus(amount) return } else { amount = amount.minus(lot.Remaining) lot.Remaining = 0 return consumeLots(amount) } } } pre2022.forEach(tx => { if (tx.Ignored || tx.Margin) return switch (tx.Type) { case 'Buy': case 'Receive': handleBuy(tx) break case 'Sell': case 'Send': consumeLots(new BN(tx.SentQuantity)) break case 'Trade': handleTrade(tx) break case 'Transfer': break } if (tx.FeeCurrency === coin) consumeLots(new BN(tx.FeeAmount)) }) const remaining = lots .filter(lot => !!lot.Remaining) .map(lot => { return { Date: lot.Date, Asset: coin, Credit: lot.Remaining.toFixed(8), Debit: '', Price: new BN(lot['ReceivedCostBasis(USD)']).div(lot.ReceivedQuantity).toFixed(4), Original: lot.ReceivedQuantity, } } ) converter.json2csv(remaining).then(csv => fs.appendFileSync(`./${coin}-lots.csv`, csv) );