module Network.Bitcoin.BitX.Types
(
Ticker(..),
CcyPair(..),
Orderbook(..),
Order(..),
Bid,
Ask,
Trade(..),
BitXAuth(..),
PrivateOrder(..),
OrderID,
OrderType(..),
RequestStatus(..),
OrderRequest(..),
MarketOrderRequest(..),
RequestSuccess,
BitXError(..),
AccountID,
Asset(..),
Balance(..),
FundingAddress(..),
WithdrawalRequest(..),
NewWithdrawal(..),
WithdrawalType(..),
BitcoinSendRequest(..),
QuoteRequest(..),
OrderQuote(..),
QuoteType(..),
BitXClientAuth,
Transaction(..),
Account(..),
PrivateTrade(..),
FeeInfo(..),
mkBitXAuth,
mkAccount,
mkBitcoinSendRequest,
mkOrderRequest,
mkQuoteRequest,
mkNewWithdrawal,
mkMarketOrderRequest,
HasError(..),
HasErrorCode(..),
HasTimestamp(..),
HasBid(..),
HasAsk(..),
HasLastTrade(..),
HasRolling24HourVolume(..),
HasPair(..),
HasVolume(..),
HasPrice(..),
HasBids(..),
HasAsks(..),
HasSecret(..),
HasId(..),
HasBase(..),
HasCounter(..),
HasCreationTimestamp(..),
HasExpirationTimestamp(..),
HasCompletedTimestamp(..),
HasFeeBase(..),
HasFeeCounter(..),
HasLimitPrice(..),
HasState(..),
HasOrderType(..),
HasLimitVolume(..),
HasRowIndex(..),
HasBalance(..),
HasAvailable(..),
HasBalanceDelta(..),
HasAvailableDelta(..),
HasCurrency(..),
HasDescription(..),
HasAsset(..),
HasReserved(..),
HasUnconfirmed(..),
HasAddress(..),
HasTotalReceived(..),
HasTotalUnconfirmed(..),
HasAmount(..),
HasWithdrawalType(..),
HasMessage(..),
HasQuoteType(..),
HasBaseAmount(..),
HasCounterAmount(..),
HasCreatedAt(..),
HasExpiresAt(..),
HasDiscarded(..),
HasExercised(..),
HasName(..),
HasIsBuy(..),
HasStatus(..),
HasBeneficiaryId(..),
HasOrderId(..),
HasMakerFee(..),
HasTakerFee(..),
HasThirtyDayVolume(..)
) where
import Data.Aeson (FromJSON(..))
import Data.Text (Text, pack)
import Data.Time.Clock
import GHC.Generics (Generic)
import Data.Scientific (Scientific)
import Lens.Micro.TH (makeFields)
import Data.String (IsString(..))
import Data.Data (Data, Typeable)
import Control.DeepSeq (NFData)
type OrderID = Text
data OrderType =
ASK
| BID
deriving (Show, Generic, Eq, Data, Typeable, Ord)
instance NFData OrderType
data RequestStatus =
PENDING
| COMPLETE
| CANCELLED
deriving (Show, Generic, Eq, Data, Typeable, Ord)
instance NFData RequestStatus
type AccountID = Text
data BitXError = BitXError {
bitXErrorError :: Text,
bitXErrorErrorCode :: Text
} deriving (Eq, Generic, Show, Data, Typeable, Ord)
instance NFData BitXError
makeFields ''BitXError
data CcyPair =
XBTZAR
| XBTMYR
| XBTNGN
| XBTIDR
| ETHXBT
deriving (Show, Generic, Eq, Data, Typeable, Ord)
instance NFData CcyPair
data Ticker = Ticker {
tickerTimestamp :: UTCTime,
tickerBid :: Maybe Scientific,
tickerAsk :: Maybe Scientific,
tickerLastTrade :: Maybe Scientific,
tickerRolling24HourVolume :: Scientific,
tickerPair :: CcyPair
} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData Ticker
makeFields ''Ticker
data Asset =
ZAR
| XBT
| MYR
| IDR
| BCH
| ETH
deriving (Show, Generic, Eq, Data, Typeable, Ord)
instance NFData Asset
data WithdrawalType =
ZAR_EFT
| NAD_EFT
| KES_MPESA
| MYR_IBG
| IDR_LLG
deriving (Show, Generic, Eq, Data, Typeable, Ord)
instance NFData WithdrawalType
data QuoteType = BUY | SELL deriving (Show, Generic, Eq, Data, Typeable, Ord)
instance NFData QuoteType
type RequestSuccess = Bool
data Order = Order {
orderVolume :: Scientific,
orderPrice :: Scientific
} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData Order
makeFields ''Order
type Bid = Order
type Ask = Order
data Orderbook = Orderbook {
orderbookTimestamp :: UTCTime,
orderbookBids :: [Bid],
orderbookAsks :: [Ask]
} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData Orderbook
makeFields ''Orderbook
data Trade = Trade {
tradeTimestamp :: UTCTime,
tradeVolume :: Scientific,
tradePrice :: Scientific,
tradeIsBuy :: Bool
} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData Trade
makeFields ''Trade
data BitXAuth = BitXAuth
{bitXAuthId :: Text,
bitXAuthSecret :: Text} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData BitXAuth
mkBitXAuth :: BitXAuth
mkBitXAuth = BitXAuth "" ""
makeFields ''BitXAuth
type BitXClientAuth = BitXAuth
instance IsString BitXAuth where
fromString auth =
BitXAuth (pack $ fst cut) (pack $ tail $ snd cut)
where
cut = span (/= ':') auth
data PrivateOrder = PrivateOrder
{privateOrderBase :: Scientific,
privateOrderCounter :: Scientific,
privateOrderCreationTimestamp :: UTCTime,
privateOrderExpirationTimestamp :: UTCTime,
privateOrderCompletedTimestamp :: UTCTime,
privateOrderFeeBase :: Scientific,
privateOrderFeeCounter :: Scientific,
privateOrderLimitPrice :: Scientific,
privateOrderLimitVolume :: Scientific,
privateOrderId :: OrderID,
privateOrderPair :: CcyPair,
privateOrderState :: RequestStatus,
privateOrderOrderType :: OrderType } deriving (Eq, Show, Generic, Data, Typeable)
instance NFData PrivateOrder
makeFields ''PrivateOrder
data Transaction = Transaction
{transactionRowIndex :: Int,
transactionTimestamp :: UTCTime,
transactionBalance :: Scientific,
transactionAvailable :: Scientific,
transactionBalanceDelta :: Scientific,
transactionAvailableDelta :: Scientific,
transactionCurrency :: Asset,
transactionDescription :: Text} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData Transaction
makeFields ''Transaction
data OrderRequest = OrderRequest
{orderRequestPair :: CcyPair,
orderRequestOrderType :: OrderType,
orderRequestVolume :: Scientific,
orderRequestPrice :: Scientific } deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData OrderRequest
makeFields ''OrderRequest
mkOrderRequest :: OrderRequest
mkOrderRequest = OrderRequest XBTZAR BID 0 0
data MarketOrderRequest = MarketOrderRequest
{marketOrderRequestPair :: CcyPair,
marketOrderRequestOrderType :: OrderType,
marketOrderRequestVolume :: Scientific } deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData MarketOrderRequest
makeFields ''MarketOrderRequest
mkMarketOrderRequest :: MarketOrderRequest
mkMarketOrderRequest = MarketOrderRequest XBTZAR BID 0
data Balance = Balance
{balanceId :: AccountID,
balanceAsset :: Asset,
balanceBalance :: Scientific,
balanceReserved :: Scientific,
balanceUnconfirmed :: Scientific } deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData Balance
makeFields ''Balance
data FundingAddress = FundingAddress
{fundingAddressAsset :: Asset,
fundingAddressAddress :: Text,
fundingAddressTotalReceived :: Scientific,
fundingAddressTotalUnconfirmed :: Scientific} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData FundingAddress
makeFields ''FundingAddress
data WithdrawalRequest = WithdrawalRequest
{withdrawalRequestStatus :: RequestStatus,
withdrawalRequestId :: Text } deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData WithdrawalRequest
makeFields ''WithdrawalRequest
data NewWithdrawal = NewWithdrawal
{newWithdrawalWithdrawalType :: WithdrawalType,
newWithdrawalAmount :: Scientific,
newWithdrawalBeneficiaryId :: Maybe Text} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData NewWithdrawal
makeFields ''NewWithdrawal
mkNewWithdrawal :: NewWithdrawal
mkNewWithdrawal = NewWithdrawal ZAR_EFT 0 Nothing
data BitcoinSendRequest = BitcoinSendRequest
{bitcoinSendRequestAmount :: Scientific,
bitcoinSendRequestCurrency :: Asset,
bitcoinSendRequestAddress :: Text,
bitcoinSendRequestDescription :: Maybe Text,
bitcoinSendRequestMessage :: Maybe Text} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData BitcoinSendRequest
makeFields ''BitcoinSendRequest
mkBitcoinSendRequest :: BitcoinSendRequest
mkBitcoinSendRequest = BitcoinSendRequest 0 ZAR "" Nothing Nothing
data QuoteRequest = QuoteRequest
{quoteRequestQuoteType :: QuoteType,
quoteRequestPair :: CcyPair,
quoteRequestBaseAmount :: Scientific} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData QuoteRequest
makeFields ''QuoteRequest
mkQuoteRequest :: QuoteRequest
mkQuoteRequest = QuoteRequest BUY XBTZAR 0
data OrderQuote = OrderQuote
{orderQuoteId :: Text,
orderQuoteQuoteType :: QuoteType,
orderQuotePair :: CcyPair,
orderQuoteBaseAmount :: Scientific,
orderQuoteCounterAmount :: Scientific,
orderQuoteCreatedAt :: UTCTime,
orderQuoteExpiresAt :: UTCTime,
orderQuoteDiscarded :: Bool,
orderQuoteExercised :: Bool} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData OrderQuote
makeFields ''OrderQuote
data Account = Account
{accountId :: Text,
accountName :: Text,
accountCurrency :: Asset} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData Account
makeFields ''Account
mkAccount :: Account
mkAccount = Account "" "" ZAR
data PrivateTrade = PrivateTrade {
privateTradeBase :: Scientific,
privateTradeCounter :: Scientific,
privateTradeFeeBase :: Scientific,
privateTradeFeeCounter :: Scientific,
privateTradeIsBuy :: Bool,
privateTradeOrderId :: Text,
privateTradePair :: CcyPair,
privateTradePrice :: Scientific,
privateTradeTimestamp :: UTCTime,
privateTradeOrderType :: OrderType,
privateTradeVolume :: Scientific
} deriving (Eq, Show, Generic, Data, Typeable, Ord)
instance NFData PrivateTrade
makeFields ''PrivateTrade
data FeeInfo = FeeInfo {
feeInfoMakerFee :: Scientific,
feeInfoTakerFee :: Scientific,
feeInfoThirtyDayVolume :: Scientific
} deriving (Eq, Show, Generic, Data, Typeable, Ord)
makeFields ''FeeInfo
instance FromJSON CcyPair
instance FromJSON Asset
instance FromJSON OrderType
instance FromJSON WithdrawalType
instance FromJSON QuoteType