initial commit
This commit is contained in:
77
lifo-conversion/index.js
Normal file
77
lifo-conversion/index.js
Normal file
@@ -0,0 +1,77 @@
|
||||
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)
|
||||
);
|
||||
Reference in New Issue
Block a user