diff --git a/CHANGELOG.md b/CHANGELOG.md index e57dddf..aa0b028 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.5.3.0-beta] + +### Changed + +- Improved formatting of sync progress + +### Fixed + +- Wallet sync when no new block has been detected on-chain. + ## [0.5.2.0-beta] ### Added diff --git a/src/Zenith/CLI.hs b/src/Zenith/CLI.hs index 302aa68..a324b38 100644 --- a/src/Zenith/CLI.hs +++ b/src/Zenith/CLI.hs @@ -69,7 +69,7 @@ import Control.Monad (forever, void) import Control.Monad.IO.Class (liftIO) import Control.Monad.Logger (LoggingT, runFileLoggingT, runNoLoggingT) import Data.Aeson -import Data.HexString (toText) +import Data.HexString (HexString(..), toText) import Data.Maybe import qualified Data.Text as T import qualified Data.Text.Encoding as E @@ -83,6 +83,7 @@ import Lens.Micro ((&), (.~), (^.), set) import Lens.Micro.Mtl import Lens.Micro.TH import System.Hclip +import Text.Printf import Text.Wrap (FillScope(..), FillStrategy(..), WrapSettings(..), wrapText) import ZcashHaskell.Keys (generateWalletSeedPhrase, getWalletSeed) import ZcashHaskell.Orchard (getSaplingFromUA, isValidUnifiedAddress) @@ -160,6 +161,7 @@ data DisplayType | MsgDisplay | PhraseDisplay | TxDisplay + | TxIdDisplay | SyncDisplay | SendDisplay | AdrBookEntryDisplay @@ -168,6 +170,7 @@ data DisplayType data Tick = TickVal !Float | TickMsg !String + | TickTx !HexString data State = State { _network :: !ZcashNet @@ -195,6 +198,7 @@ data State = State , _abAddresses :: !(L.List Name (Entity AddressBook)) , _abForm :: !(Form AdrBookEntry () Name) , _abCurAdrs :: !T.Text -- used for address book CRUD operations + , _sentTx :: !(Maybe HexString) } makeLenses ''State @@ -208,14 +212,14 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] withBorderStyle unicode $ B.borderWithLabel (str - ("Zenith - " <> + (" Zenith - " <> show (st ^. network) <> " - " <> - T.unpack + (T.unpack (maybe "(None)" (\(_, w) -> zcashWalletName $ entityVal w) - (L.listSelectedElement (st ^. wallets))))) + (L.listSelectedElement (st ^. wallets)))) ++ " ")) (C.hCenter (str ("Account: " ++ @@ -230,10 +234,10 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] if st ^. network == MainNet then displayZec (st ^. balance) else displayTaz (st ^. balance))) <=> - listAddressBox "Addresses" (st ^. addresses) <+> + listAddressBox " Addresses " (st ^. addresses) <+> B.vBorder <+> - (C.hCenter (str ("Last block seen: " ++ show (st ^. syncBlock))) <=> - listTxBox "Transactions" (st ^. network) (st ^. transactions))) <=> + (C.hCenter (str ("Last block seen: " ++ show (st ^. syncBlock) ++ "\n")) <=> + listTxBox " Transactions " (st ^. network) (st ^. transactions))) <=> C.hCenter (hBox [ capCommand "W" "allets" @@ -281,7 +285,7 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] (hBox [ capCommand "↑↓ " "move" , capCommand "↲ " "select" - , capCommand "Tab " "->" + , capCommand3 "" "Tab" " ->" ]) ] listTxBox :: @@ -297,7 +301,7 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] (hBox [ capCommand "↑↓ " "move" , capCommand "T" "x Display" - , capCommand "Tab " "<-" + , capCommand3 "" "Tab" " <-" ]) ] helpDialog :: State -> Widget Name @@ -425,7 +429,7 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] (str " _____ _ _ _ \n|__ /___ _ __ (_) |_| |__\n / // _ \\ '_ \\| | __| '_ \\\n / /| __/ | | | | |_| | | |\n/____\\___|_| |_|_|\\__|_| |_|") <=> C.hCenter - (withAttr titleAttr (str "Zcash Wallet v0.5.2.0-beta")) <=> + (withAttr titleAttr (str "Zcash Wallet v0.5.3.0-beta")) <=> C.hCenter (withAttr blinkAttr $ str "Press any key...")) else emptyWidget @@ -496,6 +500,16 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] D.renderDialog (D.dialog (Just $ txt "Message") Nothing 50) (padAll 1 $ strWrap $ st ^. msg) + TxIdDisplay -> + withBorderStyle unicodeBold $ + D.renderDialog + (D.dialog (Just $ txt "Success") Nothing 50) + (padAll 1 $ + (txt "Tx ID: " <+> + txtWrapWith + (WrapSettings False True NoFill FillAfterFirst) + (maybe "None" toText (st ^. sentTx))) <=> + C.hCenter (hBox [capCommand "C" "opy", xCommand])) TxDisplay -> case L.listSelectedElement $ st ^. transactions of Nothing -> emptyWidget @@ -537,7 +551,7 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] , (barToDoAttr, P.progressIncompleteAttr) ]) (P.progressBar - (Just $ show (st ^. barValue * 100)) + (Just $ printf "%.2f%%" (st ^. barValue * 100)) (_barValue st)))) SendDisplay -> withBorderStyle unicodeBold $ @@ -715,8 +729,12 @@ scanZebra dbP zHost zPort b eChan = do then liftIO $ BC.writeBChan eChan $ TickMsg "Invalid starting block for scan" else do let bList = [(sb + 1) .. (zgb_blocks bStatus)] - let step = (1.0 :: Float) / fromIntegral (zgb_blocks bStatus - (sb + 1)) - mapM_ (processBlock pool step) bList + if not (null bList) + then do + let step = + (1.0 :: Float) / fromIntegral (zgb_blocks bStatus - (sb + 1)) + mapM_ (processBlock pool step) bList + else liftIO $ BC.writeBChan eChan $ TickVal 1.0 where processBlock :: ConnectionPool -> Float -> Int -> IO () processBlock pool step bl = do @@ -763,16 +781,21 @@ appEvent (BT.AppEvent t) = do MsgDisplay -> return () PhraseDisplay -> return () TxDisplay -> return () + TxIdDisplay -> return () SyncDisplay -> return () SendDisplay -> BT.modify $ set msg m AdrBookEntryDisplay -> return () BlankDisplay -> return () + TickTx txid -> do + BT.modify $ set sentTx (Just txid) + BT.modify $ set displayBox TxIdDisplay TickVal v -> do case s ^. displayBox of AddrDisplay -> return () MsgDisplay -> return () PhraseDisplay -> return () TxDisplay -> return () + TxIdDisplay -> return () SendDisplay -> return () AdrBookEntryDisplay -> return () SyncDisplay -> do @@ -896,6 +919,16 @@ appEvent (BT.VtyEvent e) = do MsgDisplay -> BT.modify $ set displayBox BlankDisplay PhraseDisplay -> BT.modify $ set displayBox BlankDisplay TxDisplay -> BT.modify $ set displayBox BlankDisplay + TxIdDisplay -> do + case e of + V.EvKey (V.KChar 'x') [] -> + BT.modify $ set displayBox BlankDisplay + V.EvKey (V.KChar 'c') [] -> do + liftIO $ + setClipboard $ + T.unpack $ maybe "None" toText (s ^. sentTx) + BT.modify $ set msg "Copied transaction ID!" + _ev -> return () SendDisplay -> BT.modify $ set displayBox BlankDisplay SyncDisplay -> BT.modify $ set displayBox BlankDisplay AdrBookEntryDisplay -> BT.modify $ set displayBox BlankDisplay @@ -1334,9 +1367,11 @@ runZenithCLI config = do (L.list ABList (Vec.fromList abookList) 1) (mkNewABForm (AdrBookEntry "" "")) "" - Left e -> print $ - "No Zebra node available on port " <> - show port <> ". Check your configuration." + Nothing + Left e -> do + print $ + "No Zebra node available on port " <> + show port <> ". Check your configuration." refreshWallet :: State -> IO State refreshWallet s = do @@ -1555,7 +1590,7 @@ sendTransaction pool chan zHost zPort znet accId bl amt ua memo = do [Data.Aeson.String $ toText rawTx] case resp of Left e1 -> BC.writeBChan chan $ TickMsg $ "Zebra error: " ++ show e1 - Right txId -> BC.writeBChan chan $ TickMsg $ "Tx ID: " ++ txId + Right txId -> BC.writeBChan chan $ TickTx txId where parseAddress :: T.Text -> IO UnifiedAddress parseAddress a = diff --git a/src/Zenith/Utils.hs b/src/Zenith/Utils.hs index 96ca8dd..0f73fc9 100644 --- a/src/Zenith/Utils.hs +++ b/src/Zenith/Utils.hs @@ -26,18 +26,18 @@ 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 " + | 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 " + | 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" -- | Helper function to display abbreviated Unified Address showAddress :: UnifiedAddressDB -> T.Text diff --git a/zenith.cabal b/zenith.cabal index 09a664c..c7dedb1 100644 --- a/zenith.cabal +++ b/zenith.cabal @@ -1,6 +1,6 @@ cabal-version: 3.0 name: zenith -version: 0.5.2.0-beta +version: 0.5.3.0-beta license: MIT license-file: LICENSE author: Rene Vergara