diff --git a/app/ZenScan.hs b/app/ZenScan.hs index a2c23d5..984ec2e 100644 --- a/app/ZenScan.hs +++ b/app/ZenScan.hs @@ -12,4 +12,4 @@ main = do {-dataStorePath <- require config "dataStorePath"-} zebraPort <- require config "zebraPort" zebraHost <- require config "zebraHost" - scanZebra 2764500 zebraHost zebraPort dbFilePath + scanZebra 2772000 zebraHost zebraPort dbFilePath diff --git a/src/Zenith/Scanner.hs b/src/Zenith/Scanner.hs index f426533..05ed911 100644 --- a/src/Zenith/Scanner.hs +++ b/src/Zenith/Scanner.hs @@ -5,15 +5,18 @@ module Zenith.Scanner where import Control.Exception (throwIO, try) import Data.Aeson import Data.HexString +import Data.Maybe import qualified Data.Text as T import GHC.Utils.Monad (concatMapM) -import Network.HTTP.Simple (getResponseBody) import ZcashHaskell.Types ( BlockResponse(..) - , RpcResponse(..) + , RawZebraTx(..) + , Transaction(..) , ZebraGetBlockChainInfo(..) + , ZebraTxResponse(..) + , fromRawTBundle ) -import ZcashHaskell.Utils (makeZebraCall) +import ZcashHaskell.Utils (makeZebraCall, readZebraTransaction) import Zenith.Core (checkBlockChain) import Zenith.DB (initRawStore) import Zenith.Utils (jsonNumber) @@ -39,7 +42,7 @@ scanZebra b host port dbFilePath = do let bList = [b .. (zgb_blocks bStatus)] txList <- try $ concatMapM (processBlock host port) bList :: IO - (Either IOError [HexString]) + (Either IOError [Transaction]) case txList of Left e1 -> print e1 Right txList' -> print txList' @@ -49,7 +52,7 @@ processBlock :: T.Text -- ^ Host name for `zebrad` -> Int -- ^ Port for `zebrad` -> Int -- ^ The block number to process - -> IO [HexString] + -> IO [Transaction] processBlock host port b = do r <- makeZebraCall @@ -59,4 +62,34 @@ processBlock host port b = do [Data.Aeson.String $ T.pack $ show b, jsonNumber 1] case r of Left e -> throwIO $ userError e - Right blk -> return $ bl_txs blk + Right blk -> do + x <- mapM (processTx host port) $ bl_txs blk + return $ catMaybes x + +-- | Function to process a raw transaction +processTx :: + T.Text -- ^ Host name for `zebrad` + -> Int -- ^ Port for `zebrad` + -> HexString -- ^ transaction id + -> IO (Maybe Transaction) +processTx host port t = do + r <- + makeZebraCall + host + port + "getrawtransaction" + [Data.Aeson.String $ toText t, jsonNumber 1] + case r of + Left e -> throwIO $ userError e + Right rawTx -> do + case readZebraTransaction (ztr_hex rawTx) of + Nothing -> return Nothing + Just rzt -> + return $ + Just $ + Transaction + t + (ztr_blockheight rawTx) + (ztr_conf rawTx) + (fromIntegral $ zt_expiry rzt) + (fromRawTBundle $ zt_tBundle rzt) diff --git a/zcash-haskell b/zcash-haskell index f099544..4b064af 160000 --- a/zcash-haskell +++ b/zcash-haskell @@ -1 +1 @@ -Subproject commit f0995441628381fee14ae1c655c3c4f8d96162e5 +Subproject commit 4b064af4dece54fe51e3704aa95db18324167d36 diff --git a/zenith.cabal b/zenith.cabal index 0da2c6d..385dade 100644 --- a/zenith.cabal +++ b/zenith.cabal @@ -1,6 +1,6 @@ cabal-version: 3.0 name: zenith -version: 0.4.4.1 +version: 0.4.4.2 license: MIT license-file: LICENSE author: Rene Vergara