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 utxos = [] const handleBuy = (utxo) => { utxo.Remaining = new BN(utxo.ReceivedQuantity) utxos.push(utxo) } const handleTrade = (trade) => { if (trade.ReceivedCurrency === coin) return handleBuy(trade) consumeUtxos(new BN(trade.SentQuantity)) } const consumeUtxos = (amount) => { for (let i = utxos.length - 1; i >= 0; i--) { const utxo = utxos[i] if (!utxo.Remaining) continue if (utxo.Remaining.gt(amount)) { utxo.Remaining = utxo.Remaining.minus(amount) return } else { amount = amount.minus(utxo.Remaining) utxo.Remaining = 0 return consumeUtxos(amount) } } } pre2022.forEach(tx => { if (tx.Ignored || tx.Margin) return switch (tx.Type) { case 'Buy': case 'Receive': handleBuy(tx) break case 'Sell': case 'Send': consumeUtxos(new BN(tx.SentQuantity)) break case 'Trade': handleTrade(tx) break case 'Transfer': break } if (tx.FeeCurrency === coin) consumeUtxos(new BN(tx.FeeAmount)) }) const remaining = utxos .filter(utxo => !!utxo.Remaining) .map(utxo => { return { Date: utxo.Date, Asset: coin, Credit: utxo.Remaining.toFixed(8), Debit: '', Price: new BN(utxo['ReceivedCostBasis(USD)']).div(utxo.ReceivedQuantity).toFixed(4), Original: utxo.ReceivedQuantity, } } ) converter.json2csv(remaining).then(csv => fs.appendFileSync(`./${coin}-utxos.csv`, csv) );