78 lines
1.6 KiB
JavaScript
78 lines
1.6 KiB
JavaScript
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)
|
|
);
|