packages feed

solana-staking-csvs 0.1.0.0 → 0.1.1.0

raw patch · 6 files changed

+110/−20 lines, 6 filesdep +cointracking-importsdep ~aesonPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: cointracking-imports

Dependency ranges changed: aeson

API changes (from Hackage documentation)

+ Console.SolanaStaking.Api: scientificLamports :: Lamports -> Scientific
+ Console.SolanaStaking.CoinTracking: makeCoinTrackingImport :: FilePath -> [(StakingAccount, StakeReward)] -> IO ()
+ Console.SolanaStaking.CoinTracking: makeImportData :: [(StakingAccount, StakeReward)] -> IO [CTImportData]
+ Console.SolanaStaking.CoinTracking: sol :: Currency
+ Console.SolanaStaking.CoinTracking: writeOrPrintImportData :: FilePath -> [CTImportData] -> IO ()
+ Console.SolanaStaking.Main: [argCoinTracking] :: Args -> Bool
- Console.SolanaStaking.Main: Args :: String -> String -> Maybe String -> Args
+ Console.SolanaStaking.Main: Args :: String -> String -> Maybe String -> Bool -> Args

Files

CHANGELOG.md view
@@ -1,5 +1,15 @@ # CHANGELOG +## master+++## v0.1.1.0++* Add `--cointracking` flag to format data for use with CoinTracking's Bulk+  Imports feature.+* Fix lower-bounds for `req`.++ ## v0.1.0.0  * Initial release
README.md view
@@ -10,6 +10,7 @@  ```sh stack run -- <YOUR_API_KEY> <ACCOUNT_PUBKEY>+stack run -- --help ```  TODO:@@ -17,8 +18,6 @@ * Add `-Y <year>` flag to limit years exported(or start/end flags?). * Allow sourcing pubkey & apikey from env variables? * Move SolanaBeach API to separate, published package.-* Publish on Hackage & Stackage.-* Add necessary fields for CoinTracking imports(currency & "trade id"?)  [get-stack]: https://docs.haskellstack.org/en/stable/README/ [solanabeach-api]: https://github.com/solana-beach/api
solana-staking-csvs.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           solana-staking-csvs-version:        0.1.0.0+version:        0.1.1.0 synopsis:       Generate CSV Exports of your Solana Staking Rewards. description:    @solana-staking-csvs@ is a CLI program that queries the Solana blockchain                 for an account's staking accounts and exports all their staking rewards to@@ -44,6 +44,7 @@ library   exposed-modules:       Console.SolanaStaking.Api+      Console.SolanaStaking.CoinTracking       Console.SolanaStaking.Csv       Console.SolanaStaking.Main   other-modules:@@ -65,8 +66,9 @@     , bytestring <1     , cassava <1     , cmdargs >=0.10 && <1+    , cointracking-imports <1     , mtl ==2.*-    , req ==3.*+    , req >=3.4 && <4     , scientific <1     , text <2     , time <2
src/Console/SolanaStaking/Api.hs view
@@ -28,6 +28,7 @@       -- * General API Types     , Lamports(..)     , renderLamports+    , scientificLamports     , StakingPubKey(..)     ) where @@ -153,12 +154,11 @@  -- | Render an amount of 'Lamports' as text, converting it to SOL. renderLamports :: Lamports -> T.Text-renderLamports =-    T.pack-        . formatScientific Fixed (Just 9)-        . (* 0.000000001)-        . fromInteger-        . fromLamports+renderLamports = T.pack . formatScientific Fixed (Just 9) . scientificLamports++-- | Convert Lamports into Scientific representation of SOL.+scientificLamports :: Lamports -> Scientific+scientificLamports = (* 0.000000001) . fromInteger . fromLamports   -- | Get the staking rewards with a staking account's pubkey.
+ src/Console/SolanaStaking/CoinTracking.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE RecordWildCards #-}+{-| Generate & write/print CoinTracking import files.++-}+module Console.SolanaStaking.CoinTracking+    ( makeCoinTrackingImport+    , writeOrPrintImportData+    , makeImportData+    , sol+    ) where++import           Control.Monad                  ( (>=>) )+import           Data.Time                      ( utcToLocalZonedTime )+import           Data.Time.Clock.POSIX          ( posixSecondsToUTCTime )+import           Web.CoinTracking.Imports       ( Amount(..)+                                                , CTImportData(..)+                                                , CTTransactionType(Staking)+                                                , Currency(..)+                                                , coinTrackingCsvImport+                                                , writeImportDataToFile+                                                )++import           Console.SolanaStaking.Api      ( StakeReward(..)+                                                , StakingAccount(..)+                                                , StakingPubKey(..)+                                                , scientificLamports+                                                )++import qualified Data.ByteString.Lazy.Char8    as LBC+import qualified Data.Text                     as T+++-- | Generate the Import file for CoinTracking & write to destination or+-- print to stdout.+makeCoinTrackingImport :: FilePath -> [(StakingAccount, StakeReward)] -> IO ()+makeCoinTrackingImport dest = makeImportData >=> 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 a 'StakeReward' into a 'CTImportData', localizing the reward+-- time.+makeImportData :: [(StakingAccount, StakeReward)] -> IO [CTImportData]+makeImportData = mapM $ \(StakingAccount {..}, StakeReward {..}) -> do+    zonedTime <- utcToLocalZonedTime $ posixSecondsToUTCTime srTimestamp+    return CTImportData+        { ctidType      = Staking+        , ctidBuy       = Just $ Amount (scientificLamports srAmount) sol+        , ctidSell      = Nothing+        , ctidFee       = Nothing+        , ctidExchange  = "Solana Staking"+        , ctidGroup     = "Staking"+        , ctidComment   = "Imported from solana-staking-csvs"+        , ctidDate      = zonedTime+        , ctidTradeId   =+            "SOL-STAKE-" <> fromStakingPubKey saPubKey <> "-" <> T.pack+                (show srEpoch)+        , ctidBuyValue  = Nothing+        , ctidSellValue = Nothing+        }++-- | @SOL@ currency with the @SOL2@ ticker & 9 decimals of precision.+sol :: Currency+sol = Currency 9 "SOL2"
src/Console/SolanaStaking/Main.hs view
@@ -45,6 +45,8 @@                                                 )  import           Console.SolanaStaking.Api+import           Console.SolanaStaking.CoinTracking+                                                ( makeCoinTrackingImport ) import           Console.SolanaStaking.Csv      ( makeCsvContents ) import           Paths_solana_staking_csvs      ( version ) @@ -67,11 +69,14 @@         mapM_ (hPutStrLn stderr . ("\t" <>) . show) stakeErrors     -- Write the CSV     let orderedRewards = sortOn (srTimestamp . snd) stakeRewards-        output         = makeCsvContents orderedRewards         outputFile     = fromMaybe "-" argOutputFile-    if outputFile == "-"-        then liftIO $ LBS.putStr output-        else liftIO $ LBS.writeFile outputFile output+    if argCoinTracking+        then liftIO $ makeCoinTrackingImport outputFile orderedRewards+        else do+            let output = makeCsvContents orderedRewards+            if outputFile == "-"+                then liftIO $ LBS.putStr output+                else liftIO $ LBS.writeFile outputFile output   where     runner :: ReaderT Config (ExceptT APIError IO) a -> IO (Either APIError a)     runner = runExceptT . flip runReaderT (mkConfig argApiKey argPubKey)@@ -79,13 +84,16 @@  -- | CLI arguments supported by the executable. data Args = Args-    { argApiKey     :: String+    { argApiKey       :: String     -- ^ Solana Beach API Key-    , argPubKey     :: String+    , argPubKey       :: String     -- ^ Delegator's PubKey.-    , argOutputFile :: Maybe String+    , argOutputFile   :: Maybe String     -- ^ Optional output file. 'Nothing' or @'Just' "-"@ means print to     -- 'System.IO.stdout'.+    , argCoinTracking :: Bool+    -- ^ Flag to enable writing/printing files formatted for CoinTracking+    -- Imports.     }     deriving (Show, Read, Eq, Data, Typeable) @@ -96,15 +104,19 @@ argSpec :: Args argSpec =     Args-            { argApiKey     = def &= argPos 0 &= typ "API_KEY"-            , argPubKey     = def &= argPos 1 &= typ "ACCOUNT_PUBKEY"-            , argOutputFile =+            { argApiKey       = def &= argPos 0 &= typ "API_KEY"+            , argPubKey       = def &= argPos 1 &= typ "ACCOUNT_PUBKEY"+            , argOutputFile   =                 Nothing                 &= help "File to write the export to. Default: stdout"                 &= explicit                 &= name "output-file"                 &= name "o"                 &= typ "FILE"+            , argCoinTracking = False+                                &= help "Generate a CoinTracking Import file."+                                &= explicit+                                &= name "cointracking"             }         &= summary                (  "solana-staking-csvs v"