Skip to content

Instantly share code, notes, and snippets.

@jprupp
Created August 10, 2014 00:35
Show Gist options
  • Save jprupp/31d783ad8f622ed8ca39 to your computer and use it in GitHub Desktop.
Save jprupp/31d783ad8f622ed8ca39 to your computer and use it in GitHub Desktop.
{-# LANGUAGE OverloadedStrings #-}
import Control.Concurrent
import Control.Concurrent.Async
import Control.DeepSeq
import Control.Monad
import Control.Monad.Trans
import Data.Aeson.Encode.Pretty
import Data.Conduit
import qualified Data.ByteString.Lazy.Char8 as L8
import qualified Data.Conduit.List as CL
import Data.Conduit.Network
import Data.Maybe
import Network.JsonRpc
import Network.Haskoin.Crypto
import Network.Haskoin.Stratum
import System.Environment
type StratumCond =
AppConduits StratumRequest () () () StratumNotif StratumResult IO
main :: IO ()
main = tcpClient V1 False cs $ \(src, snk) -> do
args <- liftIO getArgs
when (null args) $ error "provide bitcoin addresses"
let as = map (StratumSubAddr . f . base58ToAddr) args
deepseq as $ withAsync (c (src, snk) as) $ \a -> do
src $= CL.mapM_ (L8.putStrLn . encodePretty . incomingMsg)
$$ CL.sinkNull
putStrLn "done with source"
wait a
where
cs = clientSettings 50001 "galactica.xeno-genesis.com"
f = fromMaybe (error "bad bitcoin address")
g x = do
threadDelay 200000
putStrLn $ "> " ++ addrToBase58 (stratumReqAddr x)
return $ MsgRequest (buildRequest V1 x)
c :: StratumCond -> [StratumRequest] -> IO ()
c (_, snk) as = do
CL.sourceList as $= CL.mapM g $$ snk
putStrLn "done with sink"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment