{-# LANGUAGE OverloadedStrings #-} module Zenith.Utils where import Data.Aeson import Data.Functor (void) import Data.Maybe import Data.Scientific (Scientific(..), scientific) import qualified Data.Text as T import qualified Data.Text.Encoding as E import System.Process (createProcess_, shell) import Text.Regex.Posix import ZcashHaskell.Orchard (encodeUnifiedAddress, isValidUnifiedAddress) import ZcashHaskell.Sapling (isValidShieldedAddress) import ZcashHaskell.Types (ZcashNet(..)) import Zenith.Types ( AddressGroup(..) , UnifiedAddressDB(..) , ZcashAddress(..) , ZcashPool(..) ) -- | Helper function to convert numbers into JSON jsonNumber :: Int -> Value jsonNumber i = Number $ scientific (fromIntegral i) 0 -- | Helper function to display small amounts of ZEC displayZec :: Integer -> String displayZec s | abs s < 100 = show s ++ " zats " | abs s < 100000 = show (fromIntegral s / 100) ++ " μZEC " | abs s < 100000000 = show (fromIntegral s / 100000) ++ " mZEC " | otherwise = show (fromIntegral s / 100000000) ++ " ZEC " -- | Helper function to display small amounts of ZEC displayTaz :: Integer -> String displayTaz s | abs s < 100 = show s ++ " tazs " | abs s < 100000 = show (fromIntegral s / 100) ++ " μTAZ " | abs s < 100000000 = show (fromIntegral s / 100000) ++ " mTAZ " | otherwise = show (fromIntegral s / 100000000) ++ " TAZ " displayAmount :: ZcashNet -> Integer -> T.Text displayAmount n a = if n == MainNet then T.pack $ displayZec a else T.pack $ displayTaz a -- | Helper function to display abbreviated Unified Address showAddress :: UnifiedAddressDB -> T.Text showAddress u = T.take 20 t <> "..." where t = getUA u -- | Helper function to extract addresses from AddressGroups getAddresses :: AddressGroup -> [ZcashAddress] getAddresses ag = agtransparent ag <> agsapling ag <> agunified ag -- | Helper function to validate potential Zcash addresses validateAddress :: T.Text -> Maybe ZcashPool validateAddress txt --(tReg || sReg && isJust chk) || (uReg && isJust chk) | tReg = Just Transparent | sReg && chkS = Just Sapling | uReg && chk = Just Orchard | otherwise = Nothing where transparentRegex = "^t1[a-zA-Z0-9]{33}$" :: String shieldedRegex = "^zs[a-zA-Z0-9]{76}$" :: String unifiedRegex = "^u[a-zA-Z0-9]" :: String tReg = T.unpack txt =~ transparentRegex :: Bool sReg = T.unpack txt =~ shieldedRegex :: Bool uReg = T.unpack txt =~ unifiedRegex :: Bool chk = isJust $ isValidUnifiedAddress $ E.encodeUtf8 txt chkS = isValidShieldedAddress $ E.encodeUtf8 txt -- | Copy an address to the clipboard copyAddress :: ZcashAddress -> IO () copyAddress a = void $ createProcess_ "toClipboard" $ shell $ "echo " ++ T.unpack (addy a) ++ " | xclip -r -selection clipboard"