coinbase-pro 0.9.1.0 → 0.9.2.0
raw patch · 9 files changed
+191/−47 lines, 9 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ CoinbasePro.Authenticated: createStablecoinConversion :: CurrencyType -> CurrencyType -> Double -> CBAuthT ClientM StablecoinConversionResponse
+ CoinbasePro.Authenticated: getOracle :: CBAuthT ClientM OracleResponse
+ CoinbasePro.Authenticated.API: createStablecoinConversion :: StablecoinConversionRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM StablecoinConversionResponse
+ CoinbasePro.Authenticated.API: getOracle :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM OracleResponse
+ CoinbasePro.Authenticated.Conversion: StablecoinConversionRequest :: CurrencyType -> CurrencyType -> Double -> StablecoinConversionRequest
+ CoinbasePro.Authenticated.Conversion: StablecoinConversionResponse :: ConversionId -> Double -> AccountId -> AccountId -> CurrencyType -> CurrencyType -> StablecoinConversionResponse
+ CoinbasePro.Authenticated.Conversion: [reqAmount] :: StablecoinConversionRequest -> Double
+ CoinbasePro.Authenticated.Conversion: [reqFrom] :: StablecoinConversionRequest -> CurrencyType
+ CoinbasePro.Authenticated.Conversion: [reqTo] :: StablecoinConversionRequest -> CurrencyType
+ CoinbasePro.Authenticated.Conversion: [resAmount] :: StablecoinConversionResponse -> Double
+ CoinbasePro.Authenticated.Conversion: [resFromAccountId] :: StablecoinConversionResponse -> AccountId
+ CoinbasePro.Authenticated.Conversion: [resFrom] :: StablecoinConversionResponse -> CurrencyType
+ CoinbasePro.Authenticated.Conversion: [resId] :: StablecoinConversionResponse -> ConversionId
+ CoinbasePro.Authenticated.Conversion: [resToAccountId] :: StablecoinConversionResponse -> AccountId
+ CoinbasePro.Authenticated.Conversion: [restTo] :: StablecoinConversionResponse -> CurrencyType
+ CoinbasePro.Authenticated.Conversion: data ConversionId
+ CoinbasePro.Authenticated.Conversion: data StablecoinConversionRequest
+ CoinbasePro.Authenticated.Conversion: data StablecoinConversionResponse
+ CoinbasePro.Authenticated.Conversion: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Conversion.ConversionId
+ CoinbasePro.Authenticated.Conversion: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Conversion.StablecoinConversionRequest
+ CoinbasePro.Authenticated.Conversion: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Conversion.StablecoinConversionResponse
+ CoinbasePro.Authenticated.Conversion: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Conversion.ConversionId
+ CoinbasePro.Authenticated.Conversion: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Conversion.StablecoinConversionRequest
+ CoinbasePro.Authenticated.Conversion: instance GHC.Show.Show CoinbasePro.Authenticated.Conversion.ConversionId
+ CoinbasePro.Authenticated.Conversion: instance GHC.Show.Show CoinbasePro.Authenticated.Conversion.StablecoinConversionRequest
+ CoinbasePro.Authenticated.Conversion: instance GHC.Show.Show CoinbasePro.Authenticated.Conversion.StablecoinConversionResponse
+ CoinbasePro.Authenticated.Oracle: OracleResponse :: UTCTime -> [Message] -> [Signature] -> Map CurrencyType Price -> OracleResponse
+ CoinbasePro.Authenticated.Oracle: [messages] :: OracleResponse -> [Message]
+ CoinbasePro.Authenticated.Oracle: [prices] :: OracleResponse -> Map CurrencyType Price
+ CoinbasePro.Authenticated.Oracle: [signatures] :: OracleResponse -> [Signature]
+ CoinbasePro.Authenticated.Oracle: [timestamp] :: OracleResponse -> UTCTime
+ CoinbasePro.Authenticated.Oracle: data OracleResponse
+ CoinbasePro.Authenticated.Oracle: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Oracle.Message
+ CoinbasePro.Authenticated.Oracle: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Oracle.OracleResponse
+ CoinbasePro.Authenticated.Oracle: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Oracle.Signature
+ CoinbasePro.Authenticated.Oracle: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Oracle.Message
+ CoinbasePro.Authenticated.Oracle: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Oracle.Signature
+ CoinbasePro.Authenticated.Oracle: instance GHC.Show.Show CoinbasePro.Authenticated.Oracle.Message
+ CoinbasePro.Authenticated.Oracle: instance GHC.Show.Show CoinbasePro.Authenticated.Oracle.OracleResponse
+ CoinbasePro.Authenticated.Oracle: instance GHC.Show.Show CoinbasePro.Authenticated.Oracle.Signature
+ CoinbasePro.Types: instance Data.Aeson.Types.FromJSON.FromJSONKey CoinbasePro.Types.CurrencyType
+ CoinbasePro.Types: instance GHC.Classes.Eq CoinbasePro.Types.CurrencyType
+ CoinbasePro.Types: instance GHC.Classes.Ord CoinbasePro.Types.CurrencyType
Files
- README.md +5/−5
- changelog.md +10/−0
- coinbase-pro.cabal +4/−2
- src/example/request/Main.hs +20/−36
- src/lib/CoinbasePro/Authenticated.hs +21/−1
- src/lib/CoinbasePro/Authenticated/API.hs +11/−2
- src/lib/CoinbasePro/Authenticated/Conversion.hs +64/−0
- src/lib/CoinbasePro/Authenticated/Oracle.hs +55/−0
- src/lib/CoinbasePro/Types.hs +1/−1
README.md view
@@ -1,6 +1,6 @@ # coinbase-pro -Client for Coinabse Pro REST and Websocket APIS.+Client for Coinbase Pro REST and Websocket APIs. Here is a list of implemented/unimplemented features: @@ -44,8 +44,8 @@ - [x] Coinbase - [x] Crypto - [x] Fee Estimate- - [ ] Stablecoin Conversions- - [ ] Create Conversion+ - [x] Stablecoin Conversions+ - [x] Create Conversion - [x] Payment Methods - [x] List Payment Methods - [x] Coinbase Accounts@@ -62,8 +62,8 @@ - [x] User Account - [x] Trailing Volume - ~~[ ] Margin~~ (Disabled)[https://blog.coinbase.com/coinbase-pro-disables-margin-trading-42f5862f8a66]- - [ ] Oracle- - [ ] Get Oracle+ - [x] Oracle+ - [x] Get Oracle - Websocket Feed - [x] Channels - [x] The heartbeat channel
changelog.md view
@@ -1,3 +1,13 @@+# Version 0.9.2.0++Feature complete! (except FIX)++## Additional Features++- Added support for the following endpoints:+ - stablecoin conversions+ - oracle+ # Version 0.9.1.0 - Minor refactors + linting.
coinbase-pro.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 99c50583d7d248741138631c4b28753ea1333f29565c1567516c183489a6d05d+-- hash: 9fd25d5880f390c5d7bd6d9d15430fda9adbdbe220b886dda4c4832c46e9e634 name: coinbase-pro-version: 0.9.1.0+version: 0.9.2.0 synopsis: Client for Coinbase Pro description: Client for Coinbase Pro REST and Websocket APIs category: Web, Finance@@ -33,10 +33,12 @@ CoinbasePro.Authenticated.Accounts CoinbasePro.Authenticated.API CoinbasePro.Authenticated.CoinbaseAccounts+ CoinbasePro.Authenticated.Conversion CoinbasePro.Authenticated.Deposit CoinbasePro.Authenticated.Fills CoinbasePro.Authenticated.Headers CoinbasePro.Authenticated.Limits+ CoinbasePro.Authenticated.Oracle CoinbasePro.Authenticated.Orders CoinbasePro.Authenticated.Payment CoinbasePro.Authenticated.Profile
src/example/request/Main.hs view
@@ -3,16 +3,11 @@ module Main where import Control.Monad.IO.Class (liftIO)-import Data.Maybe (fromJust)-import Data.Time (defaultTimeLocale,- parseTimeOrError)-import Data.UUID (fromText) import CoinbasePro.Authenticated import CoinbasePro.Authenticated.Accounts import CoinbasePro.Authenticated.Headers import CoinbasePro.Authenticated.Orders-import CoinbasePro.Authenticated.Report import CoinbasePro.Authenticated.Request import CoinbasePro.Environment import CoinbasePro.MarketData.Types hiding (time)@@ -23,38 +18,27 @@ main :: IO () main = 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+ 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- -- resp <- createReport fillReportReq- getReport rid >>= liftIO . print- -- profiles Nothing >>= liftIO . print- -- profile "94fa1f9e-131f-4295-b0d5-695b8a92c382" >>= liftIO . print- -- 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- -- placeOrder Nothing btcusd Buy (Size 1.0) (Price 1.00) True Nothing Nothing Nothing >>= liftIO . print- -- cancelAll (Just btcusd) >>= liftIO . print+ 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+ placeOrder Nothing btcusd Buy (Size 1.0) (Price 1.00) True Nothing Nothing Nothing >>= liftIO . print+ cancelAll (Just btcusd) >>= liftIO . print where- accessKey = CBAccessKey "6e5972897a617f9c7807190c72019f2e"- secretKey = CBSecretKey "1MJfkRmYd+AgSo6SeGlKD1XZS7AkTikEagz0EKKn6hNHzY9Ff7+H2cc76E0vbzo+0yvwCNCBsIedi0QXwRSdGw=="- passphrase = CBAccessPassphrase "83f2vnptwln"+ accessKey = CBAccessKey "accesskey"+ secretKey = CBSecretKey "secretkey"+ passphrase = CBAccessPassphrase "passphrase" cpc = CoinbaseProCredentials accessKey secretKey passphrase- aid = AccountId "74598a56-abef-4ffe-8d98-dd3c878d718d"+ aid = AccountId "accountid" btcusd = ProductId "BTC-USD"-- startDate = parseTimeOrError False defaultTimeLocale "%Y-%m-%d" "2020-01-01"- endDate = parseTimeOrError False defaultTimeLocale "%Y-%m-%d" "2021-01-01"- actReportReq = accountsReportRequest aid Nothing startDate endDate Nothing Nothing- fillReportReq = fillsReportRequest btcusd Nothing startDate endDate Nothing Nothing-- rid = ReportId $ fromJust $ fromText "5b99f31a-7bcb-43f4-b8b3-7e1299e67a3e"
src/lib/CoinbasePro/Authenticated.hs view
@@ -27,6 +27,7 @@ , makeCoinbaseWithdrawal , makeCryptoWithdrawal , withdrawalFeeEstimate+ , createStablecoinConversion , paymentMethods , coinbaseAccounts , profiles@@ -34,6 +35,7 @@ , profileTransfer , createReport , getReport+ , getOracle ) where import Control.Monad (void)@@ -62,12 +64,15 @@ Fees, Hold, TrailingVolume (..)) import CoinbasePro.Authenticated.CoinbaseAccounts (CoinbaseAccount)+import CoinbasePro.Authenticated.Conversion (StablecoinConversionRequest (..),+ StablecoinConversionResponse) import CoinbasePro.Authenticated.Deposit (CoinbaseDepositRequest (..), CryptoDepositAddress, DepositRequest (..), DepositResponse) import CoinbasePro.Authenticated.Fills (Fill) import CoinbasePro.Authenticated.Limits (Limits)+import CoinbasePro.Authenticated.Oracle (OracleResponse) import CoinbasePro.Authenticated.Orders (Order, PlaceOrderBody (..), STP, Status (..),@@ -85,7 +90,6 @@ authRequest) import CoinbasePro.Authenticated.Transfer (Transfer, TransferType (..))- import CoinbasePro.Authenticated.Withdrawal (CoinbaseWithdrawalRequest (..), CryptoWithdrawalRequest (..), CryptoWithdrawalResponse,@@ -422,6 +426,15 @@ requestPath = encodeRequestPath [withdrawalsPath, "fee-estimate"] <> query +-- | https://docs.pro.coinbase.com/#stablecoin-conversions+createStablecoinConversion :: CurrencyType -> CurrencyType -> Double -> CBAuthT ClientM StablecoinConversionResponse+createStablecoinConversion fromCur toCur amt =+ authRequest methodPost requestPath (encodeBody body) $ API.createStablecoinConversion body+ where+ requestPath = encodeRequestPath ["conversions"]+ body = StablecoinConversionRequest fromCur toCur amt++ -- | https://docs.pro.coinbase.com/#list-payment-methods paymentMethods :: CBAuthT ClientM [PaymentMethod] paymentMethods = authRequest methodGet requestPath emptyBody API.paymentMethods@@ -477,3 +490,10 @@ getReport rid = authRequest methodGet requestPath emptyBody $ API.getReport rid where requestPath = encodeRequestPath [reportsPath, toText $ unReportId rid]+++-- | https://docs.pro.coinbase.com/#oracle+getOracle :: CBAuthT ClientM OracleResponse+getOracle = authRequest methodGet requestPath emptyBody API.getOracle+ where+ requestPath = encodeRequestPath ["oracle"]
src/lib/CoinbasePro/Authenticated/API.hs view
@@ -26,6 +26,7 @@ , makeCoinbaseWithdrawal , makeCryptoWithdrawal , withdrawalFeeEstimate+ , createStablecoinConversion , paymentMethods , coinbaseAccounts , profiles@@ -33,6 +34,7 @@ , profileTransfer , createReport , getReport+ , getOracle ) where import Data.Proxy (Proxy (..))@@ -54,12 +56,15 @@ Fees, Hold, TrailingVolume) import CoinbasePro.Authenticated.CoinbaseAccounts (CoinbaseAccount)+import CoinbasePro.Authenticated.Conversion (StablecoinConversionRequest,+ StablecoinConversionResponse) import CoinbasePro.Authenticated.Deposit (CoinbaseDepositRequest, CryptoDepositAddress, DepositRequest, DepositResponse) import CoinbasePro.Authenticated.Fills (Fill) import CoinbasePro.Authenticated.Limits (Limits)+import CoinbasePro.Authenticated.Oracle (OracleResponse) import CoinbasePro.Authenticated.Orders (Order, PlaceOrderBody (..), Status (..))@@ -120,6 +125,7 @@ :> QueryParam' '[Required] "currency" CurrencyType :> QueryParam' '[Required] "crypto_address" CryptoAddress :> AuthGet WithdrawalFeeEstimateResponse+ :<|> "conversions" :> ReqBody '[JSON] StablecoinConversionRequest :> AuthPost StablecoinConversionResponse :<|> "payment-methods" :> AuthGet [PaymentMethod] :<|> "coinbase-accounts" :> AuthGet [CoinbaseAccount] :<|> "profiles" :> QueryParam "active" Bool :> AuthGet [Profile]@@ -127,6 +133,7 @@ :<|> "profiles" :> "transfer" :> ReqBody '[JSON] ProfileTransfer :> AuthPost NoContent :<|> "reports" :> ReqBody '[JSON] ReportRequest :> AuthPost ReportResponse :<|> "reports" :> Capture "report_id" ReportId :> AuthGet ReportResponse+ :<|> "oracle" :> AuthGet OracleResponse api :: Proxy API@@ -156,6 +163,7 @@ makeCoinbaseWithdrawal :: CoinbaseWithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM WithdrawalResponse makeCryptoWithdrawal :: CryptoWithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM CryptoWithdrawalResponse withdrawalFeeEstimate :: CurrencyType -> CryptoAddress -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM WithdrawalFeeEstimateResponse+createStablecoinConversion :: StablecoinConversionRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM StablecoinConversionResponse paymentMethods :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [PaymentMethod] coinbaseAccounts :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [CoinbaseAccount] profiles :: Maybe Bool -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM [Profile]@@ -163,9 +171,10 @@ profileTransfer :: ProfileTransfer -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM NoContent createReport :: ReportRequest -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM ReportResponse getReport :: ReportId -> AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM ReportResponse+getOracle :: AuthenticatedRequest (AuthProtect "CBAuth") -> ClientM OracleResponse 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 :<|> profiles :<|> profile- :<|> profileTransfer :<|> createReport :<|> getReport = client api+ :<|> makeCryptoWithdrawal :<|> withdrawalFeeEstimate :<|> createStablecoinConversion :<|> paymentMethods :<|> coinbaseAccounts+ :<|> profiles :<|> profile :<|> profileTransfer :<|> createReport :<|> getReport :<|> getOracle = client api
+ src/lib/CoinbasePro/Authenticated/Conversion.hs view
@@ -0,0 +1,64 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}++module CoinbasePro.Authenticated.Conversion+ ( ConversionId+ , StablecoinConversionRequest (..)+ , StablecoinConversionResponse (..)+ ) where++import Data.Aeson (FromJSON, parseJSON,+ withObject, (.:))+import Data.Aeson.Casing (snakeCase)+import Data.Aeson.TH (defaultOptions, deriveJSON,+ fieldLabelModifier,+ unwrapUnaryRecords)+import Data.UUID (UUID, toString)++import CoinbasePro.Authenticated.Accounts (AccountId)+import CoinbasePro.Types (CurrencyType)+++data StablecoinConversionRequest = StablecoinConversionRequest+ { reqFrom :: CurrencyType+ , reqTo :: CurrencyType+ , reqAmount :: Double+ } deriving Show+++deriveJSON defaultOptions+ { fieldLabelModifier = snakeCase . drop 3+ } ''StablecoinConversionRequest+++newtype ConversionId = ConversionId UUID+++instance Show ConversionId where+ show (ConversionId u) = toString u+++deriveJSON defaultOptions+ { fieldLabelModifier = snakeCase+ , unwrapUnaryRecords = True+ } ''ConversionId+++data StablecoinConversionResponse = StablecoinConversionResponse+ { resId :: ConversionId+ , resAmount :: Double+ , resFromAccountId :: AccountId+ , resToAccountId :: AccountId+ , resFrom :: CurrencyType+ , restTo :: CurrencyType+ } deriving Show+++instance FromJSON StablecoinConversionResponse where+ parseJSON = withObject "stablecoin conversion response" $ \o -> StablecoinConversionResponse+ <$> o .: "id"+ <*> (read <$> o .: "amount")+ <*> o .: "from_account_id"+ <*> o .: "to_account_id"+ <*> o .: "from"+ <*> o .: "to"
+ src/lib/CoinbasePro/Authenticated/Oracle.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-type-defaults #-}++module CoinbasePro.Authenticated.Oracle+ ( OracleResponse (..)+ ) where+++import Data.Aeson (FromJSON, parseJSON, withObject, (.:))+import Data.Aeson.Casing (snakeCase)+import Data.Aeson.TH (defaultOptions, deriveJSON,+ fieldLabelModifier, unwrapUnaryRecords)+import Data.Map.Strict (Map)+import Data.Text (Text)+import Data.Time.Clock (UTCTime)+import Data.Time.Clock.POSIX (posixSecondsToUTCTime)++import CoinbasePro.Types (CurrencyType, Price)+++newtype Message = Message Text+ deriving Show+++deriveJSON defaultOptions+ { fieldLabelModifier = snakeCase+ , unwrapUnaryRecords = True+ } ''Message+++newtype Signature = Signature Text+ deriving Show+++deriveJSON defaultOptions+ { fieldLabelModifier = snakeCase+ , unwrapUnaryRecords = True+ } ''Signature+++data OracleResponse = OracleResponse+ { timestamp :: UTCTime+ , messages :: [Message]+ , signatures :: [Signature]+ , prices :: Map CurrencyType Price+ } deriving Show+++instance FromJSON OracleResponse where+ parseJSON = withObject "oracle response" $ \o -> OracleResponse+ <$> (posixSecondsToUTCTime . realToFrac . read <$> o .: "timestamp")+ <*> o .: "messages"+ <*> o .: "signatures"+ <*> o .: "prices"
src/lib/CoinbasePro/Types.hs view
@@ -291,7 +291,7 @@ newtype CurrencyType = CurrencyType Text- deriving ToHttpApiData+ deriving (Eq, Ord, ToHttpApiData, FromJSONKey) instance Show CurrencyType where