haskoin-bitcoind 0.3.0 → 0.4.1
raw patch · 5 files changed
+73/−55 lines, 5 filesdep ~basedep ~haskoin-core
Dependency ranges changed: base, haskoin-core
Files
- haskoin-bitcoind.cabal +5/−5
- src/Network/Bitcoin/Haskoin.hs +16/−15
- src/Network/Bitcoin/Haskoin/Trans.hs +37/−12
- src/Network/Bitcoin/Mining/Haskoin.hs +7/−13
- src/Network/Bitcoin/Wallet/Haskoin.hs +8/−10
haskoin-bitcoind.cabal view
@@ -1,12 +1,12 @@ name: haskoin-bitcoind-version: 0.3.0+version: 0.4.1 synopsis: An adapter for haskoin to network-bitcoin--- description:+description: An adapter for haskoin to network-bitcoin. You can call network-bitcoin functions with haskoin types. homepage: haskoin.com license: BSD3 license-file: LICENSE author: Matthew Wraith-maintainer: wraithm@gmail.com+maintainer: matt@bitnomial.com copyright: 2015 Bitnomial, Inc category: Network build-type: Simple@@ -21,11 +21,11 @@ , Network.Bitcoin.Mining.Haskoin , Network.Bitcoin.Wallet.Haskoin - build-depends: base >= 4.8 && < 4.12+ build-depends: base >= 4.8 && < 4.13 , base16-bytestring >= 0.1.1.6 , bytestring >= 0.10.6 , cereal >= 0.5 && < 0.6- , haskoin-core >= 0.4.3+ , haskoin-core >= 0.9.0 , monad-control >= 0.1 , mtl >= 2.2 , network-bitcoin >= 1.8.2
src/Network/Bitcoin/Haskoin.hs view
@@ -32,10 +32,11 @@ TransactionID, getClient, getRawTransaction) import qualified Network.Bitcoin as B-import Network.Haskoin.Crypto (Address, addrToBase58,- base58ToAddr)-import Network.Haskoin.Script (decodeInputBS, decodeOutputBS,- inputAddress, outputAddress)+import Network.Haskoin.Address (Address, addrToString,+ inputAddress, outputAddress,+ scriptToAddressBS, stringToAddr)+import Network.Haskoin.Constants (Network)+import Network.Haskoin.Script (decodeInputBS) import Network.Haskoin.Transaction (OutPoint (..), Tx (..), TxHash, TxIn, TxOut, hexToTxHash, scriptInput, scriptOutput,@@ -43,19 +44,19 @@ transactionOutputAddress :: TxOut -> Either String Address-transactionOutputAddress = outputAddress <=< decodeOutputBS . scriptOutput+transactionOutputAddress = scriptToAddressBS . scriptOutput -transactionInputAddress :: TxIn -> Either String Address-transactionInputAddress = inputAddress <=< decodeInputBS . scriptInput+transactionInputAddress :: Network -> TxIn -> Either String Address+transactionInputAddress net = maybe (Left "could not decode address") Right . inputAddress <=< decodeInputBS net . scriptInput -addressToHex :: Address -> B.Address-addressToHex = decodeUtf8 . addrToBase58+addressToHex :: Network -> Address -> B.Address+addressToHex net = fromMaybe (error "Address encoding error") . addrToString net -hexToAddress :: B.Address -> Address-hexToAddress = fromMaybe (error "Unable to parse address") . base58ToAddr . encodeUtf8+hexToAddress :: Network -> B.Address -> Address+hexToAddress net = fromMaybe (error "Unable to parse address") . stringToAddr net -- | TODO Catch bad decodes@@ -67,11 +68,11 @@ hexTxHash :: TxHash -> TransactionID-hexTxHash = E.decodeUtf8 . txHashToHex+hexTxHash = txHashToHex transactionIdToTxHash :: TransactionID -> TxHash-transactionIdToTxHash = fromMaybe (error "Unable to parse txid") . hexToTxHash . encodeUtf8+transactionIdToTxHash = fromMaybe (error "Unable to parse txid") . hexToTxHash -- | TODO Catch errors from bitcoind@@ -87,5 +88,5 @@ outpointAddress c op = transactionOutputAddress <$> getTransactionOutput c op -importAddress :: Client -> Address -> Maybe B.Account -> Maybe Bool -> IO ()-importAddress client addr = B.importAddress client (E.decodeUtf8 $ addrToBase58 addr)+importAddress :: Client -> Network -> Address -> Maybe B.Account -> Maybe Bool -> IO ()+importAddress client net addr = B.importAddress client (addressToHex net addr)
src/Network/Bitcoin/Haskoin/Trans.hs view
@@ -8,6 +8,9 @@ module Network.Bitcoin.Haskoin.Trans ( BitcoinT (..) , runBitcoinT+ , newBitcoindClient+ , getBitcoindClient+ , BitcoindClient (..) , -- * Bitcoind operations getTransaction@@ -35,38 +38,58 @@ import Control.Monad.IO.Class import Control.Monad.Reader (MonadReader, ReaderT (..), ask) import Control.Monad.Trans (MonadTrans (..))+import Data.ByteString (ByteString) import Network.Bitcoin (Account) import Network.Bitcoin.Haskoin (Client) import qualified Network.Bitcoin.Haskoin as B-import Network.Haskoin.Crypto (Address)+import Network.Haskoin.Address (Address)+import Network.Haskoin.Constants (Network) import Network.Haskoin.Transaction (OutPoint, Tx (..), TxHash, TxIn (..), TxOut (..)) -newtype BitcoinT m a = BitcoinT { unBitcoinT :: ReaderT Client m a }- deriving (Functor, Applicative, Monad, MonadTrans, MonadIO, MonadReader Client)+data BitcoindClient = BitcoindClient+ { bitcoindClient :: Client+ , bitcoindNetwork :: Network+ } +newBitcoindClient :: Client -> Network -> BitcoindClient+newBitcoindClient = BitcoindClient+++type URL = String+type User = ByteString+type Password = ByteString+++getBitcoindClient :: URL -> User -> Password -> Network -> IO BitcoindClient+getBitcoindClient url user password net = do+ client <- B.getClient url user password+ return $ newBitcoindClient client net+++-- TODO Add Network to Reader+newtype BitcoinT m a = BitcoinT { unBitcoinT :: ReaderT BitcoindClient m a }+ deriving (Functor, Applicative, Monad, MonadTrans, MonadIO, MonadReader BitcoindClient)++ instance MonadBase b m => MonadBase b (BitcoinT m) where liftBase = lift . liftBase -runBitcoinT :: Client -> BitcoinT m a -> m a+runBitcoinT :: BitcoindClient -> BitcoinT m a -> m a runBitcoinT c = flip runReaderT c . unBitcoinT -- TODO Handle exceptions withClient :: Monad m => (Client -> m a) -> BitcoinT m a-withClient f = do- cl <- ask- lift (f cl)+withClient f = ask >>= lift . f . bitcoindClient withClientIO :: MonadIO m => (Client -> IO a) -> BitcoinT m a-withClientIO f = do- cl <- ask- liftIO (f cl)+withClientIO f = ask >>= liftIO . f . bitcoindClient getTransaction :: MonadIO m => TxHash -> BitcoinT m Tx@@ -82,9 +105,11 @@ importAddress' :: MonadIO m => Address -> Maybe Account -> Maybe Bool -> BitcoinT m ()-importAddress' addr macct mrescan =- withClientIO (\cl -> B.importAddress cl addr macct mrescan)+importAddress' addr macct mrescan = do+ BitcoindClient cl net <- ask+ liftIO $ B.importAddress cl net addr macct mrescan +-- TODO Accounts are being removed, remove the account field from network-bitcoind importAddress :: MonadIO m => Address -> BitcoinT m () importAddress addr = importAddress' addr (Just "") (Just False)
src/Network/Bitcoin/Mining/Haskoin.hs view
@@ -1,27 +1,21 @@ module Network.Bitcoin.Mining.Haskoin ( generate+ , generateToAddress ) where -import Data.Fixed (Fixed (MkFixed))-import Data.Maybe (fromMaybe, maybe)-import Data.Text (Text)-import Data.Text.Encoding (decodeUtf8, encodeUtf8)-import Data.Word (Word64) import Network.Bitcoin.Haskoin (addressToHex, transactionIdToTxHash) import qualified Network.Bitcoin.Mining as NBM-import qualified Network.Bitcoin.Types as NBT import Network.Bitcoin.Wallet (Client)-import qualified Network.Bitcoin.Wallet as W-import Network.Haskoin.Crypto (addrToBase58, base58ToAddr)-import qualified Network.Haskoin.Crypto as HSK-import Network.Haskoin.Transaction (TxHash, hexToTxHash)+import qualified Network.Haskoin.Address as HSK+import Network.Haskoin.Constants (Network)+import Network.Haskoin.Transaction (TxHash) generate :: Client -> Int -> Maybe Int -> IO [TxHash] generate client blocks maxTries = fmap transactionIdToTxHash <$> NBM.generate client blocks maxTries -generateToAddress :: Client -> Int -> HSK.Address -> Maybe Int -> IO [TxHash]-generateToAddress client blocks toAddr maxTries =- fmap transactionIdToTxHash <$> NBM.generateToAddress client blocks (addressToHex toAddr) maxTries+generateToAddress :: Client -> Network -> Int -> HSK.Address -> Maybe Int -> IO [TxHash]+generateToAddress client net blocks toAddr maxTries =+ fmap transactionIdToTxHash <$> NBM.generateToAddress client blocks (addressToHex net toAddr) maxTries
src/Network/Bitcoin/Wallet/Haskoin.hs view
@@ -4,30 +4,28 @@ ) where import Data.Fixed (Fixed (MkFixed))-import Data.Maybe (fromMaybe, maybe) import Data.Text (Text)-import Data.Text.Encoding (decodeUtf8, encodeUtf8) import Data.Word (Word64) import Network.Bitcoin.Haskoin (addressToHex, hexToAddress, transactionIdToTxHash) import qualified Network.Bitcoin.Types as NBT import Network.Bitcoin.Wallet (Client) import qualified Network.Bitcoin.Wallet as W-import Network.Haskoin.Crypto (addrToBase58, base58ToAddr)-import qualified Network.Haskoin.Crypto as HSK-import Network.Haskoin.Transaction (TxHash, hexToTxHash)+import qualified Network.Haskoin.Address as HSK+import Network.Haskoin.Constants (Network)+import Network.Haskoin.Transaction (TxHash) type Satoshi = Word64 -sendToAddress :: Client -> HSK.Address -> Satoshi -> Maybe Text -> Maybe Text -> IO TxHash-sendToAddress client addr sat cmt cmtTo =- transactionIdToTxHash <$> W.sendToAddress client (addressToHex addr) (satToBTC sat) cmt cmtTo+sendToAddress :: Client -> Network -> HSK.Address -> Satoshi -> Maybe Text -> Maybe Text -> IO TxHash+sendToAddress client net addr sat cmt cmtTo =+ transactionIdToTxHash <$> W.sendToAddress client (addressToHex net addr) (satToBTC sat) cmt cmtTo -getNewAddress :: Client -> IO HSK.Address-getNewAddress client = hexToAddress <$> W.getNewAddress client Nothing+getNewAddress :: Client -> Network -> IO HSK.Address+getNewAddress client net = hexToAddress net <$> W.getNewAddress client Nothing satToBTC :: Satoshi -> NBT.BTC