packages feed

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 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