91 lines
2.9 KiB
Haskell
91 lines
2.9 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
-- Core wallet functionality for Zenith
|
|
module Zenith.Core where
|
|
|
|
import Data.Aeson
|
|
import qualified Data.Text as T
|
|
import Database.Persist
|
|
import Database.Persist.Sqlite
|
|
import Network.HTTP.Client
|
|
import ZcashHaskell.Types
|
|
import ZcashHaskell.Utils
|
|
import Zenith.DB
|
|
|
|
-- * Database functions
|
|
-- | Initializes the database
|
|
initDb ::
|
|
T.Text -- ^ The database path to check
|
|
-> IO ()
|
|
initDb dbName = do
|
|
runSqlite dbName $ do runMigration migrateAll
|
|
|
|
-- | Save a new wallet to the database
|
|
saveWallet ::
|
|
T.Text -- ^ The database path to use
|
|
-> ZcashWallet -- ^ The wallet to add to the database
|
|
-> IO (Maybe (Entity ZcashWallet))
|
|
saveWallet dbFp w = runSqlite dbFp $ insertUniqueEntity w
|
|
|
|
-- | Returns a list of accounts associated with the given wallet
|
|
getAccounts ::
|
|
T.Text -- ^ The database path
|
|
-> ZcashWalletId -- ^ The wallet ID to check
|
|
-> IO [Entity ZcashAccount]
|
|
getAccounts dbFp w = runSqlite dbFp $ selectList [ZcashAccountWalletId ==. w] []
|
|
|
|
-- | Returns the largest account index for the given wallet
|
|
getMaxAccount ::
|
|
T.Text -- ^ The database path
|
|
-> ZcashWalletId -- ^ The wallet ID to check
|
|
-> IO Int
|
|
getMaxAccount dbFp w = do
|
|
a <-
|
|
runSqlite dbFp $
|
|
selectFirst [ZcashAccountWalletId ==. w] [Desc ZcashAccountIndex]
|
|
case a of
|
|
Nothing -> return $ -1
|
|
Just x -> return $ zcashAccountIndex $ entityVal x
|
|
|
|
-- | Save a new account to the database
|
|
saveAccount ::
|
|
T.Text -- ^ The database path
|
|
-> ZcashAccount -- ^ The account to add to the database
|
|
-> IO (Maybe (Entity ZcashAccount))
|
|
saveAccount dbFp a = runSqlite dbFp $ insertUniqueEntity a
|
|
|
|
-- | Returns a list of addresses associated with the given account
|
|
getAddresses ::
|
|
T.Text -- ^ The database path
|
|
-> ZcashAccountId -- ^ The account ID to check
|
|
-> IO [Entity WalletAddress]
|
|
getAddresses dbFp a = runSqlite dbFp $ selectList [WalletAddressAccId ==. a] []
|
|
|
|
-- * Zebra Node interaction
|
|
-- | Checks the status of the `zebrad` node
|
|
checkZebra ::
|
|
T.Text -- ^ Host where `zebrad` is available
|
|
-> Int -- ^ Port where `zebrad` is available
|
|
-> IO (Maybe ZebraGetInfo)
|
|
checkZebra nodeHost nodePort = do
|
|
res <- makeZebraCall nodeHost nodePort "getinfo" []
|
|
let body = responseBody (res :: Response (RpcResponse ZebraGetInfo))
|
|
return $ result body
|
|
|
|
-- | Checks the status of the Zcash blockchain
|
|
checkBlockChain ::
|
|
T.Text -- ^ Host where `zebrad` is available
|
|
-> Int -- ^ Port where `zebrad` is available
|
|
-> IO (Maybe ZebraGetBlockChainInfo)
|
|
checkBlockChain nodeHost nodePort = do
|
|
let f = makeZebraCall nodeHost nodePort
|
|
result <$> (responseBody <$> f "getblockchaininfo" [])
|
|
|
|
-- | Generic RPC call function
|
|
connectZebra ::
|
|
FromJSON a => T.Text -> Int -> T.Text -> [Data.Aeson.Value] -> IO (Maybe a)
|
|
connectZebra nodeHost nodePort m params = do
|
|
res <- makeZebraCall nodeHost nodePort m params
|
|
let body = responseBody res
|
|
return $ result body
|