Implement functions to make RPC calls to Zebra
This commit is contained in:
parent
3ccee4ecb6
commit
268d17c094
4 changed files with 68 additions and 20 deletions
|
@ -7,12 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
## Added
|
### Added
|
||||||
|
|
||||||
- `Core` module
|
- `Core` module
|
||||||
- `CLI` module
|
- `CLI` module
|
||||||
- `DB` module
|
- `DB` module
|
||||||
- Command line arguments to switch to legacy version
|
- Command line arguments to switch to legacy version
|
||||||
|
- New configuration parameter for Zebra port
|
||||||
|
- New functions to call `getinfo` and `getblockchaininfo` RPC methods
|
||||||
|
|
||||||
## [0.4.1]
|
## [0.4.1]
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ library:
|
||||||
- text
|
- text
|
||||||
- bytestring
|
- bytestring
|
||||||
- http-conduit
|
- http-conduit
|
||||||
|
- http-client
|
||||||
- scientific
|
- scientific
|
||||||
- vector
|
- vector
|
||||||
- regex-base
|
- regex-base
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
module Zenith.CLI where
|
module Zenith.CLI where
|
||||||
|
|
||||||
|
@ -33,6 +34,8 @@ import Brick.Widgets.Core
|
||||||
)
|
)
|
||||||
import qualified Brick.Widgets.List as L
|
import qualified Brick.Widgets.List as L
|
||||||
import qualified Data.Vector as Vec
|
import qualified Data.Vector as Vec
|
||||||
|
import Network.HTTP.Simple
|
||||||
|
import ZcashHaskell.Types
|
||||||
import Zenith.Core
|
import Zenith.Core
|
||||||
|
|
||||||
data Name
|
data Name
|
||||||
|
@ -85,15 +88,6 @@ listDrawElement sel a =
|
||||||
else str s
|
else str s
|
||||||
in C.hCenter $ selStr $ show a
|
in C.hCenter $ selStr $ show a
|
||||||
|
|
||||||
initialState :: State
|
|
||||||
initialState =
|
|
||||||
State
|
|
||||||
"Main"
|
|
||||||
(L.list WList (Vec.fromList ["wall1"]) 1)
|
|
||||||
(L.list AList (Vec.fromList ["addr1", "addr2"]) 1)
|
|
||||||
(L.list TList (Vec.fromList ["tx1", "tx2", "tx3"]) 1)
|
|
||||||
"Start up Ok!"
|
|
||||||
|
|
||||||
customAttr :: A.AttrName
|
customAttr :: A.AttrName
|
||||||
customAttr = L.listSelectedAttr <> A.attrName "custom"
|
customAttr = L.listSelectedAttr <> A.attrName "custom"
|
||||||
|
|
||||||
|
@ -129,10 +123,25 @@ theApp =
|
||||||
, M.appAttrMap = const theMap
|
, M.appAttrMap = const theMap
|
||||||
}
|
}
|
||||||
|
|
||||||
runZenithCLI :: T.Text -> IO ()
|
runZenithCLI :: Int -> T.Text -> IO ()
|
||||||
runZenithCLI dbName = do
|
runZenithCLI port dbName = do
|
||||||
w <- checkWallets dbName
|
w <- checkZebra port
|
||||||
if (null w)
|
case (w :: Maybe ZebraGetInfo) of
|
||||||
then void $ M.defaultMain theApp initialState
|
Just zebra -> do
|
||||||
else do
|
bc <- checkBlockChain port
|
||||||
print "No wallet found. Create one? Y/N"
|
case (bc :: Maybe ZebraGetBlockChainInfo) of
|
||||||
|
Nothing -> print "Unable to determine blockchain status"
|
||||||
|
Just chainInfo -> do
|
||||||
|
void $
|
||||||
|
M.defaultMain theApp $
|
||||||
|
State
|
||||||
|
((show . zgb_net) chainInfo)
|
||||||
|
(L.list WList (Vec.fromList ["wall1"]) 1)
|
||||||
|
(L.list AList (Vec.fromList ["addr1", "addr2"]) 1)
|
||||||
|
(L.list TList (Vec.fromList ["tx1", "tx2", "tx3"]) 1)
|
||||||
|
("Start up Ok! Connected to Zebra " ++
|
||||||
|
(T.unpack . zgi_build) zebra ++ " on port " ++ show port ++ ".")
|
||||||
|
Nothing -> do
|
||||||
|
print $
|
||||||
|
"No Zebra node available on port " <>
|
||||||
|
show port <> ". Check your configuration"
|
||||||
|
|
|
@ -1,12 +1,48 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
-- Core wallet functionality for Zenith
|
||||||
module Zenith.Core where
|
module Zenith.Core where
|
||||||
|
|
||||||
|
import Data.Aeson
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import Database.Persist
|
import Database.Persist
|
||||||
import Database.Persist.Sqlite
|
import Database.Persist.Sqlite
|
||||||
|
import Network.HTTP.Client
|
||||||
|
import ZcashHaskell.Types
|
||||||
|
import ZcashHaskell.Utils
|
||||||
import Zenith.DB
|
import Zenith.DB
|
||||||
|
|
||||||
checkWallets :: T.Text -> IO [Entity ZcashWallet]
|
-- * Database functions
|
||||||
|
-- | Returns the list of wallets available in the given database
|
||||||
|
checkWallets ::
|
||||||
|
T.Text -- ^ The database name to check
|
||||||
|
-> IO [Entity ZcashWallet]
|
||||||
checkWallets dbName = do
|
checkWallets dbName = do
|
||||||
runSqlite dbName $ do runMigration migrateAll
|
runSqlite dbName $ do runMigration migrateAll
|
||||||
wallets <- runSqlite dbName $ selectList [ZcashWalletBirthdayHeight >. 0] []
|
runSqlite dbName $ selectList [ZcashWalletBirthdayHeight >. 0] []
|
||||||
return wallets
|
|
||||||
|
-- * Zebra Node interaction
|
||||||
|
-- | Checks the status of the `zebrad` node
|
||||||
|
checkZebra ::
|
||||||
|
Int -- ^ Port where `zebrad` is available
|
||||||
|
-> IO (Maybe ZebraGetInfo)
|
||||||
|
checkZebra port = do
|
||||||
|
res <- makeZebraCall port "getinfo" []
|
||||||
|
let body = responseBody (res :: Response (RpcResponse ZebraGetInfo))
|
||||||
|
return $ result body
|
||||||
|
|
||||||
|
-- | Checks the status of the Zcash blockchain
|
||||||
|
checkBlockChain ::
|
||||||
|
Int -- ^ Port where `zebrad` is available
|
||||||
|
-> IO (Maybe ZebraGetBlockChainInfo)
|
||||||
|
checkBlockChain port = do
|
||||||
|
let f = makeZebraCall port
|
||||||
|
result <$> (responseBody <$> f "getblockchaininfo" [])
|
||||||
|
|
||||||
|
-- | Generic RPC call function
|
||||||
|
connectZebra ::
|
||||||
|
FromJSON a => Int -> T.Text -> [Data.Aeson.Value] -> IO (Maybe a)
|
||||||
|
connectZebra port m params = do
|
||||||
|
res <- makeZebraCall port m params
|
||||||
|
let body = responseBody res
|
||||||
|
return $ result body
|
||||||
|
|
Loading…
Reference in a new issue