bnb-staking-csvs-0.2.0.0: src/Console/BnbStaking/CoinTracking.hs
{-# LANGUAGE RecordWildCards #-}
{- | Generate & write/print CoinTracking Bulk Import files.
-}
module Console.BnbStaking.CoinTracking
( makeCoinTrackingImport
, writeOrPrintImportData
, makeImportData
, bnb
) where
import Control.Monad ( (>=>) )
import Data.Time ( utcToLocalZonedTime )
import Web.CoinTracking.Imports ( Amount(..)
, CTImportData(..)
, CTTransactionType(Staking)
, Currency(..)
, coinTrackingCsvImport
, writeImportDataToFile
)
import Console.BnbStaking.Api ( Reward(..) )
import qualified Data.ByteString.Lazy.Char8 as LBC
import qualified Data.Text as T
-- | Generate the Bulk Import file for CoinTracking & write to destination
-- or print to stdout if destinatin is @"-"@.
makeCoinTrackingImport
:: FilePath
-- ^ Destination. @xls@ or @xlsx@ extensions generate the Excel import,
-- any other extension will generate the CSV import.
-> String
-- ^ Account's PubKey
-> [Reward]
-> IO ()
makeCoinTrackingImport dest pubkey =
makeImportData pubkey >=> writeOrPrintImportData dest
-- | Write or print the generated import data.
writeOrPrintImportData :: FilePath -> [CTImportData] -> IO ()
writeOrPrintImportData dest importData = if dest == "-"
then LBC.putStrLn $ coinTrackingCsvImport importData
else writeImportDataToFile dest importData
-- | Turn an account pubkey & reward into a 'CTImportData', localizing the
-- reward time.
makeImportData :: String -> [Reward] -> IO [CTImportData]
makeImportData pubkey = mapM $ \Reward {..} -> do
zonedTime <- utcToLocalZonedTime rRewardTime
return CTImportData
{ ctidType = Staking
, ctidBuy = Just $ Amount rReward bnb
, ctidSell = Nothing
, ctidFee = Nothing
, ctidExchange = "BNB Wallet"
, ctidGroup = "Staking"
, ctidComment = "Imported From bnb-staking-csvs"
, ctidDate = zonedTime
, ctidTradeId = "BNB-STAKE-"
<> T.pack pubkey
<> "-"
<> rValidatorAddress
<> "-"
<> T.pack (show rHeight)
, ctidBuyValue = Nothing
, ctidSellValue = Nothing
}
-- | Binance Coin currency with the @BNB@ ticker & 8 decimals of precision.
bnb :: Currency
bnb = Currency 8 "BNB"