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 +10/−0
- README.md +1/−2
- solana-staking-csvs.cabal +4/−2
- src/Console/SolanaStaking/Api.hs +6/−6
- src/Console/SolanaStaking/CoinTracking.hs +67/−0
- src/Console/SolanaStaking/Main.hs +22/−10
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"