packages feed

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"