From fda2b6b64f61e346b2244251ca82a03bbbaf95ee Mon Sep 17 00:00:00 2001 From: Michael Dunn Date: Sun, 7 Mar 2021 15:50:24 -0600 Subject: [PATCH] Added support for stablecoin conversions. --- coinbase-pro.cabal | 3 +- src/lib/CoinbasePro/Authenticated.hs | 13 +++- src/lib/CoinbasePro/Authenticated/API.hs | 9 ++- .../CoinbasePro/Authenticated/Conversion.hs | 64 +++++++++++++++++++ 4 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 src/lib/CoinbasePro/Authenticated/Conversion.hs diff --git a/coinbase-pro.cabal b/coinbase-pro.cabal index 27b0ee6..3056d17 100644 --- a/coinbase-pro.cabal +++ b/coinbase-pro.cabal @@ -4,7 +4,7 @@ cabal-version: 1.12 -- -- see: https://github.com/sol/hpack -- --- hash: 99c50583d7d248741138631c4b28753ea1333f29565c1567516c183489a6d05d +-- hash: add46fa3fa358a678cd7bcb5b32037fe01956ba49cae6d6385b9de0105063e50 name: coinbase-pro version: 0.9.1.0 @@ -33,6 +33,7 @@ library CoinbasePro.Authenticated.Accounts CoinbasePro.Authenticated.API CoinbasePro.Authenticated.CoinbaseAccounts + CoinbasePro.Authenticated.Conversion CoinbasePro.Authenticated.Deposit CoinbasePro.Authenticated.Fills CoinbasePro.Authenticated.Headers diff --git a/src/lib/CoinbasePro/Authenticated.hs b/src/lib/CoinbasePro/Authenticated.hs index 19fda39..d45958f 100644 --- a/src/lib/CoinbasePro/Authenticated.hs +++ b/src/lib/CoinbasePro/Authenticated.hs @@ -27,6 +27,7 @@ module CoinbasePro.Authenticated , makeCoinbaseWithdrawal , makeCryptoWithdrawal , withdrawalFeeEstimate + , createStablecoinConversion , paymentMethods , coinbaseAccounts , profiles @@ -62,6 +63,8 @@ import CoinbasePro.Authenticated.Accounts (Account, Fees, Hold, TrailingVolume (..)) import CoinbasePro.Authenticated.CoinbaseAccounts (CoinbaseAccount) +import CoinbasePro.Authenticated.Conversion (StablecoinConversionRequest (..), + StablecoinConversionResponse) import CoinbasePro.Authenticated.Deposit (CoinbaseDepositRequest (..), CryptoDepositAddress, DepositRequest (..), @@ -85,7 +88,6 @@ import CoinbasePro.Authenticated.Request (CBAuthT (..), authRequest) import CoinbasePro.Authenticated.Transfer (Transfer, TransferType (..)) - import CoinbasePro.Authenticated.Withdrawal (CoinbaseWithdrawalRequest (..), CryptoWithdrawalRequest (..), CryptoWithdrawalResponse, @@ -422,6 +424,15 @@ withdrawalFeeEstimate cur addr = 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 diff --git a/src/lib/CoinbasePro/Authenticated/API.hs b/src/lib/CoinbasePro/Authenticated/API.hs index 2cf1a54..9bf1c82 100644 --- a/src/lib/CoinbasePro/Authenticated/API.hs +++ b/src/lib/CoinbasePro/Authenticated/API.hs @@ -26,6 +26,7 @@ module CoinbasePro.Authenticated.API , makeCoinbaseWithdrawal , makeCryptoWithdrawal , withdrawalFeeEstimate + , createStablecoinConversion , paymentMethods , coinbaseAccounts , profiles @@ -54,6 +55,8 @@ import CoinbasePro.Authenticated.Accounts (Account, Fees, Hold, TrailingVolume) import CoinbasePro.Authenticated.CoinbaseAccounts (CoinbaseAccount) +import CoinbasePro.Authenticated.Conversion (StablecoinConversionRequest, + StablecoinConversionResponse) import CoinbasePro.Authenticated.Deposit (CoinbaseDepositRequest, CryptoDepositAddress, DepositRequest, @@ -120,6 +123,7 @@ type API = "accounts" :> AuthGet [Account] :> 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] @@ -156,6 +160,7 @@ makeWithdrawal :: WithdrawalRequest -> AuthenticatedRequest (AuthProtect "CBAuth 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] @@ -167,5 +172,5 @@ 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 = client api diff --git a/src/lib/CoinbasePro/Authenticated/Conversion.hs b/src/lib/CoinbasePro/Authenticated/Conversion.hs new file mode 100644 index 0000000..1bf1e51 --- /dev/null +++ b/src/lib/CoinbasePro/Authenticated/Conversion.hs @@ -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"