coinbase-pro 0.8.0.0 → 0.9.0.0
raw patch · 24 files changed
+1390/−230 lines, 24 filesdep ~aesondep ~cryptonitedep ~networkPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson, cryptonite, network, servant, servant-client, servant-client-core, time
API changes (from Hackage documentation)
- CoinbasePro.WebSocketFeed.Channel.Full.Activate: [takerFeeRate] :: Activate -> TakerFeeRate
+ CoinbasePro.Authenticated: accountHistory :: AccountId -> CBAuthT ClientM [AccountHistory]
+ CoinbasePro.Authenticated: accountHolds :: AccountId -> CBAuthT ClientM [Hold]
+ CoinbasePro.Authenticated: coinbaseAccounts :: CBAuthT ClientM [CoinbaseAccount]
+ CoinbasePro.Authenticated: cryptoDepositAddress :: AccountId -> CBAuthT ClientM CryptoDepositAddress
+ CoinbasePro.Authenticated: deposits :: Maybe ProfileId -> Maybe UTCTime -> Maybe UTCTime -> Maybe Int -> CBAuthT ClientM [Transfer]
+ CoinbasePro.Authenticated: limits :: CBAuthT ClientM Limits
+ CoinbasePro.Authenticated: makeCoinbaseDeposit :: Double -> Text -> AccountId -> CBAuthT ClientM DepositResponse
+ CoinbasePro.Authenticated: makeCoinbaseWithdrawal :: Double -> Text -> AccountId -> CBAuthT ClientM WithdrawalResponse
+ CoinbasePro.Authenticated: makeCryptoWithdrawal :: Double -> Text -> Text -> CBAuthT ClientM CryptoWithdrawalResponse
+ CoinbasePro.Authenticated: makeDeposit :: Double -> Text -> PaymentMethodId -> CBAuthT ClientM DepositResponse
+ CoinbasePro.Authenticated: makeWithdrawal :: Double -> Text -> PaymentMethodId -> CBAuthT ClientM WithdrawalResponse
+ CoinbasePro.Authenticated: paymentMethods :: CBAuthT ClientM [PaymentMethod]
+ CoinbasePro.Authenticated: transfer :: PaymentMethodId -> CBAuthT ClientM Transfer
+ CoinbasePro.Authenticated: withdrawalFeeEstimate :: CurrencyType -> CryptoAddress -> CBAuthT ClientM WithdrawalFeeEstimateResponse
+ CoinbasePro.Authenticated: withdrawals :: Maybe ProfileId -> Maybe UTCTime -> Maybe UTCTime -> Maybe Int -> CBAuthT ClientM [Transfer]
+ CoinbasePro.Authenticated.API: accountHistory :: AccountId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [AccountHistory]
+ CoinbasePro.Authenticated.API: accountHolds :: AccountId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [Hold]
+ CoinbasePro.Authenticated.API: coinbaseAccounts :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [CoinbaseAccount]
+ CoinbasePro.Authenticated.API: cryptoDepositAddress :: AccountId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM CryptoDepositAddress
+ CoinbasePro.Authenticated.API: limits :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM Limits
+ CoinbasePro.Authenticated.API: makeCoinbaseDeposit :: CoinbaseDepositRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM DepositResponse
+ CoinbasePro.Authenticated.API: makeCoinbaseWithdrawal :: CoinbaseWithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM WithdrawalResponse
+ CoinbasePro.Authenticated.API: makeCryptoWithdrawal :: CryptoWithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM CryptoWithdrawalResponse
+ CoinbasePro.Authenticated.API: makeDeposit :: DepositRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM DepositResponse
+ CoinbasePro.Authenticated.API: makeWithdrawal :: WithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM WithdrawalResponse
+ CoinbasePro.Authenticated.API: paymentMethods :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [PaymentMethod]
+ CoinbasePro.Authenticated.API: transfer :: PaymentMethodId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM Transfer
+ CoinbasePro.Authenticated.API: transfers :: TransferType -> Maybe ProfileId -> Maybe UTCTime -> Maybe UTCTime -> Maybe Int -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [Transfer]
+ CoinbasePro.Authenticated.API: withdrawalFeeEstimate :: CurrencyType -> CryptoAddress -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM WithdrawalFeeEstimateResponse
+ CoinbasePro.Authenticated.Accounts: AccountHistory :: AccountId -> CreatedAt -> Double -> Balance -> AccountHistoryType -> Maybe Details -> AccountHistory
+ CoinbasePro.Authenticated.Accounts: Hold :: HoldId -> AccountId -> CreatedAt -> CreatedAt -> Double -> HoldType -> HoldRef -> Hold
+ CoinbasePro.Authenticated.Accounts: [hAccountId] :: AccountHistory -> AccountId
+ CoinbasePro.Authenticated.Accounts: [hAmount] :: AccountHistory -> Double
+ CoinbasePro.Authenticated.Accounts: [hBalance] :: AccountHistory -> Balance
+ CoinbasePro.Authenticated.Accounts: [hCreatedAt] :: AccountHistory -> CreatedAt
+ CoinbasePro.Authenticated.Accounts: [hDetails] :: AccountHistory -> Maybe Details
+ CoinbasePro.Authenticated.Accounts: [hType] :: AccountHistory -> AccountHistoryType
+ CoinbasePro.Authenticated.Accounts: [holdAccountId] :: Hold -> AccountId
+ CoinbasePro.Authenticated.Accounts: [holdAmount] :: Hold -> Double
+ CoinbasePro.Authenticated.Accounts: [holdCreatedAt] :: Hold -> CreatedAt
+ CoinbasePro.Authenticated.Accounts: [holdId] :: Hold -> HoldId
+ CoinbasePro.Authenticated.Accounts: [holdRef] :: Hold -> HoldRef
+ CoinbasePro.Authenticated.Accounts: [holdType] :: Hold -> HoldType
+ CoinbasePro.Authenticated.Accounts: [holdUpdatedAt] :: Hold -> CreatedAt
+ CoinbasePro.Authenticated.Accounts: data AccountHistory
+ CoinbasePro.Authenticated.Accounts: data Hold
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.AccountHistory
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.AccountHistoryType
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.AccountId
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.Balance
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.Details
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.Hold
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.HoldId
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.HoldRef
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Accounts.HoldType
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Accounts.AccountHistoryType
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Accounts.AccountId
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Accounts.Balance
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Accounts.Hold
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Accounts.HoldId
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Accounts.HoldRef
+ CoinbasePro.Authenticated.Accounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Accounts.HoldType
+ CoinbasePro.Authenticated.Accounts: instance GHC.Classes.Eq CoinbasePro.Authenticated.Accounts.AccountHistory
+ CoinbasePro.Authenticated.Accounts: instance GHC.Classes.Eq CoinbasePro.Authenticated.Accounts.AccountHistoryType
+ CoinbasePro.Authenticated.Accounts: instance GHC.Classes.Eq CoinbasePro.Authenticated.Accounts.Details
+ CoinbasePro.Authenticated.Accounts: instance GHC.Classes.Eq CoinbasePro.Authenticated.Accounts.Hold
+ CoinbasePro.Authenticated.Accounts: instance GHC.Classes.Eq CoinbasePro.Authenticated.Accounts.HoldId
+ CoinbasePro.Authenticated.Accounts: instance GHC.Classes.Eq CoinbasePro.Authenticated.Accounts.HoldRef
+ CoinbasePro.Authenticated.Accounts: instance GHC.Classes.Eq CoinbasePro.Authenticated.Accounts.HoldType
+ CoinbasePro.Authenticated.Accounts: instance GHC.Show.Show CoinbasePro.Authenticated.Accounts.AccountHistory
+ CoinbasePro.Authenticated.Accounts: instance GHC.Show.Show CoinbasePro.Authenticated.Accounts.AccountHistoryType
+ CoinbasePro.Authenticated.Accounts: instance GHC.Show.Show CoinbasePro.Authenticated.Accounts.Details
+ CoinbasePro.Authenticated.Accounts: instance GHC.Show.Show CoinbasePro.Authenticated.Accounts.Hold
+ CoinbasePro.Authenticated.Accounts: instance GHC.Show.Show CoinbasePro.Authenticated.Accounts.HoldId
+ CoinbasePro.Authenticated.Accounts: instance GHC.Show.Show CoinbasePro.Authenticated.Accounts.HoldRef
+ CoinbasePro.Authenticated.Accounts: instance GHC.Show.Show CoinbasePro.Authenticated.Accounts.HoldType
+ CoinbasePro.Authenticated.CoinbaseAccounts: Crypto :: CryptoAccount -> CoinbaseAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: Fiat :: FiatAccount -> CoinbaseAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: data CoinbaseAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.CoinbaseAccounts.Account
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.CoinbaseAccounts.BankCountry
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.CoinbaseAccounts.CoinbaseAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.CoinbaseAccounts.CryptoAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.CoinbaseAccounts.DepositInformation
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.CoinbaseAccounts.FiatAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.CoinbaseAccounts.SepaDepositInformation
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.CoinbaseAccounts.WireDepositInformation
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.CoinbaseAccounts.BankCountry
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.CoinbaseAccounts.SepaDepositInformation
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance GHC.Show.Show CoinbasePro.Authenticated.CoinbaseAccounts.Account
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance GHC.Show.Show CoinbasePro.Authenticated.CoinbaseAccounts.BankCountry
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance GHC.Show.Show CoinbasePro.Authenticated.CoinbaseAccounts.CoinbaseAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance GHC.Show.Show CoinbasePro.Authenticated.CoinbaseAccounts.CryptoAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance GHC.Show.Show CoinbasePro.Authenticated.CoinbaseAccounts.DepositInformation
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance GHC.Show.Show CoinbasePro.Authenticated.CoinbaseAccounts.FiatAccount
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance GHC.Show.Show CoinbasePro.Authenticated.CoinbaseAccounts.SepaDepositInformation
+ CoinbasePro.Authenticated.CoinbaseAccounts: instance GHC.Show.Show CoinbasePro.Authenticated.CoinbaseAccounts.WireDepositInformation
+ CoinbasePro.Authenticated.Deposit: CoinbaseDepositRequest :: Double -> Text -> AccountId -> CoinbaseDepositRequest
+ CoinbasePro.Authenticated.Deposit: CryptoDepositAddress :: UUID -> Text -> Maybe Int -> AddressInfo -> CreatedAt -> UTCTime -> Text -> Text -> Text -> Bool -> CryptoDepositAddress
+ CoinbasePro.Authenticated.Deposit: DepositDetails :: Maybe Text -> Maybe Text -> AccountId -> Maybe Text -> Text -> Maybe Text -> DepositDetails
+ CoinbasePro.Authenticated.Deposit: DepositRequest :: Double -> Text -> PaymentMethodId -> DepositRequest
+ CoinbasePro.Authenticated.Deposit: DepositResponse :: UUID -> Double -> Text -> UTCTime -> DepositResponse
+ CoinbasePro.Authenticated.Deposit: [amount] :: DepositRequest -> Double
+ CoinbasePro.Authenticated.Deposit: [cAmount] :: CoinbaseDepositRequest -> Double
+ CoinbasePro.Authenticated.Deposit: [cCoinbaseAccountId] :: CoinbaseDepositRequest -> AccountId
+ CoinbasePro.Authenticated.Deposit: [cCurrency] :: CoinbaseDepositRequest -> Text
+ CoinbasePro.Authenticated.Deposit: [cdaAddressInfo] :: CryptoDepositAddress -> AddressInfo
+ CoinbasePro.Authenticated.Deposit: [cdaAddress] :: CryptoDepositAddress -> Text
+ CoinbasePro.Authenticated.Deposit: [cdaCreatedAt] :: CryptoDepositAddress -> CreatedAt
+ CoinbasePro.Authenticated.Deposit: [cdaDepositUri] :: CryptoDepositAddress -> Text
+ CoinbasePro.Authenticated.Deposit: [cdaDestinationTag] :: CryptoDepositAddress -> Maybe Int
+ CoinbasePro.Authenticated.Deposit: [cdaExchangeDepositAddress] :: CryptoDepositAddress -> Bool
+ CoinbasePro.Authenticated.Deposit: [cdaId] :: CryptoDepositAddress -> UUID
+ CoinbasePro.Authenticated.Deposit: [cdaNetwork] :: CryptoDepositAddress -> Text
+ CoinbasePro.Authenticated.Deposit: [cdaResource] :: CryptoDepositAddress -> Text
+ CoinbasePro.Authenticated.Deposit: [cdaUpdatedAt] :: CryptoDepositAddress -> UTCTime
+ CoinbasePro.Authenticated.Deposit: [coinbaseAccountId] :: DepositDetails -> AccountId
+ CoinbasePro.Authenticated.Deposit: [coinbaseTransactionId] :: DepositDetails -> Text
+ CoinbasePro.Authenticated.Deposit: [cryptoAddress] :: DepositDetails -> Maybe Text
+ CoinbasePro.Authenticated.Deposit: [cryptoTransactionHash] :: DepositDetails -> Maybe Text
+ CoinbasePro.Authenticated.Deposit: [currency] :: DepositRequest -> Text
+ CoinbasePro.Authenticated.Deposit: [destinationTagName] :: DepositDetails -> Maybe Text
+ CoinbasePro.Authenticated.Deposit: [destinationTag] :: DepositDetails -> Maybe Text
+ CoinbasePro.Authenticated.Deposit: [paymentMethodId] :: DepositRequest -> PaymentMethodId
+ CoinbasePro.Authenticated.Deposit: [rAmount] :: DepositResponse -> Double
+ CoinbasePro.Authenticated.Deposit: [rCurrency] :: DepositResponse -> Text
+ CoinbasePro.Authenticated.Deposit: [rId] :: DepositResponse -> UUID
+ CoinbasePro.Authenticated.Deposit: [rPayoutAt] :: DepositResponse -> UTCTime
+ CoinbasePro.Authenticated.Deposit: data CoinbaseDepositRequest
+ CoinbasePro.Authenticated.Deposit: data CryptoDepositAddress
+ CoinbasePro.Authenticated.Deposit: data DepositDetails
+ CoinbasePro.Authenticated.Deposit: data DepositRequest
+ CoinbasePro.Authenticated.Deposit: data DepositResponse
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Deposit.AddressInfo
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Deposit.CoinbaseDepositRequest
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Deposit.CryptoDepositAddress
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Deposit.DepositDetails
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Deposit.DepositRequest
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Deposit.DepositResponse
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Deposit.AddressInfo
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Deposit.CoinbaseDepositRequest
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Deposit.CryptoDepositAddress
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Deposit.DepositDetails
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Deposit.DepositRequest
+ CoinbasePro.Authenticated.Deposit: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Deposit.DepositResponse
+ CoinbasePro.Authenticated.Deposit: instance GHC.Classes.Eq CoinbasePro.Authenticated.Deposit.CoinbaseDepositRequest
+ CoinbasePro.Authenticated.Deposit: instance GHC.Classes.Eq CoinbasePro.Authenticated.Deposit.DepositDetails
+ CoinbasePro.Authenticated.Deposit: instance GHC.Classes.Eq CoinbasePro.Authenticated.Deposit.DepositRequest
+ CoinbasePro.Authenticated.Deposit: instance GHC.Classes.Eq CoinbasePro.Authenticated.Deposit.DepositResponse
+ CoinbasePro.Authenticated.Deposit: instance GHC.Show.Show CoinbasePro.Authenticated.Deposit.AddressInfo
+ CoinbasePro.Authenticated.Deposit: instance GHC.Show.Show CoinbasePro.Authenticated.Deposit.CoinbaseDepositRequest
+ CoinbasePro.Authenticated.Deposit: instance GHC.Show.Show CoinbasePro.Authenticated.Deposit.CryptoDepositAddress
+ CoinbasePro.Authenticated.Deposit: instance GHC.Show.Show CoinbasePro.Authenticated.Deposit.DepositDetails
+ CoinbasePro.Authenticated.Deposit: instance GHC.Show.Show CoinbasePro.Authenticated.Deposit.DepositRequest
+ CoinbasePro.Authenticated.Deposit: instance GHC.Show.Show CoinbasePro.Authenticated.Deposit.DepositResponse
+ CoinbasePro.Authenticated.Limits: Limits :: LimitCurrency -> TransferLimits -> Limits
+ CoinbasePro.Authenticated.Limits: [limitCurrency] :: Limits -> LimitCurrency
+ CoinbasePro.Authenticated.Limits: [transferLimits] :: Limits -> TransferLimits
+ CoinbasePro.Authenticated.Limits: data Limits
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Limits.Limit
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Limits.LimitCurrency
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Limits.Limits
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Limits.Max
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Limits.PeriodInDays
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Limits.Remaining
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Limits.TransferLimits
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Limits.Limit
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Limits.LimitCurrency
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Limits.Limits
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Limits.Max
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Limits.PeriodInDays
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Limits.Remaining
+ CoinbasePro.Authenticated.Limits: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Limits.TransferLimits
+ CoinbasePro.Authenticated.Limits: instance GHC.Classes.Eq CoinbasePro.Authenticated.Limits.Limit
+ CoinbasePro.Authenticated.Limits: instance GHC.Classes.Eq CoinbasePro.Authenticated.Limits.LimitCurrency
+ CoinbasePro.Authenticated.Limits: instance GHC.Classes.Eq CoinbasePro.Authenticated.Limits.Limits
+ CoinbasePro.Authenticated.Limits: instance GHC.Classes.Eq CoinbasePro.Authenticated.Limits.Max
+ CoinbasePro.Authenticated.Limits: instance GHC.Classes.Eq CoinbasePro.Authenticated.Limits.PeriodInDays
+ CoinbasePro.Authenticated.Limits: instance GHC.Classes.Eq CoinbasePro.Authenticated.Limits.Remaining
+ CoinbasePro.Authenticated.Limits: instance GHC.Classes.Eq CoinbasePro.Authenticated.Limits.TransferLimits
+ CoinbasePro.Authenticated.Limits: instance GHC.Show.Show CoinbasePro.Authenticated.Limits.Limit
+ CoinbasePro.Authenticated.Limits: instance GHC.Show.Show CoinbasePro.Authenticated.Limits.LimitCurrency
+ CoinbasePro.Authenticated.Limits: instance GHC.Show.Show CoinbasePro.Authenticated.Limits.Limits
+ CoinbasePro.Authenticated.Limits: instance GHC.Show.Show CoinbasePro.Authenticated.Limits.Max
+ CoinbasePro.Authenticated.Limits: instance GHC.Show.Show CoinbasePro.Authenticated.Limits.PeriodInDays
+ CoinbasePro.Authenticated.Limits: instance GHC.Show.Show CoinbasePro.Authenticated.Limits.Remaining
+ CoinbasePro.Authenticated.Limits: instance GHC.Show.Show CoinbasePro.Authenticated.Limits.TransferLimits
+ CoinbasePro.Authenticated.Payment: PaymentMethod :: PaymentMethodId -> Text -> Text -> Text -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Maybe [Limit] -> Maybe [Limit] -> Maybe [Limit] -> Maybe [Limit] -> PaymentMethod
+ CoinbasePro.Authenticated.Payment: PaymentMethodId :: Text -> PaymentMethodId
+ CoinbasePro.Authenticated.Payment: [pmAllowBuy] :: PaymentMethod -> Bool
+ CoinbasePro.Authenticated.Payment: [pmAllowDeposit] :: PaymentMethod -> Bool
+ CoinbasePro.Authenticated.Payment: [pmAllowSell] :: PaymentMethod -> Bool
+ CoinbasePro.Authenticated.Payment: [pmAllowWithdraw] :: PaymentMethod -> Bool
+ CoinbasePro.Authenticated.Payment: [pmBuyLimits] :: PaymentMethod -> Maybe [Limit]
+ CoinbasePro.Authenticated.Payment: [pmCurrency] :: PaymentMethod -> Text
+ CoinbasePro.Authenticated.Payment: [pmDepositLimits] :: PaymentMethod -> Maybe [Limit]
+ CoinbasePro.Authenticated.Payment: [pmId] :: PaymentMethod -> PaymentMethodId
+ CoinbasePro.Authenticated.Payment: [pmInstantBuyLimits] :: PaymentMethod -> Maybe [Limit]
+ CoinbasePro.Authenticated.Payment: [pmName] :: PaymentMethod -> Text
+ CoinbasePro.Authenticated.Payment: [pmPrimaryBuy] :: PaymentMethod -> Bool
+ CoinbasePro.Authenticated.Payment: [pmPrimarySell] :: PaymentMethod -> Bool
+ CoinbasePro.Authenticated.Payment: [pmSellLimits] :: PaymentMethod -> Maybe [Limit]
+ CoinbasePro.Authenticated.Payment: [pmType] :: PaymentMethod -> Text
+ CoinbasePro.Authenticated.Payment: data PaymentMethod
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Payment.Limit
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Payment.LimitRemaining
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Payment.LimitTotal
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Payment.PaymentMethod
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Payment.PaymentMethodId
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Payment.Limit
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Payment.LimitRemaining
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Payment.LimitTotal
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Payment.PaymentMethod
+ CoinbasePro.Authenticated.Payment: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Payment.PaymentMethodId
+ CoinbasePro.Authenticated.Payment: instance GHC.Classes.Eq CoinbasePro.Authenticated.Payment.Limit
+ CoinbasePro.Authenticated.Payment: instance GHC.Classes.Eq CoinbasePro.Authenticated.Payment.LimitRemaining
+ CoinbasePro.Authenticated.Payment: instance GHC.Classes.Eq CoinbasePro.Authenticated.Payment.LimitTotal
+ CoinbasePro.Authenticated.Payment: instance GHC.Classes.Eq CoinbasePro.Authenticated.Payment.PaymentMethod
+ CoinbasePro.Authenticated.Payment: instance GHC.Classes.Eq CoinbasePro.Authenticated.Payment.PaymentMethodId
+ CoinbasePro.Authenticated.Payment: instance GHC.Show.Show CoinbasePro.Authenticated.Payment.Limit
+ CoinbasePro.Authenticated.Payment: instance GHC.Show.Show CoinbasePro.Authenticated.Payment.LimitRemaining
+ CoinbasePro.Authenticated.Payment: instance GHC.Show.Show CoinbasePro.Authenticated.Payment.LimitTotal
+ CoinbasePro.Authenticated.Payment: instance GHC.Show.Show CoinbasePro.Authenticated.Payment.PaymentMethod
+ CoinbasePro.Authenticated.Payment: instance GHC.Show.Show CoinbasePro.Authenticated.Payment.PaymentMethodId
+ CoinbasePro.Authenticated.Payment: instance Web.Internal.HttpApiData.ToHttpApiData CoinbasePro.Authenticated.Payment.PaymentMethodId
+ CoinbasePro.Authenticated.Payment: newtype PaymentMethodId
+ CoinbasePro.Authenticated.Transfer: Deposit :: DepositTransfer -> Transfer
+ CoinbasePro.Authenticated.Transfer: DepositTransferType :: TransferType
+ CoinbasePro.Authenticated.Transfer: WithdrawTransferType :: TransferType
+ CoinbasePro.Authenticated.Transfer: Withdrawal :: WithdrawalTransfer -> Transfer
+ CoinbasePro.Authenticated.Transfer: data Transfer
+ CoinbasePro.Authenticated.Transfer: data TransferType
+ CoinbasePro.Authenticated.Transfer: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Transfer.DepositTransfer
+ CoinbasePro.Authenticated.Transfer: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Transfer.Transfer
+ CoinbasePro.Authenticated.Transfer: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Transfer.TransferDetails
+ CoinbasePro.Authenticated.Transfer: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Transfer.UserNonce
+ CoinbasePro.Authenticated.Transfer: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Transfer.WithdrawalTransfer
+ CoinbasePro.Authenticated.Transfer: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Transfer.UserNonce
+ CoinbasePro.Authenticated.Transfer: instance GHC.Classes.Eq CoinbasePro.Authenticated.Transfer.UserNonce
+ CoinbasePro.Authenticated.Transfer: instance GHC.Show.Show CoinbasePro.Authenticated.Transfer.DepositTransfer
+ CoinbasePro.Authenticated.Transfer: instance GHC.Show.Show CoinbasePro.Authenticated.Transfer.Transfer
+ CoinbasePro.Authenticated.Transfer: instance GHC.Show.Show CoinbasePro.Authenticated.Transfer.TransferDetails
+ CoinbasePro.Authenticated.Transfer: instance GHC.Show.Show CoinbasePro.Authenticated.Transfer.TransferType
+ CoinbasePro.Authenticated.Transfer: instance GHC.Show.Show CoinbasePro.Authenticated.Transfer.UserNonce
+ CoinbasePro.Authenticated.Transfer: instance GHC.Show.Show CoinbasePro.Authenticated.Transfer.WithdrawalTransfer
+ CoinbasePro.Authenticated.Transfer: instance Web.Internal.HttpApiData.ToHttpApiData CoinbasePro.Authenticated.Transfer.TransferType
+ CoinbasePro.Authenticated.Withdrawal: CoinbaseWithdrawalRequest :: Double -> Text -> AccountId -> CoinbaseWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: CryptoWithdrawalRequest :: Double -> Text -> Text -> CryptoWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: CryptoWithdrawalResponse :: UUID -> Double -> Text -> Double -> Double -> CryptoWithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: WithdrawalDetails :: Maybe Text -> Maybe Text -> Text -> Maybe Text -> Maybe Text -> Text -> Text -> Maybe Double -> Maybe Double -> WithdrawalDetails
+ CoinbasePro.Authenticated.Withdrawal: WithdrawalFeeEstimateResponse :: Double -> WithdrawalFeeEstimateResponse
+ CoinbasePro.Authenticated.Withdrawal: WithdrawalRequest :: Double -> Text -> PaymentMethodId -> WithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: WithdrawalResponse :: UUID -> Double -> Text -> UTCTime -> WithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: [amount] :: WithdrawalRequest -> Double
+ CoinbasePro.Authenticated.Withdrawal: [cAmount] :: CoinbaseWithdrawalRequest -> Double
+ CoinbasePro.Authenticated.Withdrawal: [cCoinbaseAccountId] :: CoinbaseWithdrawalRequest -> AccountId
+ CoinbasePro.Authenticated.Withdrawal: [cCurrency] :: CoinbaseWithdrawalRequest -> Text
+ CoinbasePro.Authenticated.Withdrawal: [coinbaseAccountId] :: WithdrawalDetails -> Text
+ CoinbasePro.Authenticated.Withdrawal: [coinbaseTransactionId] :: WithdrawalDetails -> Text
+ CoinbasePro.Authenticated.Withdrawal: [coinbaseWithdrawalId] :: WithdrawalDetails -> Maybe Text
+ CoinbasePro.Authenticated.Withdrawal: [crAmount] :: CryptoWithdrawalRequest -> Double
+ CoinbasePro.Authenticated.Withdrawal: [crCryptoAddress] :: CryptoWithdrawalRequest -> Text
+ CoinbasePro.Authenticated.Withdrawal: [crCurrency] :: CryptoWithdrawalRequest -> Text
+ CoinbasePro.Authenticated.Withdrawal: [cryptoPaymentMethodId] :: WithdrawalDetails -> Text
+ CoinbasePro.Authenticated.Withdrawal: [currency] :: WithdrawalRequest -> Text
+ CoinbasePro.Authenticated.Withdrawal: [cwAmount] :: CryptoWithdrawalResponse -> Double
+ CoinbasePro.Authenticated.Withdrawal: [cwCurrency] :: CryptoWithdrawalResponse -> Text
+ CoinbasePro.Authenticated.Withdrawal: [cwFee] :: CryptoWithdrawalResponse -> Double
+ CoinbasePro.Authenticated.Withdrawal: [cwId] :: CryptoWithdrawalResponse -> UUID
+ CoinbasePro.Authenticated.Withdrawal: [cwSubtotal] :: CryptoWithdrawalResponse -> Double
+ CoinbasePro.Authenticated.Withdrawal: [destinationTagName] :: WithdrawalDetails -> Maybe Text
+ CoinbasePro.Authenticated.Withdrawal: [destinationTag] :: WithdrawalDetails -> Maybe Text
+ CoinbasePro.Authenticated.Withdrawal: [fee] :: WithdrawalDetails -> Maybe Double
+ CoinbasePro.Authenticated.Withdrawal: [paymentMethodId] :: WithdrawalRequest -> PaymentMethodId
+ CoinbasePro.Authenticated.Withdrawal: [sentToAddress] :: WithdrawalDetails -> Maybe Text
+ CoinbasePro.Authenticated.Withdrawal: [subtotal] :: WithdrawalDetails -> Maybe Double
+ CoinbasePro.Authenticated.Withdrawal: [wAmount] :: WithdrawalResponse -> Double
+ CoinbasePro.Authenticated.Withdrawal: [wCurrency] :: WithdrawalResponse -> Text
+ CoinbasePro.Authenticated.Withdrawal: [wId] :: WithdrawalResponse -> UUID
+ CoinbasePro.Authenticated.Withdrawal: [wPayoutAt] :: WithdrawalResponse -> UTCTime
+ CoinbasePro.Authenticated.Withdrawal: [wfFee] :: WithdrawalFeeEstimateResponse -> Double
+ CoinbasePro.Authenticated.Withdrawal: data CoinbaseWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: data CryptoWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: data CryptoWithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: data WithdrawalDetails
+ CoinbasePro.Authenticated.Withdrawal: data WithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: data WithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Withdrawal.CoinbaseWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Withdrawal.CryptoWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Withdrawal.CryptoWithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Withdrawal.WithdrawalDetails
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Withdrawal.WithdrawalFeeEstimateResponse
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Withdrawal.WithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Withdrawal.WithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Withdrawal.CoinbaseWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Withdrawal.CryptoWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Withdrawal.WithdrawalFeeEstimateResponse
+ CoinbasePro.Authenticated.Withdrawal: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Withdrawal.WithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Classes.Eq CoinbasePro.Authenticated.Withdrawal.CoinbaseWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Classes.Eq CoinbasePro.Authenticated.Withdrawal.CryptoWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Classes.Eq CoinbasePro.Authenticated.Withdrawal.CryptoWithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Classes.Eq CoinbasePro.Authenticated.Withdrawal.WithdrawalDetails
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Classes.Eq CoinbasePro.Authenticated.Withdrawal.WithdrawalFeeEstimateResponse
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Classes.Eq CoinbasePro.Authenticated.Withdrawal.WithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Classes.Eq CoinbasePro.Authenticated.Withdrawal.WithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Show.Show CoinbasePro.Authenticated.Withdrawal.CoinbaseWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Show.Show CoinbasePro.Authenticated.Withdrawal.CryptoWithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Show.Show CoinbasePro.Authenticated.Withdrawal.CryptoWithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Show.Show CoinbasePro.Authenticated.Withdrawal.WithdrawalDetails
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Show.Show CoinbasePro.Authenticated.Withdrawal.WithdrawalFeeEstimateResponse
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Show.Show CoinbasePro.Authenticated.Withdrawal.WithdrawalRequest
+ CoinbasePro.Authenticated.Withdrawal: instance GHC.Show.Show CoinbasePro.Authenticated.Withdrawal.WithdrawalResponse
+ CoinbasePro.Authenticated.Withdrawal: newtype WithdrawalFeeEstimateResponse
+ CoinbasePro.MarketData.Types: [maxMarketFunds] :: Product -> Double
+ CoinbasePro.MarketData.Types: [minMarketFunds] :: Product -> Double
+ CoinbasePro.Request: emptyBody :: ByteString
+ CoinbasePro.Types: CryptoAddress :: Text -> CryptoAddress
+ CoinbasePro.Types: CurrencyType :: Text -> CurrencyType
+ CoinbasePro.Types: instance Data.Aeson.Types.FromJSON.FromJSONKey CoinbasePro.Types.ProductId
+ CoinbasePro.Types: instance Data.Aeson.Types.ToJSON.ToJSONKey CoinbasePro.Types.ProductId
+ CoinbasePro.Types: instance GHC.Show.Show CoinbasePro.Types.CryptoAddress
+ CoinbasePro.Types: instance GHC.Show.Show CoinbasePro.Types.CurrencyType
+ CoinbasePro.Types: instance Web.Internal.HttpApiData.ToHttpApiData CoinbasePro.Types.CryptoAddress
+ CoinbasePro.Types: instance Web.Internal.HttpApiData.ToHttpApiData CoinbasePro.Types.CurrencyType
+ CoinbasePro.Types: newtype CryptoAddress
+ CoinbasePro.Types: newtype CurrencyType
+ CoinbasePro.WebSocketFeed: instance GHC.Exception.Type.Exception CoinbasePro.WebSocketFeed.ParseException
+ CoinbasePro.WebSocketFeed: instance GHC.Show.Show CoinbasePro.WebSocketFeed.ParseException
- CoinbasePro.Authenticated.Headers: CBAccessKey :: String -> CBAccessKey
+ CoinbasePro.Authenticated.Headers: CBAccessKey :: Text -> CBAccessKey
- CoinbasePro.Authenticated.Headers: CBAccessPassphrase :: String -> CBAccessPassphrase
+ CoinbasePro.Authenticated.Headers: CBAccessPassphrase :: Text -> CBAccessPassphrase
- CoinbasePro.Authenticated.Headers: CBAccessTimeStamp :: String -> CBAccessTimeStamp
+ CoinbasePro.Authenticated.Headers: CBAccessTimeStamp :: Text -> CBAccessTimeStamp
- CoinbasePro.Environment: apiEndpoint :: Environment -> String
+ CoinbasePro.Environment: apiEndpoint :: Environment -> Text
- CoinbasePro.MarketData.Types: Product :: ProductId -> Text -> Text -> Double -> Double -> Double -> Product
+ CoinbasePro.MarketData.Types: Product :: ProductId -> Text -> Text -> Double -> Double -> Double -> Double -> Double -> Product
- CoinbasePro.Request: type Body = String
+ CoinbasePro.Request: type Body = ByteString
- CoinbasePro.Request: type RequestPath = String
+ CoinbasePro.Request: type RequestPath = ByteString
- CoinbasePro.WebSocketFeed.Channel.Full.Activate: Activate :: ProductId -> UTCTime -> OrderId -> StopType -> Side -> Price -> Size -> Funds -> TakerFeeRate -> Bool -> UserId -> ProfileId -> Activate
+ CoinbasePro.WebSocketFeed.Channel.Full.Activate: Activate :: ProductId -> UTCTime -> OrderId -> StopType -> Side -> Price -> Size -> Funds -> Bool -> UserId -> ProfileId -> Activate
Files
- README.md +36/−13
- changelog.md +29/−0
- coinbase-pro.cabal +31/−25
- src/example/request/Main.hs +10/−9
- src/lib/CoinbasePro/Authenticated.hs +312/−80
- src/lib/CoinbasePro/Authenticated/API.hs +101/−18
- src/lib/CoinbasePro/Authenticated/Accounts.hs +101/−6
- src/lib/CoinbasePro/Authenticated/CoinbaseAccounts.hs +140/−0
- src/lib/CoinbasePro/Authenticated/Deposit.hs +92/−0
- src/lib/CoinbasePro/Authenticated/Headers.hs +15/−14
- src/lib/CoinbasePro/Authenticated/Limits.hs +77/−0
- src/lib/CoinbasePro/Authenticated/Orders.hs +11/−3
- src/lib/CoinbasePro/Authenticated/Payment.hs +79/−0
- src/lib/CoinbasePro/Authenticated/Request.hs +6/−4
- src/lib/CoinbasePro/Authenticated/Transfer.hs +101/−0
- src/lib/CoinbasePro/Authenticated/Withdrawal.hs +121/−0
- src/lib/CoinbasePro/Environment.hs +7/−5
- src/lib/CoinbasePro/Headers.hs +1/−1
- src/lib/CoinbasePro/MarketData/Types.hs +12/−9
- src/lib/CoinbasePro/Request.hs +19/−7
- src/lib/CoinbasePro/Types.hs +65/−17
- src/lib/CoinbasePro/Unauthenticated.hs +1/−1
- src/lib/CoinbasePro/WebSocketFeed.hs +12/−5
- src/lib/CoinbasePro/WebSocketFeed/Channel/Full/Activate.hs +11/−13
README.md view
@@ -16,11 +16,11 @@ - [x] Get Currencies - [x] Time - Private- - [ ] Accounts+ - [x] Accounts - [x] List Accounts - [x] Get An Account- - [ ] Get Account History- - [ ] Get Holds+ - [x] Get Account History+ - [x] Get Holds - [x] Orders - [x] Place a New Order - [x] Cancel an Order@@ -29,24 +29,42 @@ - [x] Get an Order - [x] Fills - [x] List Fills- - [ ] Deposits- - [ ] Payment Method- - [ ] Coinbase+ - [x] Limits+ - [x] Get Current Exchange Limits+ - [x] Deposits+ - [x] List Deposits+ - [x] Single Deposit+ - [x] Payment Method+ - [x] Coinbase+ - [x] Generate a Crypto Deposit Address - [ ] Withdrawals- - [ ] Payment Method- - [ ] Coinbase- - [ ] Crypto+ - [x] List Withdrawals+ - [x] Single Withdrawal+ - [ ] Canceled Withdrawal+ - [x] Payment Method+ - [x] Coinbase+ - [x] Crypto+ - [x] Fee Estimate - [ ] Stablecoin Conversions - [ ] Create Conversion- - [ ] Payment Methods- - [ ] List Payment Methods+ - [x] Payment Methods+ - [x] List Payment Methods+ - [x] Coinbase Accounts+ - [x] List Accounts - [x] Fees - [x] Get Current Fees - [ ] Reports - [ ] Create a new report - [ ] Get report status+ - [ ] Profiles+ - [ ] List Profiles+ - [ ] Get a Profile+ - [ ] Create a Profile Transfer - [x] User Account - [x] Trailing Volume+ - [ ] Margin+ - [ ] Oracle+ - [ ] Get Oracle - Websocket Feed - [x] Channels - [x] The heartbeat channel@@ -65,13 +83,13 @@ ### Market Data Requests ```haskell-run (trades (ProductId "BTC-USD")) >>= print+run Sandbox (trades (ProductId "BTC-USD")) >>= print ``` ### Authenticated Private Requests ```haskell-runCbAuthT cpc $ do+runCbAuthT (run Sandbox) cpc $ do fills (Just btcusd) Nothing >>= liftIO . print where accessKey = CBAccessKey "<access-key>"@@ -95,3 +113,8 @@ ## Example Example execs can be found in `src/example/`++### Run Example++To run any of the authenticated endpoints in `test-request`, the access key,+secret key, and passphrase must be provided. See _Authenticated Private Requests_ above.
changelog.md view
@@ -1,3 +1,32 @@+# Version 0.9.0.0++- Upgraded to lts-17.4 (ghc 8.10.4)+- Added hie.yaml for use with haskell-language-server (hls)+- Removed `taker_fee_rate` from `Activate` websocket message+- Added `max_withdrawal_amount` to `CurrencyDetails`+- Changed `example/test-request` to `Sandbox` instead of `Production`+- Use `Network.HTTP.Types.encodePathSegments` when making `RequestPath` in authenticated requests+- Added `min_market_funds` and `max_market_funds` to `Product`+- Made several explicit `Show` instances+- Added support for the following endpoints:+ - account history+ - account holds+ - exchange limits+ - deposits+ - withdrawals+ - list payment methods+ - listing coinbase accounts+ - list tranfers endpoint++# Version 0.8.2.0++- Changed `port` in `WSConnection` back to `PortNumber` instead of `Int`++# Version 0.8.1.0++- Upgraded to lts-16.7 (ghc 8.8.3)+- Changed `port` in `WSConnection` to `Int` instead of `PortNumber`+ # Version 0.8.0.0 ## Breaking API changes:
coinbase-pro.cabal view
@@ -1,13 +1,13 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.31.2.+-- This file has been generated from package.yaml by hpack version 0.33.0. -- -- see: https://github.com/sol/hpack ----- hash: a870948505578ac331822c4d53b73343bd8cea3178cd634aace31f0a118981a3+-- hash: 6d5d68b6e7e2760dac46a876ebbca9195bb32e0cb846b290d8db552d28a24647 name: coinbase-pro-version: 0.8.0.0+version: 0.9.0.0 synopsis: Client for Coinbase Pro description: Client for Coinbase Pro REST and Websocket APIs category: Web, Finance@@ -15,7 +15,7 @@ bug-reports: https://github.com/mdunnio/coinbase-pro/issues author: Michael Dunn <michaelsdunn1@gmail.com> maintainer: Michael Dunn <michaelsdunn1@gmail.com>-copyright: 2020 Michael Dunn <michaelsdunn1@gmail.com>+copyright: 2021 Michael Dunn <michaelsdunn1@gmail.com> license: MIT license-file: LICENSE build-type: Simple@@ -32,10 +32,16 @@ CoinbasePro.Authenticated CoinbasePro.Authenticated.Accounts CoinbasePro.Authenticated.API+ CoinbasePro.Authenticated.CoinbaseAccounts+ CoinbasePro.Authenticated.Deposit CoinbasePro.Authenticated.Fills CoinbasePro.Authenticated.Headers+ CoinbasePro.Authenticated.Limits CoinbasePro.Authenticated.Orders+ CoinbasePro.Authenticated.Payment CoinbasePro.Authenticated.Request+ CoinbasePro.Authenticated.Transfer+ CoinbasePro.Authenticated.Withdrawal CoinbasePro.Environment CoinbasePro.Headers CoinbasePro.MarketData.AggregateOrderBook@@ -65,14 +71,14 @@ src/lib/ build-depends: HsOpenSSL >=0.11 && <0.12- , aeson >=1.2 && <1.5+ , aeson >=1.2 && <1.6 , aeson-casing >=0.1 && <0.3 , async >=2.1 && <2.3 , base >=4.7 && <5 , binary >=0.8 && <0.9 , bytestring >=0.10 && <0.11 , containers >=0.5 && <0.7- , cryptonite >=0.24 && <0.27+ , cryptonite >=0.24 && <0.28 , http-api-data >=0.3 && <0.5 , http-client >=0.5 && <0.7 , http-client-tls >=0.3 && <0.4@@ -80,12 +86,12 @@ , http-types >=0.12 && <0.13 , io-streams >=1.5 && <1.6 , memory >=0.14 && <0.16- , network >=2.6 && <2.9- , servant >=0.14 && <0.17- , servant-client >=0.14 && <0.17- , servant-client-core >=0.14 && <0.17+ , network >=2.6 && <3.2+ , servant >=0.14 && <0.19+ , servant-client >=0.14 && <0.19+ , servant-client-core >=0.14 && <0.19 , text >=1.2 && <1.3- , time >=1.8 && <1.9+ , time >=1.8 && <2.0 , transformers >=0.5 && <0.6 , unagi-streams >=0.2 && <0.3 , unordered-containers >=0.2 && <0.3@@ -103,7 +109,7 @@ src/example/request/ build-depends: HsOpenSSL >=0.11 && <0.12- , aeson >=1.2 && <1.5+ , aeson >=1.2 && <1.6 , aeson-casing >=0.1 && <0.3 , async >=2.1 && <2.3 , base >=4.7 && <5@@ -111,7 +117,7 @@ , bytestring >=0.10 && <0.11 , coinbase-pro , containers >=0.5 && <0.7- , cryptonite >=0.24 && <0.27+ , cryptonite >=0.24 && <0.28 , http-api-data >=0.3 && <0.5 , http-client >=0.5 && <0.7 , http-client-tls >=0.3 && <0.4@@ -119,12 +125,12 @@ , http-types >=0.12 && <0.13 , io-streams >=1.5 && <1.6 , memory >=0.14 && <0.16- , network >=2.6 && <2.9- , servant >=0.14 && <0.17- , servant-client >=0.14 && <0.17- , servant-client-core >=0.14 && <0.17+ , network >=2.6 && <3.2+ , servant >=0.14 && <0.19+ , servant-client >=0.14 && <0.19+ , servant-client-core >=0.14 && <0.19 , text >=1.2 && <1.3- , time >=1.8 && <1.9+ , time >=1.8 && <2.0 , transformers >=0.5 && <0.6 , unagi-streams >=0.2 && <0.3 , unordered-containers >=0.2 && <0.3@@ -142,7 +148,7 @@ src/example/stream/ build-depends: HsOpenSSL >=0.11 && <0.12- , aeson >=1.2 && <1.5+ , aeson >=1.2 && <1.6 , aeson-casing >=0.1 && <0.3 , async >=2.1 && <2.3 , base >=4.7 && <5@@ -150,7 +156,7 @@ , bytestring >=0.10 && <0.11 , coinbase-pro , containers >=0.5 && <0.7- , cryptonite >=0.24 && <0.27+ , cryptonite >=0.24 && <0.28 , http-api-data >=0.3 && <0.5 , http-client >=0.5 && <0.7 , http-client-tls >=0.3 && <0.4@@ -158,12 +164,12 @@ , http-types >=0.12 && <0.13 , io-streams >=1.5 && <1.6 , memory >=0.14 && <0.16- , network >=2.6 && <2.9- , servant >=0.14 && <0.17- , servant-client >=0.14 && <0.17- , servant-client-core >=0.14 && <0.17+ , network >=2.6 && <3.2+ , servant >=0.14 && <0.19+ , servant-client >=0.14 && <0.19+ , servant-client-core >=0.14 && <0.19 , text >=1.2 && <1.3- , time >=1.8 && <1.9+ , time >=1.8 && <2.0 , transformers >=0.5 && <0.6 , unagi-streams >=0.2 && <0.3 , unordered-containers >=0.2 && <0.3
src/example/request/Main.hs view
@@ -18,17 +18,18 @@ main :: IO () main = do- run Production (stats btcusd) >>= print- run Production (candles btcusd Nothing Nothing Minute) >>= print- run Production (trades btcusd) >>= print- run Production time >>= print- run Production products >>= print- run Production (aggregateOrderBook btcusd (Just Best)) >>= print- run Production (aggregateOrderBook btcusd (Just TopFifty)) >>= print- run Production (fullOrderBook btcusd) >>= print- runCbAuthT (run Production) cpc $ do+ run Sandbox (stats btcusd) >>= print+ run Sandbox (candles btcusd Nothing Nothing Minute) >>= print+ run Sandbox (trades btcusd) >>= print+ run Sandbox time >>= print+ run Sandbox products >>= print+ run Sandbox (aggregateOrderBook btcusd (Just Best)) >>= print+ run Sandbox (aggregateOrderBook btcusd (Just TopFifty)) >>= print+ run Sandbox (fullOrderBook btcusd) >>= print+ runCbAuthT (run Sandbox) cpc $ do accounts >>= liftIO . print account aid >>= liftIO . print+ accountHistory aid >>= liftIO . print fills (Just btcusd) Nothing >>= liftIO . print listOrders (Just [All]) (Just btcusd) >>= liftIO . print placeOrder Nothing btcusd Sell (Size 0.001) (Price 99999.00) True Nothing Nothing Nothing >>= liftIO . print
src/lib/CoinbasePro/Authenticated.hs view
@@ -1,10 +1,13 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-} module CoinbasePro.Authenticated ( accounts , account+ , accountHistory+ , accountHolds , listOrders , getOrder , getClientOrder@@ -14,67 +17,155 @@ , fills , fees , trailingVolume+ , limits+ , deposits+ , withdrawals+ , transfer+ , makeDeposit+ , makeCoinbaseDeposit+ , cryptoDepositAddress+ , makeWithdrawal+ , makeCoinbaseWithdrawal+ , makeCryptoWithdrawal+ , withdrawalFeeEstimate+ , paymentMethods+ , coinbaseAccounts ) where +import Control.Monad (void)+import Data.Aeson (encode)+import qualified Data.ByteString.Builder as BB+import qualified Data.ByteString.Lazy.Char8 as LC8+import Data.Maybe (fromMaybe)+import qualified Data.Set as S+import Data.Text (Text, pack)+import Data.Text.Encoding (encodeUtf8)+import Data.Time.Clock (UTCTime)+import Data.UUID (toText)+import Network.HTTP.Types (SimpleQuery,+ SimpleQueryItem,+ encodePathSegments,+ methodDelete,+ methodGet,+ methodPost,+ renderQuery,+ simpleQueryToQuery)+import Servant.Client (ClientM) -import Control.Monad (void)-import Data.Aeson (encode)-import qualified Data.ByteString.Char8 as C8-import qualified Data.ByteString.Lazy.Char8 as LC8-import Data.Maybe (fromMaybe)-import qualified Data.Set as S-import Data.Text (Text, pack, toLower,- unpack)-import Data.UUID (toString)-import Network.HTTP.Types (SimpleQuery,- SimpleQueryItem,- methodDelete, methodGet,- methodPost, renderQuery,- simpleQueryToQuery)-import Servant.Client (ClientM)+import qualified CoinbasePro.Authenticated.API as API+import CoinbasePro.Authenticated.Accounts (Account,+ AccountHistory,+ AccountId (..),+ Fees, Hold,+ TrailingVolume (..))+import CoinbasePro.Authenticated.CoinbaseAccounts (CoinbaseAccount)+import CoinbasePro.Authenticated.Deposit (CoinbaseDepositRequest (..),+ CryptoDepositAddress,+ DepositRequest (..),+ DepositResponse)+import CoinbasePro.Authenticated.Fills (Fill)+import CoinbasePro.Authenticated.Limits (Limits)+import CoinbasePro.Authenticated.Orders (Order,+ PlaceOrderBody (..),+ STP, Status (..),+ Statuses (..),+ TimeInForce,+ statuses)+import CoinbasePro.Authenticated.Payment (PaymentMethod,+ PaymentMethodId (..))+import CoinbasePro.Authenticated.Request (CBAuthT (..),+ authRequest)+import CoinbasePro.Authenticated.Transfer (Transfer,+ TransferType (..))+import CoinbasePro.Authenticated.Withdrawal (CoinbaseWithdrawalRequest (..),+ CryptoWithdrawalRequest (..),+ CryptoWithdrawalResponse,+ WithdrawalFeeEstimateResponse (..),+ WithdrawalRequest (..),+ WithdrawalResponse)+import CoinbasePro.Request (RequestPath,+ emptyBody) -import CoinbasePro.Authenticated.Accounts (Account, AccountId (..),- Fees, TrailingVolume (..))-import qualified CoinbasePro.Authenticated.API as API-import CoinbasePro.Authenticated.Fills (Fill)-import CoinbasePro.Authenticated.Orders (Order, PlaceOrderBody (..),- STP, Status (..),- Statuses (..), TimeInForce,- statuses)-import CoinbasePro.Authenticated.Request (CBAuthT (..), authRequest)-import CoinbasePro.Request (RequestPath) +import CoinbasePro.Types (ClientOrderId (..),+ CryptoAddress (..),+ CurrencyType (..),+ OrderId (..),+ OrderType, Price,+ ProductId (..),+ ProfileId, Side,+ Size) -import CoinbasePro.Types (ClientOrderId (..),- OrderId (..), OrderType,- Price, ProductId (..),- Side, Size)+accountsPath :: Text+accountsPath = "accounts" --- | https://docs.pro.coinbase.com/?javascript#accounts+ordersPath :: Text+ordersPath = "orders"+++encodeRequestPath :: [Text] -> RequestPath+encodeRequestPath = LC8.toStrict . BB.toLazyByteString . encodePathSegments+++mkSimpleQueryItem :: Show a => Text -> a -> SimpleQueryItem+mkSimpleQueryItem s a = (encodeUtf8 s, encodeUtf8 $ pack (show a))+++optionalQuery :: Show a => Text -> Maybe a -> [SimpleQueryItem]+optionalQuery t = maybe [] (return . mkSimpleQueryItem t)+++mkProductQuery :: Maybe ProductId -> [SimpleQueryItem]+mkProductQuery = optionalQuery "product_id"+++mkOrderIdQuery :: Maybe OrderId -> SimpleQuery+mkOrderIdQuery = optionalQuery "order_id"+++-- | https://docs.pro.coinbase.com/#accounts accounts :: CBAuthT ClientM [Account]-accounts = authRequest methodGet "/accounts" "" API.accounts+accounts = authRequest methodGet requestPath emptyBody API.accounts+ where+ requestPath = encodeRequestPath [accountsPath] --- | https://docs.pro.coinbase.com/?javascript#get-an-account+-- | https://docs.pro.coinbase.com/#get-an-account account :: AccountId -> CBAuthT ClientM Account-account aid@(AccountId t) = authRequest methodGet requestPath "" $ API.singleAccount aid+account aid@(AccountId t) = authRequest methodGet requestPath emptyBody $ API.singleAccount aid where- requestPath = "/accounts/" ++ unpack t+ requestPath = encodeRequestPath [accountsPath, t] --- | https://docs.pro.coinbase.com/?javascript#list-orders+-- | https://docs.pro.coinbase.com/#get-account-history+accountHistory :: AccountId -> CBAuthT ClientM [AccountHistory]+accountHistory aid@(AccountId t) = authRequest methodGet requestPath emptyBody $ API.accountHistory aid+ where+ ledgerPath = "ledger"+ requestPath = encodeRequestPath [accountsPath, t, ledgerPath]+++-- | https://docs.pro.coinbase.com/#get-holds+accountHolds :: AccountId -> CBAuthT ClientM [Hold]+accountHolds aid@(AccountId t) = authRequest methodGet requestPath emptyBody $ API.accountHolds aid+ where+ holdsPath = "holds"+ requestPath = encodeRequestPath [accountsPath, t, holdsPath]+++-- | https://docs.pro.coinbase.com/#list-orders listOrders :: Maybe [Status] -> Maybe ProductId -> CBAuthT ClientM [Order]-listOrders st prid = authRequest methodGet (mkRequestPath "/orders") "" $ API.listOrders (defaultStatus st) prid+listOrders st prid = authRequest methodGet requestPath emptyBody $ API.listOrders (defaultStatus st) prid where- mkRequestPath :: RequestPath -> RequestPath- mkRequestPath rp = rp ++ (C8.unpack . renderQuery True . simpleQueryToQuery $ mkOrderQuery st prid)+ query = renderQuery True . simpleQueryToQuery $ orderQuery st prid+ requestPath = encodeRequestPath [ordersPath] <> query - mkOrderQuery :: Maybe [Status] -> Maybe ProductId -> SimpleQuery- mkOrderQuery ss p = mkStatusQuery ss <> mkProductQuery p+ orderQuery :: Maybe [Status] -> Maybe ProductId -> SimpleQuery+ orderQuery ss p = statusQuery ss <> mkProductQuery p - mkStatusQuery :: Maybe [Status] -> [SimpleQueryItem]- mkStatusQuery ss = mkSimpleQueryItem "status" . toLower . pack . show <$> S.toList (unStatuses . statuses $ defaultStatus ss)+ statusQuery :: Maybe [Status] -> [SimpleQueryItem]+ statusQuery ss = mkSimpleQueryItem "status" <$> S.toList (unStatuses . statuses $ defaultStatus ss) defaultStatus :: Maybe [Status] -> [Status] defaultStatus = fromMaybe [All]@@ -82,19 +173,20 @@ -- | https://docs.pro.coinbase.com/#get-an-order getOrder :: OrderId -> CBAuthT ClientM Order-getOrder oid = authRequest methodGet (mkRequestPath "/orders") "" $ API.getOrder oid+getOrder oid = authRequest methodGet requestPath emptyBody $ API.getOrder oid where- mkRequestPath rp = rp ++ "/" ++ unpack (unOrderId oid)+ requestPath = encodeRequestPath [ordersPath, unOrderId oid] -- | https://docs.pro.coinbase.com/#get-an-order getClientOrder :: ClientOrderId -> CBAuthT ClientM Order-getClientOrder cloid = authRequest methodGet (mkRequestPath "/orders/client:") "" $ API.getClientOrder cloid+getClientOrder cloid = authRequest methodGet requestPath emptyBody $ API.getClientOrder cloid where- mkRequestPath rp = rp ++ toString (unClientOrderId cloid)+ oid = toText $ unClientOrderId cloid+ requestPath = encodeRequestPath [ordersPath, "client:" <> oid] --- | https://docs.pro.coinbase.com/?javascript#place-a-new-order+-- | https://docs.pro.coinbase.com/#place-a-new-order placeOrder :: Maybe ClientOrderId -> ProductId -> Side@@ -106,63 +198,203 @@ -> Maybe TimeInForce -> CBAuthT ClientM Order placeOrder clordid prid sd sz price po ot stp tif =- authRequest methodPost "/orders" (LC8.unpack $ encode body) $ API.placeOrder body+ authRequest methodPost requestPath seBody $ API.placeOrder body where- body = PlaceOrderBody clordid prid sd sz price po ot stp tif+ requestPath = encodeRequestPath [ordersPath]+ body = PlaceOrderBody clordid prid sd sz price po ot stp tif+ seBody = LC8.toStrict $ encode body --- | https://docs.pro.coinbase.com/?javascript#cancel-an-order+-- | https://docs.pro.coinbase.com/#cancel-an-order cancelOrder :: OrderId -> CBAuthT ClientM ()-cancelOrder oid = void . authRequest methodDelete (mkRequestPath "/orders") "" $ API.cancelOrder oid+cancelOrder oid = void . authRequest methodDelete requestPath emptyBody $ API.cancelOrder oid where- mkRequestPath :: RequestPath -> RequestPath- mkRequestPath rp = rp ++ "/" ++ unpack (unOrderId oid)+ requestPath = encodeRequestPath [ordersPath, unOrderId oid] --- | https://docs.pro.coinbase.com/?javascript#cancel-all+-- | https://docs.pro.coinbase.com/#cancel-all cancelAll :: Maybe ProductId -> CBAuthT ClientM [OrderId]-cancelAll prid = authRequest methodDelete (mkRequestPath "/orders") "" (API.cancelAll prid)+cancelAll prid = authRequest methodDelete requestPath emptyBody (API.cancelAll prid) where- mkRequestPath :: RequestPath -> RequestPath- mkRequestPath rp = rp ++ (C8.unpack . renderQuery True . simpleQueryToQuery $ mkProductQuery prid)+ query = renderQuery True . simpleQueryToQuery $ mkProductQuery prid+ requestPath = encodeRequestPath [ordersPath] <> query --- | https://docs.pro.coinbase.com/?javascript#fills+-- | https://docs.pro.coinbase.com/#fills fills :: Maybe ProductId -> Maybe OrderId -> CBAuthT ClientM [Fill]-fills prid oid = authRequest methodGet mkRequestPath "" (API.fills prid oid)+fills prid oid = authRequest methodGet requestPath emptyBody (API.fills prid oid) where- brp = "/fills"-- mkRequestPath :: RequestPath- mkRequestPath = brp ++ (C8.unpack . renderQuery True . simpleQueryToQuery $ mkSimpleQuery prid oid)+ fillsPath = "fills"+ query = renderQuery True . simpleQueryToQuery $ mkSimpleQuery prid oid+ requestPath = encodeRequestPath [fillsPath] <> query mkSimpleQuery :: Maybe ProductId -> Maybe OrderId -> SimpleQuery mkSimpleQuery p o = mkProductQuery p <> mkOrderIdQuery o --- | https://docs.pro.coinbase.com/?javascript#get-current-fees+-- | https://docs.pro.coinbase.com/#get-current-fees fees :: CBAuthT ClientM Fees-fees = authRequest methodGet mkRequestPath "" API.fees+fees = authRequest methodGet feesRequestPath emptyBody API.fees where- mkRequestPath :: RequestPath- mkRequestPath = "/fees"+ feesPath = "fees"+ feesRequestPath = encodeRequestPath [feesPath] --- | https://docs.pro.coinbase.com/?javascript#trailing-volume+-- | https://docs.pro.coinbase.com/#trailing-volume trailingVolume :: CBAuthT ClientM [TrailingVolume]-trailingVolume = authRequest methodGet mkRequestPath "" API.trailingVolume+trailingVolume = authRequest methodGet requestPath emptyBody API.trailingVolume where- mkRequestPath :: RequestPath- mkRequestPath = "/users/self/trailing-volume"+ requestPath = encodeRequestPath ["users", "self", "trailing-volume"] -mkSimpleQueryItem :: String -> Text -> SimpleQueryItem-mkSimpleQueryItem s t = (C8.pack s, C8.pack $ unpack t)+-- | https://docs.pro.coinbase.com/#get-current-exchange-limits+limits :: CBAuthT ClientM Limits+limits = authRequest methodGet requestPath emptyBody API.limits+ where+ requestPath = encodeRequestPath ["users", "self", "exchange-limits"] -mkProductQuery :: Maybe ProductId -> [SimpleQueryItem]-mkProductQuery = maybe [] (return . mkSimpleQueryItem "product_id" . unProductId)+-- | https://docs.pro.coinbase.com/#list-deposits+deposits :: Maybe ProfileId+ -> Maybe UTCTime+ -> Maybe UTCTime+ -> Maybe Int+ -> CBAuthT ClientM [Transfer]+deposits = transfers DepositTransferType -mkOrderIdQuery :: Maybe OrderId -> SimpleQuery-mkOrderIdQuery = maybe [] (return . mkSimpleQueryItem "order_id" . unOrderId)+-- | https://docs.pro.coinbase.com/#list-withdrawals+withdrawals :: Maybe ProfileId+ -> Maybe UTCTime+ -> Maybe UTCTime+ -> Maybe Int+ -> CBAuthT ClientM [Transfer]+withdrawals = transfers WithdrawTransferType+++transfers :: TransferType+ -> Maybe ProfileId+ -> Maybe UTCTime+ -> Maybe UTCTime+ -> Maybe Int+ -> CBAuthT ClientM [Transfer]+transfers tt prof before after lm = authRequest methodGet requestPath emptyBody $+ API.transfers tt prof before after lm+ where+ typeQ = return $ mkSimpleQueryItem "type" tt+ profQ = optionalQuery "profile_id" prof+ beforeQ = optionalQuery "before" before+ afterQ = optionalQuery "after" after+ lmQ = optionalQuery "limit" lm++ query = renderQuery True . simpleQueryToQuery $ typeQ <> profQ <> beforeQ <> afterQ <> lmQ+ requestPath = encodeRequestPath ["transfers"] <> query+++-- | https://docs.pro.coinbase.com/#single-deposit+-- | https://docs.pro.coinbase.com/#single-withdrawal+transfer :: PaymentMethodId -> CBAuthT ClientM Transfer+transfer pmt@(PaymentMethodId p) = authRequest methodGet requestPath emptyBody $ API.transfer pmt+ where+ requestPath = encodeRequestPath ["transfers", p]+++-- | https://docs.pro.coinbase.com/#payment-method+makeDeposit :: Double+ -> Text+ -> PaymentMethodId+ -> CBAuthT ClientM DepositResponse+makeDeposit amt cur pmi =+ authRequest methodPost requestPath seBody $ API.makeDeposit body+ where+ requestPath = encodeRequestPath ["deposits", "payment-method"]+ body = DepositRequest amt cur pmi+ seBody = LC8.toStrict $ encode body+++-- | https://docs.pro.coinbase.com/#coinbase+makeCoinbaseDeposit :: Double+ -> Text+ -> AccountId+ -> CBAuthT ClientM DepositResponse+makeCoinbaseDeposit amt cur act =+ authRequest methodPost requestPath seBody $ API.makeCoinbaseDeposit body+ where+ requestPath = encodeRequestPath ["deposits", "coinbase-account"]+ body = CoinbaseDepositRequest amt cur act+ seBody = LC8.toStrict $ encode body+++-- | https://docs.pro.coinbase.com/#generate-a-crypto-deposit-address+cryptoDepositAddress :: AccountId -> CBAuthT ClientM CryptoDepositAddress+cryptoDepositAddress act =+ authRequest methodPost requestPath emptyBody $ API.cryptoDepositAddress act+ where+ requestPath = encodeRequestPath ["coinbase-accounts", pack $ show act, "addresses"]+++-- | https://docs.pro.coinbase.com/#payment-method55+makeWithdrawal :: Double+ -> Text+ -> PaymentMethodId+ -> CBAuthT ClientM WithdrawalResponse+makeWithdrawal amt cur pmi =+ authRequest methodPost requestPath seBody $ API.makeWithdrawal body+ where+ requestPath = encodeRequestPath ["withdrawals", "payment-method"]+ body = WithdrawalRequest amt cur pmi+ seBody = LC8.toStrict $ encode body+++-- | https://docs.pro.coinbase.com/#coinbase56+makeCoinbaseWithdrawal :: Double+ -> Text+ -> AccountId+ -> CBAuthT ClientM WithdrawalResponse+makeCoinbaseWithdrawal amt cur act =+ authRequest methodPost requestPath seBody $ API.makeCoinbaseWithdrawal body+ where+ requestPath = encodeRequestPath ["withdrawals", "coinbase-account"]+ body = CoinbaseWithdrawalRequest amt cur act+ seBody = LC8.toStrict $ encode body+++-- | https://docs.pro.coinbase.com/#crypto+makeCryptoWithdrawal :: Double+ -> Text+ -> Text+ -> CBAuthT ClientM CryptoWithdrawalResponse+makeCryptoWithdrawal amt cur addr =+ authRequest methodPost requestPath seBody $ API.makeCryptoWithdrawal body+ where+ requestPath = encodeRequestPath ["withdrawals", "crypto"]+ body = CryptoWithdrawalRequest amt cur addr+ seBody = LC8.toStrict $ encode body+++-- | https://docs.pro.coinbase.com/#fee-estimate+withdrawalFeeEstimate :: CurrencyType+ -> CryptoAddress+ -> CBAuthT ClientM WithdrawalFeeEstimateResponse+withdrawalFeeEstimate cur addr =+ authRequest methodGet requestPath emptyBody $ API.withdrawalFeeEstimate cur addr+ where+ curQ = return $ mkSimpleQueryItem "currency" cur+ addrQ = return $ mkSimpleQueryItem "crypto_address" addr++ query = renderQuery True . simpleQueryToQuery $ curQ <> addrQ+ requestPath = encodeRequestPath ["withdrawals", "fee-estimate"] <> query+++-- | https://docs.pro.coinbase.com/#list-payment-methods+paymentMethods :: CBAuthT ClientM [PaymentMethod]+paymentMethods = authRequest methodGet requestPath emptyBody API.paymentMethods+ where+ requestPath = encodeRequestPath ["payment-methods"]+++-- | https://docs.pro.coinbase.com/#list-accounts64+coinbaseAccounts :: CBAuthT ClientM [CoinbaseAccount]+coinbaseAccounts = authRequest methodGet requestPath emptyBody API.coinbaseAccounts+ where+ requestPath = encodeRequestPath ["coinbase-accounts"]
src/lib/CoinbasePro/Authenticated/API.hs view
@@ -5,6 +5,8 @@ module CoinbasePro.Authenticated.API ( accounts , singleAccount+ , accountHistory+ , accountHolds , listOrders , getOrder , getClientOrder@@ -14,30 +16,72 @@ , fills , fees , trailingVolume+ , limits+ , transfers+ , transfer+ , makeDeposit+ , makeCoinbaseDeposit+ , cryptoDepositAddress+ , makeWithdrawal+ , makeCoinbaseWithdrawal+ , makeCryptoWithdrawal+ , withdrawalFeeEstimate+ , paymentMethods+ , coinbaseAccounts ) where -import Data.Proxy (Proxy (..))-import Servant.API ((:<|>) (..), (:>),- AuthProtect, Capture, JSON,- NoContent, QueryParam,- QueryParams, ReqBody)+import Data.Proxy (Proxy (..))+import Data.Time.Clock (UTCTime)+import Servant.API (AuthProtect,+ Capture, JSON,+ NoContent,+ QueryParam,+ QueryParam',+ QueryParams,+ ReqBody, Required,+ (:<|>) (..), (:>)) import Servant.Client-import Servant.Client.Core (AuthenticatedRequest)+import Servant.Client.Core (AuthenticatedRequest) -import CoinbasePro.Authenticated.Accounts (Account, AccountId (..),- Fees, TrailingVolume)-import CoinbasePro.Authenticated.Fills (Fill)-import CoinbasePro.Authenticated.Orders (Order, PlaceOrderBody (..),- Status (..))-import CoinbasePro.Authenticated.Request (AuthDelete, AuthGet,- AuthPost)-import CoinbasePro.Types (ClientOrderId (..),- OrderId (..),- ProductId (..))+import CoinbasePro.Authenticated.Accounts (Account,+ AccountHistory,+ AccountId (..),+ Fees, Hold,+ TrailingVolume)+import CoinbasePro.Authenticated.CoinbaseAccounts (CoinbaseAccount)+import CoinbasePro.Authenticated.Deposit (CoinbaseDepositRequest,+ CryptoDepositAddress,+ DepositRequest,+ DepositResponse)+import CoinbasePro.Authenticated.Fills (Fill)+import CoinbasePro.Authenticated.Limits (Limits)+import CoinbasePro.Authenticated.Orders (Order,+ PlaceOrderBody (..),+ Status (..))+import CoinbasePro.Authenticated.Payment (PaymentMethod (..),+ PaymentMethodId)+import CoinbasePro.Authenticated.Request (AuthDelete,+ AuthGet, AuthPost)+import CoinbasePro.Authenticated.Transfer (Transfer,+ TransferType)+import CoinbasePro.Authenticated.Withdrawal (CoinbaseWithdrawalRequest (..),+ CryptoWithdrawalRequest,+ CryptoWithdrawalResponse,+ WithdrawalFeeEstimateResponse,+ WithdrawalRequest,+ WithdrawalResponse)+import CoinbasePro.Types (ClientOrderId (..),+ CryptoAddress,+ CurrencyType,+ OrderId (..),+ ProductId (..),+ ProfileId) type API = "accounts" :> AuthGet [Account]- :<|> "accounts" :> Capture "account-id" AccountId :> AuthGet Account+ :<|> "accounts" :> Capture "account_id" AccountId :> AuthGet Account+ :<|> "accounts" :> Capture "account_id" AccountId :> "ledger" :> AuthGet [AccountHistory]+ :<|> "accounts" :> Capture "account_id" AccountId :> "holds" :> AuthGet [Hold] :<|> "orders" :> QueryParams "status" Status :> QueryParam "product_id" ProductId :> AuthGet [Order] :<|> "orders" :> Capture "order_id" OrderId :> AuthGet Order :<|> "orders" :> Capture "client_oid" ClientOrderId :> AuthGet Order@@ -47,6 +91,27 @@ :<|> "fills" :> QueryParam "product_id" ProductId :> QueryParam "order_id" OrderId :> AuthGet [Fill] :<|> "fees" :> AuthGet Fees :<|> "users" :> "self" :> "trailing-volume" :> AuthGet [TrailingVolume]+ :<|> "users" :> "self" :> "exchange-limits" :> AuthGet Limits+ :<|> "transfers"+ :> QueryParam' '[Required] "type" TransferType+ :> QueryParam "profile_id" ProfileId+ :> QueryParam "before" UTCTime+ :> QueryParam "after" UTCTime+ :> QueryParam "limit" Int+ :> AuthGet [Transfer]+ :<|> "transfers" :> Capture "transfer_id" PaymentMethodId :> AuthGet Transfer+ :<|> "deposits" :> "payment-method" :> ReqBody '[JSON] DepositRequest :> AuthPost DepositResponse+ :<|> "deposits" :> "coinbase-account" :> ReqBody '[JSON] CoinbaseDepositRequest :> AuthPost DepositResponse+ :<|> "coinbase-accounts" :> Capture "account_id" AccountId :> "addresses" :> AuthPost CryptoDepositAddress+ :<|> "withdrawals" :> "payment-method" :> ReqBody '[JSON] WithdrawalRequest :> AuthPost WithdrawalResponse+ :<|> "withdrawals" :> "coinbase-account" :> ReqBody '[JSON] CoinbaseWithdrawalRequest :> AuthPost WithdrawalResponse+ :<|> "withdrawals" :> "crypto" :> ReqBody '[JSON] CryptoWithdrawalRequest :> AuthPost CryptoWithdrawalResponse+ :<|> "withdrawals" :> "fee-estimate"+ :> QueryParam' '[Required] "currency" CurrencyType+ :> QueryParam' '[Required] "crypto_address" CryptoAddress+ :> AuthGet WithdrawalFeeEstimateResponse+ :<|> "payment-methods" :> AuthGet [PaymentMethod]+ :<|> "coinbase-accounts" :> AuthGet [CoinbaseAccount] api :: Proxy API@@ -55,6 +120,8 @@ accounts :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [Account] singleAccount :: AccountId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM Account+accountHistory :: AccountId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [AccountHistory]+accountHolds :: AccountId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [Hold] listOrders :: [Status] -> Maybe ProductId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [Order] getOrder :: OrderId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM Order getClientOrder :: ClientOrderId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM Order@@ -64,4 +131,20 @@ fills :: Maybe ProductId -> Maybe OrderId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [Fill] fees :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM Fees trailingVolume :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [TrailingVolume]-accounts :<|> singleAccount :<|> listOrders :<|> getOrder :<|> getClientOrder :<|> placeOrder :<|> cancelOrder :<|> cancelAll :<|> fills :<|> fees :<|> trailingVolume = client api+limits :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM Limits+transfers :: TransferType -> Maybe ProfileId -> Maybe UTCTime -> Maybe UTCTime -> Maybe Int -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [Transfer]+transfer :: PaymentMethodId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM Transfer+makeDeposit :: DepositRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM DepositResponse+makeCoinbaseDeposit :: CoinbaseDepositRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM DepositResponse+cryptoDepositAddress :: AccountId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM CryptoDepositAddress+makeWithdrawal :: WithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM WithdrawalResponse+makeCoinbaseWithdrawal :: CoinbaseWithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM WithdrawalResponse+makeCryptoWithdrawal :: CryptoWithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM CryptoWithdrawalResponse+withdrawalFeeEstimate :: CurrencyType -> CryptoAddress -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM WithdrawalFeeEstimateResponse+paymentMethods :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [PaymentMethod]+coinbaseAccounts :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [CoinbaseAccount]+accounts+ :<|> singleAccount :<|> accountHistory :<|> accountHolds :<|> listOrders :<|> getOrder :<|> getClientOrder :<|> placeOrder+ :<|> cancelOrder :<|> cancelAll :<|> fills :<|> fees :<|> trailingVolume :<|> limits :<|> transfers :<|> transfer+ :<|> makeDeposit :<|> makeCoinbaseDeposit :<|> cryptoDepositAddress :<|> makeWithdrawal :<|> makeCoinbaseWithdrawal+ :<|> makeCryptoWithdrawal :<|> withdrawalFeeEstimate :<|> paymentMethods :<|> coinbaseAccounts = client api
src/lib/CoinbasePro/Authenticated/Accounts.hs view
@@ -10,23 +10,39 @@ , ProfileId (..) , Fees (..) , TrailingVolume (..)+ , AccountHistory (..)+ , Hold (..) ) where -import Data.Aeson (FromJSON (..), ToJSON, withObject, (.:))+import Data.Aeson (FromJSON (..), ToJSON, withObject, withText,+ (.:), (.:?))+import qualified Data.Aeson as A import Data.Aeson.Casing (snakeCase)-import Data.Aeson.TH (defaultOptions, deriveJSON,- fieldLabelModifier)-import Data.Text (Text)+import Data.Aeson.TH (constructorTagModifier, defaultOptions,+ deriveJSON, fieldLabelModifier)+import qualified Data.Char as Char+import Data.Text (Text, pack, unpack) import Data.Time.Clock (UTCTime)+import Text.Printf (printf) import Web.HttpApiData (ToHttpApiData (..)) -import CoinbasePro.Types (ProductId, Volume (..))+import CoinbasePro.Types (CreatedAt (..), OrderId, ProductId,+ TradeId (..), Volume (..)) newtype AccountId = AccountId Text- deriving (Eq, Show)+ deriving Eq +instance Show AccountId where+ show (AccountId t) = unpack t+++deriveJSON defaultOptions+ { fieldLabelModifier = snakeCase+ } ''AccountId++ instance ToHttpApiData AccountId where toUrlPiece (AccountId aid) = aid toQueryParam (AccountId aid) = aid@@ -40,6 +56,15 @@ deriving (Eq, Show) +instance ToJSON Balance where+ toJSON (Balance s) = A.String . pack $ printf "%.16f" s+++instance FromJSON Balance where+ parseJSON = withText "balance" $ \t ->+ return . Balance . read $ unpack t++ newtype ProfileId = ProfileId Text deriving (Eq, Show) @@ -91,3 +116,73 @@ deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''TrailingVolume+++data AccountHistoryType = Transfer | Match | Fee | Rebate | Conversion+ deriving (Eq, Show)+++deriveJSON defaultOptions { constructorTagModifier = fmap Char.toLower } ''AccountHistoryType+++data Details = Details+ { dOrderId :: Maybe OrderId+ , dTradeId :: Maybe TradeId+ , dProductId :: Maybe ProductId+ } deriving (Eq, Show)+++instance FromJSON Details where+ parseJSON = withObject "details" $ \o -> Details+ <$> (o .:? "order_id")+ <*> (fmap (TradeId . read) <$> o .:? "trade_id")+ <*> (o .:? "product_id")+++data AccountHistory = AccountHistory+ { hAccountId :: AccountId+ , hCreatedAt :: CreatedAt+ , hAmount :: Double+ , hBalance :: Balance+ , hType :: AccountHistoryType+ , hDetails :: Maybe Details+ } deriving (Eq, Show)+++instance FromJSON AccountHistory where+ parseJSON = withObject "account_history" $ \o -> AccountHistory+ <$> (AccountId <$> o .: "id")+ <*> (CreatedAt <$> o .: "created_at")+ <*> (read <$> o .: "amount")+ <*> (Balance . read <$> o .: "balance")+ <*> (o .: "type")+ <*> (o .: "details")+++newtype HoldId = HoldId Text+ deriving (Eq, Show, ToJSON, FromJSON)+++data HoldType = Order | HoldTransfer+ deriving (Eq, Show)+++newtype HoldRef = HoldRef Text+ deriving (Eq, Show, ToJSON, FromJSON)+++deriveJSON defaultOptions { constructorTagModifier = fmap Char.toLower } ''HoldType+++data Hold = Hold+ { holdId :: HoldId+ , holdAccountId :: AccountId+ , holdCreatedAt :: CreatedAt+ , holdUpdatedAt :: CreatedAt+ , holdAmount :: Double+ , holdType :: HoldType+ , holdRef :: HoldRef+ } deriving (Eq, Show)+++deriveJSON defaultOptions { constructorTagModifier = fmap Char.toLower . drop 4, fieldLabelModifier = snakeCase } ''Hold
+ src/lib/CoinbasePro/Authenticated/CoinbaseAccounts.hs view
@@ -0,0 +1,140 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}++module CoinbasePro.Authenticated.CoinbaseAccounts+ ( CoinbaseAccount (..)+ ) where++import Data.Aeson (FromJSON (..), Value (..), withObject, (.:),+ (.:?))+import Data.Aeson.Casing (snakeCase)+import Data.Aeson.TH (defaultOptions, deriveJSON,+ fieldLabelModifier)+import Data.Text (Text)+++data BankCountry = BankCountry+ { code :: Text+ , name :: Text+ } deriving Show+++deriveJSON defaultOptions+ { fieldLabelModifier = snakeCase+ } ''BankCountry+++data WireDepositInformation = WireDepositInformation+ { accountNumber :: Maybe Text+ , routingNumber :: Text+ , bankName :: Text+ , bankAddress :: Text+ , bankCountry :: BankCountry+ , accountName :: Text+ , accountAddress :: Text+ , reference :: Text+ } deriving Show+++instance FromJSON WireDepositInformation where+ parseJSON = withObject "wire deposit information" $ \o -> WireDepositInformation+ <$> o .: "account_number"+ <*> o .: "routing_number"+ <*> o .: "bank_name"+ <*> o .: "bank_address"+ <*> (parseJSON =<< (o .: "bank_country"))+ <*> o .: "account_name"+ <*> o .: "account_address"+ <*> o .: "reference"+++data SepaDepositInformation = SepaDepositInformation+ { sIban :: Text+ , sSwift :: Text+ , sBankName :: Text+ , sBankAddress :: Text+ , sBankCountryName :: Text+ , sAccountName :: Text+ , sAccountAddress :: Text+ , sReference :: Text+ } deriving Show+++deriveJSON defaultOptions+ { fieldLabelModifier = snakeCase . drop 1+ } ''SepaDepositInformation+++data DepositInformation = Wire WireDepositInformation | Sepa SepaDepositInformation+ deriving Show+++-- TODO: this is slightly messy, potentially refactor+instance FromJSON DepositInformation where+ parseJSON = withObject "deposit_information" $ \o -> do+ w <- o .:? "wire_deposit_information"+ case w of+ Just (Object w') -> Wire <$> parseJSON (Object w')+ Nothing -> do+ s <- o .:? "sepa_deposit_information"+ case s of+ Just (Object s') -> Sepa <$> parseJSON (Object s')+ _ -> fail "Unable to parse deposit information"+ _ -> fail "Unable to parse deposit information"+++data Account = Account+ { aId :: Text+ , aName :: Text+ , aBalance :: Double+ , aCurrency :: Text+ , aType :: Text+ , aPrimary :: Bool+ , aActive :: Bool+ } deriving (Show)+++instance FromJSON Account where+ parseJSON = withObject "account" $ \o -> Account+ <$> o .: "id"+ <*> o .: "name"+ <*> (read <$> o .: "balance")+ <*> o .: "currency"+ <*> o .: "type"+ <*> o .: "primary"+ <*> o .: "active"+++data FiatAccount = FiatAccount+ { fAccount :: Account+ , fDepositInformation :: DepositInformation+ } deriving Show+++instance FromJSON FiatAccount where+ parseJSON = withObject "fiat account" $ \o -> FiatAccount+ <$> parseJSON (Object o)+ <*> parseJSON (Object o)+++newtype CryptoAccount = CryptoAccount Account+ deriving Show+++instance FromJSON CryptoAccount where+ parseJSON = withObject "crypto account" $ \o -> CryptoAccount+ <$> parseJSON (Object o)+++data CoinbaseAccount = Fiat FiatAccount | Crypto CryptoAccount+ deriving Show+++instance FromJSON CoinbaseAccount where+ parseJSON = withObject "coinbase account" $ \o -> do+ t <- String <$> o .: "type"+ case t of+ "fiat" -> Fiat <$> parseJSON (Object o)+ "wallet" -> Crypto <$> parseJSON (Object o)+ _ -> fail "Unable to parse coinbase account"
+ src/lib/CoinbasePro/Authenticated/Deposit.hs view
@@ -0,0 +1,92 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}++module CoinbasePro.Authenticated.Deposit+ ( DepositDetails (..)+ , DepositRequest (..)+ , DepositResponse (..)+ , CoinbaseDepositRequest (..)+ , CryptoDepositAddress (..)+ ) where++import Data.Aeson.Casing (snakeCase)+import Data.Aeson.TH (defaultOptions, deriveJSON,+ fieldLabelModifier)+import Data.Text (Text)+import Data.Time.Clock (UTCTime)+import Data.UUID (UUID)++import CoinbasePro.Authenticated.Accounts (AccountId)+import CoinbasePro.Authenticated.Payment (PaymentMethodId (..))+import CoinbasePro.Types (CreatedAt)+++data DepositDetails = DepositDetails+ { cryptoAddress :: Maybe Text+ , destinationTag :: Maybe Text+ , coinbaseAccountId :: AccountId+ , destinationTagName :: Maybe Text+ , coinbaseTransactionId :: Text+ , cryptoTransactionHash :: Maybe Text+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''DepositDetails+++data DepositRequest = DepositRequest+ { amount :: Double+ , currency :: Text+ , paymentMethodId :: PaymentMethodId+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''DepositRequest+++data CoinbaseDepositRequest = CoinbaseDepositRequest+ { cAmount :: Double+ , cCurrency :: Text+ , cCoinbaseAccountId :: AccountId+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 1 } ''CoinbaseDepositRequest+++data DepositResponse = DepositResponse+ { rId :: UUID+ , rAmount :: Double+ , rCurrency :: Text+ , rPayoutAt :: UTCTime+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 1 } ''DepositResponse+++data AddressInfo = AddressInfo+ { aiAddress :: Text+ , aiDestinationTag :: Maybe Int+ } deriving Show+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 2 } ''AddressInfo+++data CryptoDepositAddress = CryptoDepositAddress+ { cdaId :: UUID+ , cdaAddress :: Text+ , cdaDestinationTag :: Maybe Int+ , cdaAddressInfo :: AddressInfo+ , cdaCreatedAt :: CreatedAt+ , cdaUpdatedAt :: UTCTime+ , cdaNetwork :: Text+ , cdaResource :: Text+ , cdaDepositUri :: Text+ , cdaExchangeDepositAddress :: Bool+ } deriving Show+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 3 } ''CryptoDepositAddress
src/lib/CoinbasePro/Authenticated/Headers.hs view
@@ -6,23 +6,24 @@ ) where import Data.Aeson (ToJSON (..), Value (String))+import qualified Data.Aeson as A import Data.ByteString (ByteString)-import Data.Text (pack)+import Data.Text (Text) import Data.Text.Encoding (decodeUtf8) import Web.HttpApiData (ToHttpApiData (..)) -newtype CBAccessKey = CBAccessKey String+newtype CBAccessKey = CBAccessKey Text deriving (Eq, Show) instance ToHttpApiData CBAccessKey where- toUrlPiece (CBAccessKey k) = pack k- toQueryParam (CBAccessKey k) = pack k+ toUrlPiece (CBAccessKey k) = k+ toQueryParam (CBAccessKey k) = k instance ToJSON CBAccessKey where- toJSON (CBAccessKey k) = String $ pack k+ toJSON (CBAccessKey k) = A.String k newtype CBAccessSign = CBAccessSign ByteString@@ -35,30 +36,30 @@ instance ToJSON CBAccessSign where- toJSON (CBAccessSign s) = String $ decodeUtf8 s+ toJSON (CBAccessSign s) = A.String $ decodeUtf8 s -newtype CBAccessTimeStamp = CBAccessTimeStamp String+newtype CBAccessTimeStamp = CBAccessTimeStamp Text deriving (Eq, Show) instance ToHttpApiData CBAccessTimeStamp where- toUrlPiece (CBAccessTimeStamp ts) = pack ts- toQueryParam (CBAccessTimeStamp ts) = pack ts+ toUrlPiece (CBAccessTimeStamp ts) = ts+ toQueryParam (CBAccessTimeStamp ts) = ts instance ToJSON CBAccessTimeStamp where- toJSON (CBAccessTimeStamp ts) = String $ pack ts+ toJSON (CBAccessTimeStamp ts) = String ts -newtype CBAccessPassphrase = CBAccessPassphrase String+newtype CBAccessPassphrase = CBAccessPassphrase Text deriving (Eq, Show) instance ToJSON CBAccessPassphrase where- toJSON (CBAccessPassphrase p) = String $ pack p+ toJSON (CBAccessPassphrase p) = A.String p instance ToHttpApiData CBAccessPassphrase where- toUrlPiece (CBAccessPassphrase p) = pack p- toQueryParam (CBAccessPassphrase p) = pack p+ toUrlPiece (CBAccessPassphrase p) = p+ toQueryParam (CBAccessPassphrase p) = p
+ src/lib/CoinbasePro/Authenticated/Limits.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE TemplateHaskell #-}++module CoinbasePro.Authenticated.Limits+ ( Limits (..)+ ) where++import Data.Aeson (FromJSON, ToJSON, parseJSON, withText)+import Data.Aeson.Casing (snakeCase)+import Data.Aeson.TH (defaultOptions, deriveJSON,+ fieldLabelModifier)+import Data.Map.Strict (Map)+import Data.Text (Text, unpack)++import CoinbasePro.Types (ProductId)+++newtype LimitCurrency = LimitCurrency Text+ deriving (Eq, Show, ToJSON, FromJSON)+++newtype Max = Max Double+ deriving (Eq, Show, ToJSON, FromJSON)+++newtype Remaining = Remaining Double+ deriving (Eq, Show, ToJSON, FromJSON)+++newtype PeriodInDays = PeriodInDays Int+ deriving (Eq, Show, ToJSON)+++instance FromJSON PeriodInDays where+ parseJSON = withText "period_in_days" $ \t ->+ return . PeriodInDays . read $ unpack t+++data Limit = Limit+ { max :: Max+ , remaining :: Remaining+ , periodInDays :: Maybe PeriodInDays+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''Limit+++type LimitMap = Map ProductId Limit+++data TransferLimits = TransferLimits+ { ach :: Maybe LimitMap+ , achNoBalance :: Maybe LimitMap+ , creditDebitCard :: Maybe LimitMap+ , achCurm :: Maybe LimitMap+ , secure3dBuy :: Maybe LimitMap+ , exchangeWithdraw :: Maybe LimitMap+ , exchangeAch :: Maybe LimitMap+ , paypalWithdrawal :: Maybe LimitMap+ , instantAchWithdrawal :: Maybe LimitMap+ , instantBuy :: Maybe LimitMap+ , buy :: Maybe LimitMap+ , sell :: Maybe LimitMap+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''TransferLimits+++data Limits = Limits+ { limitCurrency :: LimitCurrency+ , transferLimits :: TransferLimits+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''Limits
src/lib/CoinbasePro/Authenticated/Orders.hs view
@@ -30,12 +30,20 @@ -- TODO: All is not a status data Status = Open | Pending | Active | Done | All- deriving (Eq, Ord, Show)+ deriving (Eq, Ord) +instance Show Status where+ show Open = "open"+ show Pending = "pending"+ show Active = "active"+ show Done = "done"+ show All = "all"++ instance ToHttpApiData Status where- toUrlPiece = toLower . pack . show- toQueryParam = toLower . pack . show+ toUrlPiece = pack . show+ toQueryParam = pack . show newtype Statuses = Statuses { unStatuses :: Set Status }
+ src/lib/CoinbasePro/Authenticated/Payment.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}++module CoinbasePro.Authenticated.Payment+ ( PaymentMethodId (..)+ , PaymentMethod (..)+ ) where++import Data.Aeson.Casing (snakeCase)+import Data.Aeson.TH (defaultOptions, deriveJSON,+ fieldLabelModifier)+import Data.Text (Text, toLower, unpack)+import Servant.API+++newtype PaymentMethodId = PaymentMethodId Text+ deriving Eq+++instance Show PaymentMethodId where+ show (PaymentMethodId p) = unpack p+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''PaymentMethodId+++instance ToHttpApiData PaymentMethodId where+ toUrlPiece (PaymentMethodId p) = toLower p+ toQueryParam (PaymentMethodId p) = toLower p+++data LimitTotal = LimitTotal+ { ltAmount :: Double+ , ltCurrency :: Text+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 2} ''LimitTotal+++data LimitRemaining = LimitRemaining+ { lrAmount :: Double+ , lrCurrency :: Text+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 2} ''LimitRemaining+++data Limit = Limit+ { periodInDays :: Int+ , total :: LimitTotal+ , remaining :: LimitRemaining+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''Limit+++data PaymentMethod = PaymentMethod+ { pmId :: PaymentMethodId+ , pmType :: Text+ , pmName :: Text+ , pmCurrency :: Text+ , pmPrimaryBuy :: Bool+ , pmPrimarySell :: Bool+ , pmAllowBuy :: Bool+ , pmAllowSell :: Bool+ , pmAllowDeposit :: Bool+ , pmAllowWithdraw :: Bool+ , pmBuyLimits :: Maybe [Limit]+ , pmInstantBuyLimits :: Maybe [Limit]+ , pmSellLimits :: Maybe [Limit]+ , pmDepositLimits :: Maybe [Limit]+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 2 } ''PaymentMethod
src/lib/CoinbasePro/Authenticated/Request.hs view
@@ -30,13 +30,15 @@ convertToBase) import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as C8+import Data.Text (pack)+import Data.Text.Encoding (encodeUtf8) import Data.Time.Clock (getCurrentTime) import Data.Time.Format (defaultTimeLocale, formatTime) import GHC.TypeLits (Symbol) import Network.HTTP.Types (Method)-import Servant.API ((:>), AuthProtect, Delete,- Get, JSON, Post)+import Servant.API (AuthProtect, Delete, Get,+ JSON, Post, (:>)) import Servant.Client (ClientM) import Servant.Client.Core (AuthClientData, AuthenticatedRequest,@@ -105,7 +107,7 @@ mkCBAccessTimeStamp :: IO CBAccessTimeStamp-mkCBAccessTimeStamp = CBAccessTimeStamp . formatTime defaultTimeLocale "%s%Q" <$> getCurrentTime+mkCBAccessTimeStamp = CBAccessTimeStamp . pack . formatTime defaultTimeLocale "%s%Q" <$> getCurrentTime mkCBAccessSign :: CBSecretKey -> CBAccessTimeStamp -> Method -> RequestPath -> Body -> CBAccessSign@@ -116,7 +118,7 @@ hmac = HMAC.hmac dak msg :: HMAC.HMAC SHA256 mkMsg :: CBAccessTimeStamp -> Method -> RequestPath -> Body -> ByteString- mkMsg (CBAccessTimeStamp s) m rp b = C8.pack $ s ++ C8.unpack m ++ rp ++ b+ mkMsg (CBAccessTimeStamp s) m rp b = encodeUtf8 s <> m <> rp <> b decodeApiKey :: CBSecretKey -> ByteString
+ src/lib/CoinbasePro/Authenticated/Transfer.hs view
@@ -0,0 +1,101 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-}++module CoinbasePro.Authenticated.Transfer+ ( TransferType (..)+ , Transfer (..)+ ) where++import Data.Aeson (FromJSON (..), ToJSON,+ Value (..), parseJSON,+ withObject, (.:), (.:?))+import Data.Text (Text, pack)+import Data.Time.Clock (UTCTime)+import Servant.API++import CoinbasePro.Authenticated.Accounts (AccountId)+import CoinbasePro.Authenticated.Deposit (DepositDetails)+import CoinbasePro.Authenticated.Withdrawal (WithdrawalDetails)+import CoinbasePro.Types (CreatedAt, UserId)+++data TransferType = WithdrawTransferType | DepositTransferType+++instance Show TransferType where+ show WithdrawTransferType = "withdraw"+ show DepositTransferType = "deposit"+++instance ToHttpApiData TransferType where+ toUrlPiece = pack . show+ toQueryParam = pack . show+++newtype UserNonce = UserNonce Int+ deriving (Eq, Show, ToJSON, FromJSON)+++data TransferDetails = TransferDetails+ { tId :: Text+ , tType :: Text+ , tCreatedAt :: CreatedAt+ , tCompletedAt :: UTCTime+ , tCanceledAt :: Maybe UTCTime+ , tProcessedAt :: Maybe UTCTime+ , tAccountId :: AccountId+ , tUserId :: UserId+ , tUserNonce :: Maybe UserNonce+ , tAmount :: Double+ } deriving Show+++instance FromJSON TransferDetails where+ parseJSON = withObject "transfer" $ \o -> TransferDetails+ <$> (o .: "id")+ <*> (o .: "type")+ <*> (o .: "created_at")+ <*> (o .: "completed_at")+ <*> (o .:? "canceled_at")+ <*> (o .:? "processed_at")+ <*> (o .: "account_id")+ <*> (o .: "user_id")+ <*> (o .:? "user_nonce")+ <*> (read <$> o .: "amount")+++data WithdrawalTransfer = WithdrawalTransfer+ { wTransfer :: TransferDetails+ , wDetails :: WithdrawalDetails+ } deriving Show+++instance FromJSON WithdrawalTransfer where+ parseJSON = withObject "withdrawal transfer" $ \o -> WithdrawalTransfer+ <$> parseJSON (Object o)+ <*> o .: "details"+++data DepositTransfer = DepositTransfer+ { dTransfer :: TransferDetails+ , dDetails :: DepositDetails+ } deriving Show+++instance FromJSON DepositTransfer where+ parseJSON = withObject "deposit transfer" $ \o -> DepositTransfer+ <$> parseJSON (Object o)+ <*> o .: "details"+++data Transfer = Withdrawal WithdrawalTransfer | Deposit DepositTransfer+ deriving Show+++instance FromJSON Transfer where+ parseJSON = withObject "transfer" $ \o -> do+ t <- String <$> o .: "type"+ case t of+ "withdraw" -> Withdrawal <$> parseJSON (Object o)+ "deposit" -> Deposit <$> parseJSON (Object o)+ _ -> fail "Unable to parse transfer"
+ src/lib/CoinbasePro/Authenticated/Withdrawal.hs view
@@ -0,0 +1,121 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}++module CoinbasePro.Authenticated.Withdrawal+ ( WithdrawalDetails (..)+ , WithdrawalRequest (..)+ , WithdrawalResponse (..)+ , CoinbaseWithdrawalRequest (..)+ , CryptoWithdrawalRequest (..)+ , CryptoWithdrawalResponse (..)+ , WithdrawalFeeEstimateResponse (..)+ ) where++import Data.Aeson (FromJSON, parseJSON,+ withObject, (.:), (.:?))+import Data.Aeson.Casing (snakeCase)+import Data.Aeson.TH (defaultOptions, deriveJSON,+ fieldLabelModifier)+import Data.Text (Text)+import Data.Time.Clock (UTCTime)+import Data.UUID (UUID)++import CoinbasePro.Authenticated.Accounts (AccountId)+import CoinbasePro.Authenticated.Payment (PaymentMethodId)+++data WithdrawalDetails = WithdrawalDetails+ { destinationTag :: Maybe Text+ , sentToAddress :: Maybe Text+ , coinbaseAccountId :: Text+ , destinationTagName :: Maybe Text+ , coinbaseWithdrawalId :: Maybe Text+ , coinbaseTransactionId :: Text+ , cryptoPaymentMethodId :: Text+ , fee :: Maybe Double+ , subtotal :: Maybe Double+ } deriving (Eq, Show)+++instance FromJSON WithdrawalDetails where+ parseJSON = withObject "withdrawal details" $ \o -> WithdrawalDetails+ <$> o .:? "destination_tag"+ <*> o .:? "sent_to_address"+ <*> o .: "coinbase_account_id"+ <*> o .:? "destination_tag_name"+ <*> o .:? "coinbase_withdrawal_id"+ <*> o .: "coinbase_transaction_id"+ <*> o .: "coinbase_payment_method_id"+ <*> (maybe Nothing read <$> o .:? "fee")+ <*> (maybe Nothing read <$> o .:? "subtotal")+++data WithdrawalRequest = WithdrawalRequest+ { amount :: Double+ , currency :: Text+ , paymentMethodId :: PaymentMethodId+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''WithdrawalRequest+++data WithdrawalResponse = WithdrawalResponse+ { wId :: UUID+ , wAmount :: Double+ , wCurrency :: Text+ , wPayoutAt :: UTCTime+ } deriving (Eq, Show)+++instance FromJSON WithdrawalResponse where+ parseJSON = withObject "withdrawal response" $ \o -> WithdrawalResponse+ <$> o .: "id"+ <*> (read <$> o .: "amount")+ <*> o .: "currency"+ <*> o .: "payout_at"+++data CoinbaseWithdrawalRequest = CoinbaseWithdrawalRequest+ { cAmount :: Double+ , cCurrency :: Text+ , cCoinbaseAccountId :: AccountId+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 1 } ''CoinbaseWithdrawalRequest+++data CryptoWithdrawalRequest = CryptoWithdrawalRequest+ { crAmount :: Double+ , crCurrency :: Text+ , crCryptoAddress :: Text+ } deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 2 } ''CryptoWithdrawalRequest+++data CryptoWithdrawalResponse = CryptoWithdrawalResponse+ { cwId :: UUID+ , cwAmount :: Double+ , cwCurrency :: Text+ , cwFee :: Double+ , cwSubtotal :: Double+ } deriving (Eq, Show)+++instance FromJSON CryptoWithdrawalResponse where+ parseJSON = withObject "crypto withdrawal response" $ \o -> CryptoWithdrawalResponse+ <$> o .: "id"+ <*> (read <$> o .: "amount")+ <*> o .: "currency"+ <*> (read <$> o .: "fee")+ <*> (read <$> o .: "subtotal")+++newtype WithdrawalFeeEstimateResponse = WithdrawalFeeEstimateResponse+ { wfFee :: Double} deriving (Eq, Show)+++deriveJSON defaultOptions { fieldLabelModifier = snakeCase . drop 2 } ''WithdrawalFeeEstimateResponse
src/lib/CoinbasePro/Environment.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE OverloadedStrings #-}+ module CoinbasePro.Environment ( Environment (..) , WSConnection (..)@@ -7,23 +9,23 @@ ) where -import Network.Socket (HostName)-import Network.Socket.Internal (PortNumber)+import Data.Text (Text)+import Network.Socket (HostName, PortNumber) data Environment = Production | Sandbox -apiEndpoint :: Environment -> String+apiEndpoint :: Environment -> Text apiEndpoint Production = productionAPIEndpoint apiEndpoint Sandbox = sandboxAPIEndpoint -productionAPIEndpoint :: String+productionAPIEndpoint :: Text productionAPIEndpoint = "api.pro.coinbase.com" -sandboxAPIEndpoint :: String+sandboxAPIEndpoint :: Text sandboxAPIEndpoint = "api-public.sandbox.pro.coinbase.com"
src/lib/CoinbasePro/Headers.hs view
@@ -24,7 +24,7 @@ userAgent :: UserAgent-userAgent = UserAgent "coinbase-pro/0.8"+userAgent = UserAgent "coinbase-pro/0.9" type UserAgentHeader = RequiredHeader "User-Agent" UserAgent
src/lib/CoinbasePro/MarketData/Types.hs view
@@ -27,22 +27,25 @@ , baseMinSize :: Double , baseMaxSize :: Double , quoteIncrement :: Double+ , minMarketFunds :: Double+ , maxMarketFunds :: Double } deriving (Eq, Show) instance FromJSON Product where- parseJSON = withObject "product" $ \o -> do- prid <- o .: "id"- bc <- o .: "base_currency"- qc <- o .: "quote_currency"- bmins <- o .: "base_min_size"- bmaxs <- o .: "base_max_size"- qi <- o .: "quote_increment"- return $ Product prid bc qc (read bmins) (read bmaxs) (read qi)+ parseJSON = withObject "product" $ \o -> Product+ <$> o .: "id"+ <*> o .: "base_currency"+ <*> o .: "quote_currency"+ <*> (read <$> o .: "base_min_size")+ <*> (read <$> o .: "base_max_size")+ <*> (read <$> o .: "quote_increment")+ <*> (read <$> o .: "min_market_funds")+ <*> (read <$> o .: "max_market_funds") instance ToHttpApiData Product where- toUrlPiece = toUrlPiece . productId+ toUrlPiece = toUrlPiece . productId toQueryParam = toQueryParam . productId
src/lib/CoinbasePro/Request.hs view
@@ -1,7 +1,9 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-} + module CoinbasePro.Request ( RequestPath , Body@@ -14,13 +16,17 @@ , runWithManager , Runner++ , emptyBody ) where import Control.Exception (throw) import Control.Monad (void)+import Data.ByteString (ByteString)+import Data.Text (unpack) import Network.HTTP.Client (Manager, newManager) import Network.HTTP.Client.TLS (tlsManagerSettings)-import Servant.API ((:>), Get, JSON)+import Servant.API (Get, JSON, (:>)) import Servant.Client import CoinbasePro.Environment (Environment, apiEndpoint)@@ -32,9 +38,11 @@ type CBRequest a = UserAgent -> ClientM a +-- ^ Serialized as a part of building CBAccessSign+type RequestPath = ByteString -type RequestPath = String-type Body = String+-- ^ Serialized as a part of building CBAccessSign+type Body = ByteString type Runner a = ClientM a -> IO a@@ -72,4 +80,8 @@ runWithManager mgr env f = either throw return =<< runClientM f (mkClientEnv mgr (BaseUrl Https api 443 mempty)) where- api = apiEndpoint env+ api = unpack $ apiEndpoint env+++emptyBody :: ByteString+emptyBody = ""
src/lib/CoinbasePro/Types.hs view
@@ -21,14 +21,16 @@ , Candle (..) , CandleGranularity (..) , TwentyFourHourStats (..)+ , CurrencyType (..) , Currency (..)+ , CryptoAddress (..) , filterOrderFieldName ) where -import Data.Aeson (FromJSON, ToJSON, parseJSON, toJSON,- withArray, withObject, withText, (.:),- (.:?))+import Data.Aeson (FromJSON, FromJSONKey, ToJSON,+ ToJSONKey, parseJSON, toJSON, withArray,+ withObject, withText, (.:), (.:?)) import qualified Data.Aeson as A import Data.Aeson.Casing (camelCase, snakeCase) import Data.Aeson.TH (constructorTagModifier, defaultOptions,@@ -37,7 +39,7 @@ import Data.Text (Text, pack, toLower, unpack) import Data.Time.Clock (UTCTime) import Data.Time.Clock.POSIX (posixSecondsToUTCTime)-import Data.UUID (UUID, toText)+import Data.UUID (UUID, toString, toText) import qualified Data.Vector as V import Servant.API import Text.Printf (printf)@@ -64,9 +66,13 @@ newtype OrderId = OrderId { unOrderId :: Text }- deriving (Eq, Ord, Show, ToHttpApiData)+ deriving (Eq, Ord, ToHttpApiData) +instance Show OrderId where+ show (OrderId t) = unpack t++ deriveJSON defaultOptions { fieldLabelModifier = snakeCase , unwrapUnaryRecords = True@@ -74,9 +80,13 @@ newtype ClientOrderId = ClientOrderId { unClientOrderId :: UUID }- deriving (Eq, Ord, Show)+ deriving (Eq, Ord) +instance Show ClientOrderId where+ show (ClientOrderId t) = toString t++ instance ToHttpApiData ClientOrderId where toUrlPiece = ("client:" <>) . toText . unClientOrderId @@ -87,9 +97,13 @@ newtype ProductId = ProductId { unProductId :: Text }- deriving (Eq, Ord, Show, ToHttpApiData)+ deriving (Eq, Ord, ToHttpApiData, ToJSONKey, FromJSONKey) +instance Show ProductId where+ show (ProductId t) = unpack t++ deriveJSON defaultOptions { fieldLabelModifier = snakeCase , unwrapUnaryRecords = True@@ -97,24 +111,32 @@ newtype Price = Price { unPrice :: Double }- deriving (Eq, Ord, Show, ToHttpApiData)+ deriving (Eq, Ord, ToHttpApiData) +instance Show Price where+ show (Price d) = printf "%.8f" d++ instance FromJSON Price where parseJSON = withText "price" $ \t -> return . Price . read $ unpack t instance ToJSON Price where- toJSON (Price p) = A.String . pack $ printf "%.8f" p+ toJSON = A.String . pack . show newtype Size = Size { unSize :: Double }- deriving (Eq, Ord, Show, ToHttpApiData)+ deriving (Eq, Ord, ToHttpApiData) +instance Show Size where+ show (Size d) = printf "%.8f" d++ instance ToJSON Size where- toJSON (Size s) = A.String . pack $ printf "%.8f" s+ toJSON = A.String . pack . show instance FromJSON Size where@@ -123,16 +145,20 @@ newtype Volume = Volume { unVolume :: Double }- deriving (Eq, Ord, Show)+ deriving (Eq, Ord) +instance Show Volume where+ show (Volume d) = printf "%.8f" d++ instance FromJSON Volume where parseJSON = withText "volume" $ \t -> return . Volume . read $ unpack t instance ToJSON Volume where- toJSON (Volume v) = A.String . pack $ printf "%.8f" v+ toJSON = A.String . pack . show newtype TradeId = TradeId Int@@ -142,16 +168,20 @@ deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''TradeId -newtype Funds = Funds { unFunds :: Double }- deriving (Eq, Ord, Show, ToHttpApiData)+newtype Funds = Funds Double+ deriving (Eq, Ord, ToHttpApiData) +instance Show Funds where+ show (Funds d) = printf "%.16f" d++ instance ToJSON Funds where- toJSON (Funds s) = A.String . pack $ printf "%.16f" s+ toJSON = A.String . pack . show instance FromJSON Funds where- parseJSON = withText "size" $ \t ->+ parseJSON = withText "funds" $ \t -> return . Funds . read $ unpack t @@ -243,6 +273,7 @@ , pushPaymentMethods :: [Text] , groupTypes :: Maybe [Text] , maxPrecision :: Maybe Double+ , maxWithdrawalAmount :: Maybe Double } deriving (Eq, Show) @@ -256,8 +287,17 @@ <*> o .: "push_payment_methods" <*> o .:? "group_types" <*> o .:? "max_precision"+ <*> o .:? "max_withdrawal_amount" +newtype CurrencyType = CurrencyType Text+ deriving ToHttpApiData+++instance Show CurrencyType where+ show (CurrencyType c) = unpack c++ data Currency = Currency { id :: Text , name :: Text@@ -276,3 +316,11 @@ <*> o .: "status" <*> o .:? "message" <*> o .: "details"+++newtype CryptoAddress = CryptoAddress Text+ deriving ToHttpApiData+++instance Show CryptoAddress where+ show (CryptoAddress ca) = unpack ca
src/lib/CoinbasePro/Unauthenticated.hs view
@@ -59,7 +59,7 @@ stats prid = API.stats prid userAgent --- | https://docs.pro.coinbase.com/?javascript#get-currencies+-- | https://docs.pro.coinbase.com/#get-currencies currencies :: ClientM [Currency] currencies = API.currencies userAgent
src/lib/CoinbasePro/WebSocketFeed.hs view
@@ -1,13 +1,14 @@+{-# LANGUAGE OverloadedStrings #-}+ module CoinbasePro.WebSocketFeed ( subscribeToFeed ) where import Control.Concurrent (forkIO)+import Control.Exception (Exception, throwIO) import Control.Monad (forever) import Control.Monad.IO.Class (liftIO)-import Data.Aeson (eitherDecode', encode)-import Data.Either (either)-import Data.Maybe (maybe)+import Data.Aeson (decode', encode) import Network.HTTP.Types (methodGet) import qualified Network.WebSockets as WS import qualified System.IO.Streams as Streams@@ -20,6 +21,7 @@ import CoinbasePro.Environment (Environment, WSConnection (..), wsEndpoint)+import CoinbasePro.Request (emptyBody) import CoinbasePro.Types (ProductId) import CoinbasePro.WebSocketFeed.Channel (ChannelMessage (..)) import CoinbasePro.WebSocketFeed.Request (AuthenticatedWebSocketFeedRequest (..),@@ -28,6 +30,10 @@ WebSocketFeedRequest (..)) +data ParseException = ParseException deriving Show+instance Exception ParseException++ subscribeToFeed :: [ProductId] -> [ChannelName] -> Environment -> Maybe CoinbaseProCredentials -> IO (Streams.InputStream ChannelMessage) subscribeToFeed prds channels env = subscribe (wsEndpoint env) prds channels @@ -52,11 +58,12 @@ authWsRequest cpc' = do ts <- liftIO mkCBAccessTimeStamp- let cbs = mkCBAccessSign (cbSecretKey cpc') ts methodGet authSubscriptionPath ""+ let cbs = mkCBAccessSign (cbSecretKey cpc') ts methodGet authSubscriptionPath emptyBody return $ AuthenticatedWebSocketFeedRequest wsRequest cbs (cbAccessKey cpc') (cbAccessPassphrase cpc') ts authSubscriptionPath = "/users/self/verify" parseFeed :: WS.Connection -> IO ChannelMessage-parseFeed conn = either fail return =<< (eitherDecode' <$> WS.receiveData conn :: IO (Either String ChannelMessage))+parseFeed conn = maybe err return =<< (decode' <$> WS.receiveData conn)+ where err = throwIO ParseException
src/lib/CoinbasePro/WebSocketFeed/Channel/Full/Activate.hs view
@@ -16,22 +16,20 @@ type StopType = Text-type TakerFeeRate = Double data Activate = Activate- { productId :: ProductId- , timestamp :: UTCTime- , orderId :: OrderId- , stopType :: StopType- , side :: Side- , stopPrice :: Price- , size :: Size- , funds :: Funds- , takerFeeRate :: TakerFeeRate- , private :: Bool- , userId :: UserId- , profileId :: ProfileId+ { productId :: ProductId+ , timestamp :: UTCTime+ , orderId :: OrderId+ , stopType :: StopType+ , side :: Side+ , stopPrice :: Price+ , size :: Size+ , funds :: Funds+ , private :: Bool+ , userId :: UserId+ , profileId :: ProfileId } deriving (Eq, Ord, Show)