Compare commits
No commits in common. "7b7c653d02fc06160905636c01493da8a91c8706" and "12be74fcd6cb8bd5660c841c67150e1ff05ba81c" have entirely different histories.
7b7c653d02
...
12be74fcd6
6 changed files with 63 additions and 98 deletions
|
@ -199,7 +199,7 @@ main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
config <- load ["zenith.cfg"]
|
config <- load ["zenith.cfg"]
|
||||||
args <- getArgs
|
args <- getArgs
|
||||||
dbFilePath <- require config "dbFilePath"
|
dbName <- require config "dbName"
|
||||||
nodeUser <- require config "nodeUser"
|
nodeUser <- require config "nodeUser"
|
||||||
nodePwd <- require config "nodePwd"
|
nodePwd <- require config "nodePwd"
|
||||||
zebraPort <- require config "zebraPort"
|
zebraPort <- require config "zebraPort"
|
||||||
|
@ -217,7 +217,7 @@ main = do
|
||||||
" ______ _ _ _ \n |___ / (_) | | | \n / / ___ _ __ _| |_| |__ \n / / / _ \\ '_ \\| | __| '_ \\ \n / /_| __/ | | | | |_| | | |\n /_____\\___|_| |_|_|\\__|_| |_|\n Zcash Full Node CLI v0.4.0"
|
" ______ _ _ _ \n |___ / (_) | | | \n / / ___ _ __ _| |_| |__ \n / / / _ \\ '_ \\| | __| '_ \\ \n / /_| __/ | | | | |_| | | |\n /_____\\___|_| |_|_|\\__|_| |_|\n Zcash Full Node CLI v0.4.0"
|
||||||
}
|
}
|
||||||
(root nodeUser nodePwd)
|
(root nodeUser nodePwd)
|
||||||
"cli" -> runZenithCLI zebraHost zebraPort dbFilePath
|
"cli" -> runZenithCLI zebraHost zebraPort dbName
|
||||||
_ -> printUsage
|
_ -> printUsage
|
||||||
else printUsage
|
else printUsage
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
module Zenith.CLI where
|
module Zenith.CLI where
|
||||||
|
|
||||||
import Control.Monad (void)
|
import Control.Monad (void)
|
||||||
|
import Control.Monad.IO.Class (liftIO)
|
||||||
|
import Data.Maybe (fromMaybe)
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Graphics.Vty as V
|
import qualified Graphics.Vty as V
|
||||||
import Lens.Micro ((&), (.~), (^.), set)
|
import Lens.Micro ((&), (.~), (^.), set)
|
||||||
|
@ -87,13 +89,13 @@ drawUI :: State -> [Widget Name]
|
||||||
drawUI s = [splashDialog s, helpDialog s, walletDialog s, ui s]
|
drawUI s = [splashDialog s, helpDialog s, walletDialog s, ui s]
|
||||||
where
|
where
|
||||||
ui :: State -> Widget Name
|
ui :: State -> Widget Name
|
||||||
ui st =
|
ui s =
|
||||||
joinBorders $
|
joinBorders $
|
||||||
withBorderStyle unicode $
|
withBorderStyle unicode $
|
||||||
B.borderWithLabel (str $ "Zenith - " <> st ^. network) $
|
B.borderWithLabel (str $ "Zenith - " <> s ^. network) $
|
||||||
(C.center (listBox "Addresses" (st ^. addresses)) <+>
|
(C.center (listBox "Addresses" (s ^. addresses)) <+>
|
||||||
B.vBorder <+> C.center (listBox "Transactions" (st ^. transactions))) <=>
|
B.vBorder <+> C.center (listBox "Transactions" (s ^. transactions))) <=>
|
||||||
msgBox (st ^. msg)
|
msgBox (s ^. msg)
|
||||||
listBox :: String -> L.List Name String -> Widget Name
|
listBox :: String -> L.List Name String -> Widget Name
|
||||||
listBox titleLabel l =
|
listBox titleLabel l =
|
||||||
C.vCenter $
|
C.vCenter $
|
||||||
|
@ -109,8 +111,8 @@ drawUI s = [splashDialog s, helpDialog s, walletDialog s, ui s]
|
||||||
vBox
|
vBox
|
||||||
[B.hBorderWithLabel (str "Messages"), hLimit 70 $ padRight Max $ str m]
|
[B.hBorderWithLabel (str "Messages"), hLimit 70 $ padRight Max $ str m]
|
||||||
helpDialog :: State -> Widget Name
|
helpDialog :: State -> Widget Name
|
||||||
helpDialog st =
|
helpDialog s =
|
||||||
if st ^. helpBox
|
if s ^. helpBox
|
||||||
then D.renderDialog
|
then D.renderDialog
|
||||||
(D.dialog (Just (str "Commands")) Nothing 55)
|
(D.dialog (Just (str "Commands")) Nothing 55)
|
||||||
(vBox ([C.hCenter $ str "Key", B.hBorder] <> keyList) <+>
|
(vBox ([C.hCenter $ str "Key", B.hBorder] <> keyList) <+>
|
||||||
|
@ -123,15 +125,15 @@ drawUI s = [splashDialog s, helpDialog s, walletDialog s, ui s]
|
||||||
(hLimit 40 . str)
|
(hLimit 40 . str)
|
||||||
["Open help", "Close dialog", "Create Wallet", "Quit"]
|
["Open help", "Close dialog", "Create Wallet", "Quit"]
|
||||||
walletDialog :: State -> Widget Name
|
walletDialog :: State -> Widget Name
|
||||||
walletDialog st =
|
walletDialog s =
|
||||||
if st ^. walletBox
|
if s ^. walletBox
|
||||||
then D.renderDialog
|
then D.renderDialog
|
||||||
(D.dialog (Just (str "Create Wallet")) Nothing 50)
|
(D.dialog (Just (str "Create Wallet")) Nothing 50)
|
||||||
(renderForm $ st ^. walletForm)
|
(renderForm $ s ^. walletForm)
|
||||||
else emptyWidget
|
else emptyWidget
|
||||||
splashDialog :: State -> Widget Name
|
splashDialog :: State -> Widget Name
|
||||||
splashDialog st =
|
splashDialog s =
|
||||||
if st ^. splashBox
|
if s ^. splashBox
|
||||||
then withBorderStyle unicodeBold $
|
then withBorderStyle unicodeBold $
|
||||||
D.renderDialog
|
D.renderDialog
|
||||||
(D.dialog Nothing Nothing 30)
|
(D.dialog Nothing Nothing 30)
|
||||||
|
@ -178,7 +180,7 @@ appEvent (BT.VtyEvent e) = do
|
||||||
case e of
|
case e of
|
||||||
V.EvKey V.KEsc [] -> do
|
V.EvKey V.KEsc [] -> do
|
||||||
BT.modify $ set helpBox False
|
BT.modify $ set helpBox False
|
||||||
_ev -> return ()
|
ev -> return ()
|
||||||
else do
|
else do
|
||||||
if s ^. walletBox
|
if s ^. walletBox
|
||||||
then do
|
then do
|
||||||
|
@ -188,7 +190,7 @@ appEvent (BT.VtyEvent e) = do
|
||||||
BT.modify $ set walletBox False
|
BT.modify $ set walletBox False
|
||||||
fs <- BT.zoom walletForm $ BT.gets formState
|
fs <- BT.zoom walletForm $ BT.gets formState
|
||||||
printMsg $
|
printMsg $
|
||||||
"Creating new wallet " <> T.unpack (fs ^. walName)
|
"Creating new wallet " <> (T.unpack $ fs ^. walName)
|
||||||
ev -> BT.zoom walletForm $ handleFormEvent (BT.VtyEvent ev)
|
ev -> BT.zoom walletForm $ handleFormEvent (BT.VtyEvent ev)
|
||||||
else do
|
else do
|
||||||
case e of
|
case e of
|
||||||
|
@ -201,13 +203,12 @@ appEvent (BT.VtyEvent e) = do
|
||||||
case r of
|
case r of
|
||||||
Just AList -> BT.zoom addresses $ L.handleListEvent ev
|
Just AList -> BT.zoom addresses $ L.handleListEvent ev
|
||||||
Just TList -> BT.zoom transactions $ L.handleListEvent ev
|
Just TList -> BT.zoom transactions $ L.handleListEvent ev
|
||||||
_anyName -> return ()
|
Nothing -> return ()
|
||||||
where
|
where
|
||||||
printMsg :: String -> BT.EventM Name State ()
|
printMsg :: String -> BT.EventM Name State ()
|
||||||
printMsg s = BT.modify $ updateMsg s
|
printMsg s = BT.modify $ updateMsg s
|
||||||
updateMsg :: String -> State -> State
|
updateMsg :: String -> State -> State
|
||||||
updateMsg = set msg
|
updateMsg = set msg
|
||||||
appEvent _ = return ()
|
|
||||||
|
|
||||||
theMap :: A.AttrMap
|
theMap :: A.AttrMap
|
||||||
theMap =
|
theMap =
|
||||||
|
@ -232,7 +233,7 @@ theApp =
|
||||||
}
|
}
|
||||||
|
|
||||||
runZenithCLI :: T.Text -> Int -> T.Text -> IO ()
|
runZenithCLI :: T.Text -> Int -> T.Text -> IO ()
|
||||||
runZenithCLI host port dbFilePath = do
|
runZenithCLI host port dbName = do
|
||||||
w <- checkZebra host port
|
w <- checkZebra host port
|
||||||
case (w :: Maybe ZebraGetInfo) of
|
case (w :: Maybe ZebraGetInfo) of
|
||||||
Just zebra -> do
|
Just zebra -> do
|
||||||
|
@ -240,7 +241,7 @@ runZenithCLI host port dbFilePath = do
|
||||||
case (bc :: Maybe ZebraGetBlockChainInfo) of
|
case (bc :: Maybe ZebraGetBlockChainInfo) of
|
||||||
Nothing -> print "Unable to determine blockchain status"
|
Nothing -> print "Unable to determine blockchain status"
|
||||||
Just chainInfo -> do
|
Just chainInfo -> do
|
||||||
walList <- getWallets dbFilePath $ zgb_net chainInfo
|
walList <- getWallets $ zgb_net chainInfo
|
||||||
void $
|
void $
|
||||||
M.defaultMain theApp $
|
M.defaultMain theApp $
|
||||||
State
|
State
|
||||||
|
|
|
@ -31,35 +31,16 @@ share
|
||||||
[persistLowerCase|
|
[persistLowerCase|
|
||||||
ZcashWallet
|
ZcashWallet
|
||||||
seedPhrase Phrase
|
seedPhrase Phrase
|
||||||
|
spendingKey BS.ByteString
|
||||||
|
tPrivateKey BS.ByteString
|
||||||
birthdayHeight Int
|
birthdayHeight Int
|
||||||
name T.Text
|
name T.Text
|
||||||
network ZcashNet
|
network ZcashNet
|
||||||
deriving Show
|
deriving Show
|
||||||
ZcashAccount
|
|
||||||
walletId ZcashWalletId
|
|
||||||
index Int
|
|
||||||
orchSpendKey BS.ByteString
|
|
||||||
sapSpendKey BS.ByteString
|
|
||||||
tPrivateKey BS.ByteString
|
|
||||||
deriving Show
|
|
||||||
WalletAddress
|
|
||||||
accId ZcashAccountId
|
|
||||||
index Int
|
|
||||||
orchRec BS.ByteString Maybe
|
|
||||||
sapRec BS.ByteString Maybe
|
|
||||||
tRec BS.ByteString Maybe
|
|
||||||
encoded T.Text
|
|
||||||
deriving Show
|
|
||||||
|]
|
|]
|
||||||
|
|
||||||
getWallets :: T.Text -> ZcashNet -> IO [Entity ZcashWallet]
|
getWallets :: ZcashNet -> IO [Entity ZcashWallet]
|
||||||
getWallets dbFp n =
|
getWallets n =
|
||||||
runSqlite dbFp $ do
|
runSqlite "zenith.db" $ do
|
||||||
s <- selectList [ZcashWalletNetwork ==. n] []
|
s <- selectList [ZcashWalletNetwork ==. n] []
|
||||||
liftIO $ return s
|
liftIO $ return s
|
||||||
|
|
||||||
getAccounts :: T.Text -> ZcashWalletId -> IO [Entity ZcashAccount]
|
|
||||||
getAccounts dbFp w =
|
|
||||||
runSqlite dbFp $ do
|
|
||||||
s <- selectList [ZcashAccountWalletId ==. w] []
|
|
||||||
liftIO $ return s
|
|
||||||
|
|
30
test/Spec.hs
30
test/Spec.hs
|
@ -1,29 +1,31 @@
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
import Control.Monad (when)
|
import Control.Monad.IO.Class (liftIO)
|
||||||
import Database.Persist
|
import Database.Persist
|
||||||
import Database.Persist.Sqlite
|
import Database.Persist.Sqlite
|
||||||
import System.Directory
|
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import ZcashHaskell.Types (ZcashNet(..))
|
import ZcashHaskell.Types (ZcashNet(..))
|
||||||
import Zenith.DB
|
import Zenith.DB
|
||||||
|
import Zenith.DB
|
||||||
|
( EntityField(ZcashWalletId, ZcashWalletName)
|
||||||
|
, ZcashWallet(zcashWalletName)
|
||||||
|
)
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
checkDbFile <- doesFileExist "test.db"
|
|
||||||
when checkDbFile $ removeFile "test.db"
|
|
||||||
hspec $ do
|
hspec $ do
|
||||||
describe "Database tests" $ do
|
describe "Database tests" $ do
|
||||||
it "Create table" $ do
|
it "Create table" $ do
|
||||||
s <- runSqlite "test.db" $ do runMigration migrateAll
|
s <- runSqlite "test.db" $ do runMigration migrateAll
|
||||||
s `shouldBe` ()
|
s `shouldBe` ()
|
||||||
describe "Wallet Table" $ do
|
|
||||||
it "insert wallet record" $ do
|
it "insert wallet record" $ do
|
||||||
s <-
|
s <-
|
||||||
runSqlite "test.db" $ do
|
runSqlite "test.db" $ do
|
||||||
insert $
|
insert $
|
||||||
ZcashWallet
|
ZcashWallet
|
||||||
"one two three four five six seven eight nine ten eleven twelve"
|
"one two three four five six seven eight nine ten eleven twelve"
|
||||||
|
"123456789"
|
||||||
|
"987654321"
|
||||||
2000000
|
2000000
|
||||||
"Main Wallet"
|
"Main Wallet"
|
||||||
MainNet
|
MainNet
|
||||||
|
@ -47,21 +49,3 @@ main = do
|
||||||
delete recId
|
delete recId
|
||||||
get recId
|
get recId
|
||||||
"None" `shouldBe` maybe "None" zcashWalletName s
|
"None" `shouldBe` maybe "None" zcashWalletName s
|
||||||
describe "Account table" $ do
|
|
||||||
it "insert account" $ do
|
|
||||||
s <-
|
|
||||||
runSqlite "test.db" $ do
|
|
||||||
insert $
|
|
||||||
ZcashWallet
|
|
||||||
"one two three four five six seven eight nine ten eleven twelve"
|
|
||||||
2000000
|
|
||||||
"Main Wallet"
|
|
||||||
MainNet
|
|
||||||
t <-
|
|
||||||
runSqlite "test.db" $ do
|
|
||||||
insert $ ZcashAccount s 0 "132465798" "987654321" "739182462"
|
|
||||||
fromSqlKey t `shouldBe` 1
|
|
||||||
it "read accounts for wallet" $ do
|
|
||||||
wList <- getWallets "test.db" MainNet
|
|
||||||
acc <- getAccounts "test.db" $ entityKey (head wList)
|
|
||||||
length acc `shouldBe` 1
|
|
||||||
|
|
|
@ -104,7 +104,6 @@ test-suite zenith-tests
|
||||||
, persistent
|
, persistent
|
||||||
, persistent-sqlite
|
, persistent-sqlite
|
||||||
, hspec
|
, hspec
|
||||||
, directory
|
|
||||||
, zcash-haskell
|
, zcash-haskell
|
||||||
, zenith
|
, zenith
|
||||||
pkgconfig-depends: rustzcash_wrapper
|
pkgconfig-depends: rustzcash_wrapper
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
nodeUser = "user"
|
nodeUser = "user"
|
||||||
nodePwd = "superSecret"
|
nodePwd = "superSecret"
|
||||||
dbFilePath = "zenith.db"
|
dbName = "zenith.db"
|
||||||
zebraHost = "127.0.0.1"
|
zebraHost = "127.0.0.1"
|
||||||
zebraPort = 18232
|
zebraPort = 18232
|
||||||
|
|
Loading…
Reference in a new issue