{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
module RBPCP.Internal.Types
(
    module RBPCP.Internal.Types
  , module Network.Haskoin.Transaction
  , module Network.Haskoin.Crypto
  , module Network.Haskoin.Script
  , module Data.Word
  , ByteString
  , Generic
)
where

import RBPCP.Internal.Util

import Network.Haskoin.Transaction
import Network.Haskoin.Crypto hiding (PubKey)
import Network.Haskoin.Script
import Data.ByteString      (ByteString)
import Data.Word            (Word32, Word64)
import           GHC.Generics (Generic)
import Data.Aeson
import qualified Data.Serialize as Bin


type PubKey = PubKeyC

data JsonHex a = JsonHex { fromHex :: a } deriving (Eq, Show, Generic, Bin.Serialize)
instance (Eq a, Show a, Bin.Serialize a) => ToJSON (JsonHex a) where
    toJSON = String . cs . hexEncode . fromHex
instance (Eq a, Show a, Bin.Serialize a) => FromJSON (JsonHex a) where
    parseJSON = withText "JsonHex a" $
        either (fail . (++ "Hex decode fail: ")) return .
            fmap JsonHex . hexDecode . cs

-- | Wraps any client-related datatype (eg. pubkey, signature)
data Client a = Client a deriving (Eq, Show, Generic, Bin.Serialize, ToJSON, FromJSON)

-- | Wraps any server-related datatype (eg. pubkey, signature)
data Server a = Server a deriving (Eq, Show, Generic, Bin.Serialize, ToJSON, FromJSON)