initial commit

This commit is contained in:
Matt Hill
2023-07-01 17:33:43 -06:00
commit 0c7e6ac609
8 changed files with 538 additions and 0 deletions

77
lifo-conversion/index.js Normal file
View 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)
);