module Bitcoin.Core.RPC
(
BitcoindClient
, runBitcoind
, cookieClient
, basicAuthFromCookie
, mkBitcoindEnv
, BitcoindException (..)
, getTransaction
, sendRawTransaction
, sendTransaction
, testMempoolAccept
, getBlock
, getBlockHeader
, getBlockHash
, getBlockCount
, getDifficulty
, getBestBlockHash
, getBlockStats
, getChainTips
, getChainTxStats
, getMempoolInfo
, getMempoolAncestors
, getMempoolDescendants
, getRawMempool
, getPeerInfo
, getConnectionCount
, getNodeAddresses
, getAddedNodeInfo
, listBanned
, getNetTotals
, stop
, uptime
, Command (..)
, addNode
, disconnectNode
, clearBanned
, generateToAddress
, module Bitcoin.Core.RPC.Responses
) where
import Control.Monad (join)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Except (runExceptT)
import Control.Monad.Trans.Reader (runReaderT)
import Data.Bifunctor (first, second)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BS8
import Network.HTTP.Client (Manager)
import Servant.API (BasicAuthData (..))
import Servant.Client (BaseUrl (..), ClientEnv,
ClientError, Scheme (..),
mkClientEnv, runClientM)
import Bitcoin.Core.RPC.Blockchain
import Bitcoin.Core.RPC.Control
import Bitcoin.Core.RPC.Generating
import Bitcoin.Core.RPC.Network
import Bitcoin.Core.RPC.Responses
import Bitcoin.Core.RPC.Transactions
import Servant.Bitcoind (BitcoindClient,
BitcoindException (..))
runBitcoind
:: Manager
-> String
-> Int
-> BasicAuthData
-> BitcoindClient a
-> IO (Either BitcoindException a)
runBitcoind mgr host port auth
= fmap consolidateErrors . (`runClientM` env) . runExceptT . (`runReaderT` auth)
where
env = mkBitcoindEnv mgr host port
cookieClient
:: Manager
-> FilePath
-> String
-> Int
-> BitcoindClient r
-> IO (Either BitcoindException r)
cookieClient mgr cookiePath host port go
= liftIO (basicAuthFromCookie cookiePath)
>>= flip (runBitcoind mgr host port) go
basicAuthFromCookie
:: FilePath
-> IO BasicAuthData
basicAuthFromCookie f = repack <$> BS.readFile f
where
repack = uncurry BasicAuthData . second (BS.drop 1) . BS8.break (== ':')
mkBitcoindEnv
:: Manager
-> String
-> Int
-> ClientEnv
mkBitcoindEnv mgr host port = mkClientEnv mgr $ BaseUrl Http host port ""
consolidateErrors :: Either ClientError (Either BitcoindException a) -> Either BitcoindException a
consolidateErrors = join . first ClientException