From 26d8195fe009157ce19fd4432248dd69e7dff956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20S=C3=A1nchez?= Date: Sun, 5 Jan 2025 12:00:58 -0300 Subject: [PATCH] unified get_position --- libraries/wrappers/earn_binance.py | 15 ++++++++++++++- libraries/wrappers/earn_gateio.py | 31 +++++++++++++++++++++++++++--- libraries/wrappers/earn_kucoin.py | 19 +++++++++++++++--- libraries/wrappers/earn_okx.py | 18 +++++++++++++++-- main.py => test.py | 27 +++++++++++++++++++------- 5 files changed, 94 insertions(+), 16 deletions(-) rename main.py => test.py (72%) diff --git a/libraries/wrappers/earn_binance.py b/libraries/wrappers/earn_binance.py index 336c6e5..327e9f4 100644 --- a/libraries/wrappers/earn_binance.py +++ b/libraries/wrappers/earn_binance.py @@ -12,6 +12,10 @@ class binance_earn: self.client = Client(self.api_key, self.api_secret) + def __str__(self): + return "binance" + + def get_trading_balance(self, coin): ''' Args: @@ -91,7 +95,16 @@ class binance_earn: try: response = self.client.get_flexible_product_position(asset=coin, **kwargs) - return response + if response["total"]==0: + return {} + elif response["total"]==1: + return {"asset": response["rows"][0]["asset"], + "positionId": "", + "productId": response["rows"][0]["productId"], + "amount": response["rows"][0]["totalAmount"], + "rate": response["rows"][0]["latestAnnualPercentageRate"]} + else: + return {"Error": response} except ClientError as error: print("Found error. status: {}, error code: {}, error message: {}".format(error.status_code, error.error_code, error.error_message)) return None diff --git a/libraries/wrappers/earn_gateio.py b/libraries/wrappers/earn_gateio.py index ef53a26..ab9f505 100644 --- a/libraries/wrappers/earn_gateio.py +++ b/libraries/wrappers/earn_gateio.py @@ -19,6 +19,10 @@ class gateio_earn: self.prefix = "/api/v4" + def __str__(self): + return "gateio" + + def gen_sign(self, method, url, query_string=None, payload_string=None): ''' Generates a signature for the API request @@ -116,7 +120,9 @@ class gateio_earn: if response.status_code == 200: return response.json() else: - return {"Error": response.text} + return {"Error code": response.status_code, + "Error content": response.text, + "Error content": response.content} def redeem_product(self, coin, amount, rate="0"): @@ -133,8 +139,27 @@ class gateio_earn: return {"Error": response.text} - def get_position(self, **kwargs): - return {"Error": "To be implemented"} + def get_position(self, coin): + url = "/earn/uni/lends" + headers = {"Accept": "application/json", "Content-Type": "application/json"} + query_param = f'{{"currency": "{coin}"}}' + sign_headers = self.gen_sign("GET", self.prefix+url, query_param) + headers.update(sign_headers) + response = requests.get(self.host+self.prefix+url, headers=headers, params=query_param) + json_response = response.json() + if response.status_code == 200: + if len(json_response)==0: + return {} + elif len(json_response)==1: + return {"asset": json_response[0]["currency"], + "positionId": "", + "productId": "", + "amount": json_response[0]["amount"], + "rate": json_response[0]["min_rate"]} + else: + return {"Error": "Multiple positions for the same coin"} + else: + return {"Error": response.text} def get_account(self): diff --git a/libraries/wrappers/earn_kucoin.py b/libraries/wrappers/earn_kucoin.py index a6d682e..af1e9b7 100644 --- a/libraries/wrappers/earn_kucoin.py +++ b/libraries/wrappers/earn_kucoin.py @@ -44,6 +44,10 @@ class kucoin_earn: self.earn_api = kucoin_rest_service.get_earn_service().get_earn_api + def __str__(self): + return "kucoin" + + def get_trading_balance(self, coin): ''' Args: @@ -107,13 +111,22 @@ class kucoin_earn: return response.to_dict() - def get_position(self, coin, **kwargs): + def get_position(self, coin): ''' Return {'common_response': {'code': '200000', 'data': {'totalNum': 1, 'items': [{'orderId': '2987632', 'productId': '2152', 'productCategory': 'DEMAND', 'productType': 'DEMAND', 'currency': 'USDT', 'incomeCurrency': 'USDT', 'returnRate': '0.04767484', 'holdAmount': '20', 'redeemedAmount': '0', 'redeemingAmount': '0', 'lockStartTime': 1641806718000, 'lockEndTime': None, 'purchaseTime': 1736027283000, 'redeemPeriod': 0, 'status': 'LOCKED', 'earlyRedeemSupported': 0}], 'currentPage': 1, 'pageSize': 15, 'totalPage': 1}, 'rate_limit': {'limit': 2000, 'remaining': 1995, 'reset': 16550}}, 'totalNum': 1, 'items': [{'orderId': '2987632', 'productId': '2152', 'productCategory': 'DEMAND', 'productType': 'DEMAND', 'currency': 'USDT', 'incomeCurrency': 'USDT', 'returnRate': '0.04767484', 'holdAmount': '20', 'redeemedAmount': '0', 'redeemingAmount': '0', 'lockStartTime': 1641806718000, 'purchaseTime': 1736027283000, 'redeemPeriod': 0, 'status': , 'earlyRedeemSupported': }], 'currentPage': 1, 'pageSize': 15, 'totalPage': 1} ''' request = GetAccountHoldingReqBuilder().set_currency(coin).build() - response = self.earn_api().get_account_holding(request) - return response.to_dict() + response = self.earn_api().get_account_holding(request).to_dict() + if len(response["items"])==0: + return {} + elif len(response["items"])==1: + return {"asset": response["items"][0]["currency"], + "positionId": response["items"][0]["orderId"], + "productId": response["items"][0]["productId"], + "amount": response["items"][0]["holdAmount"], + "rate": response["items"][0]["returnRate"]} + else: + return {"Error": response} def get_account(self,coin,**kwargs): diff --git a/libraries/wrappers/earn_okx.py b/libraries/wrappers/earn_okx.py index c21d2c5..ad4ea40 100644 --- a/libraries/wrappers/earn_okx.py +++ b/libraries/wrappers/earn_okx.py @@ -19,6 +19,10 @@ class okx_earn: self.account_api = Account.AccountAPI(api_key, api_secret, passphrase, False, "0") + def __str__(self): + return "okx" + + def get_trading_balance(self, coin): ''' Args: @@ -177,8 +181,18 @@ class okx_earn: return str(rate["data"][0]["avgRate"]) - def get_position(self, coin, **kwargs): - return self.earning_api.get_saving_balance(coin) + def get_position(self, coin): + response = self.earning_api.get_saving_balance(coin) + if len(response["data"])==0: + return {} + elif len(response["data"])==1: + return {"asset": response["data"][0]["ccy"], + "positionId": "", + "productId": "", + "amount": response["data"][0]["amt"], + "rate": response["data"][0]["rate"]} + else: + return {"Error": response} def get_account(self, coin, recv_window=5000): diff --git a/main.py b/test.py similarity index 72% rename from main.py rename to test.py index 81a8a4e..4aaa0fc 100644 --- a/main.py +++ b/test.py @@ -11,6 +11,16 @@ okx = earn_okx.okx_earn() gateio = earn_gateio.gateio_earn() if __name__=="__main__": + ''' + DONE: + 1. Unified get_position + 2. Unified get_available_products + + TODO: + 1. subscription and redeem returns unification + 2. Gate.io returns 204 code if subscription or redemption were successful (What were they thinking?) + ''' + ''' Subscribe workflow in Binance: @@ -23,7 +33,7 @@ if __name__=="__main__": #print(binance.get_available_products("USDT")) #print(binance.subscribe_product("USDT001", "10", auto_subscribe=False)) #print(binance.get_position("USDT")) - #print(binance.redeem_product("USDT001", amount="5.00000746")) + #print(binance.redeem_product("USDT001", amount="10.00003989")) @@ -39,7 +49,7 @@ if __name__=="__main__": #print(kucoin.get_available_products("USDT")) #print(kucoin.subscribe_product("2152", "10")) #print(kucoin.get_position("USDT")) - #print(kucoin.redeem_product(order_id="2987632", amount="20")) + #print(kucoin.redeem_product(order_id="2987632", amount="10")) ''' @@ -58,9 +68,10 @@ if __name__=="__main__": #print(okx.transfer_to_funding("USDT","10")) #print(okx.get_transfer_state("1064007151")) #print(okx.subscribe_product("USDT", "10")) - #print(okx.redeem_product("USDT", "20")) - #print(okx.transfer_to_trading("USDT", "20")) - #print(okx.get_transfer_state("1064008141")) + #print(okx.get_position("USDT")) + #print(okx.redeem_product("USDT", "10")) + #print(okx.transfer_to_trading("USDT", "10")) + #print(okx.get_transfer_state("1064541068")) ''' @@ -75,8 +86,10 @@ if __name__=="__main__": ''' #print(gateio.get_min_rate("USDT")) - #print(gateio.redeem_product("USDT", "10", "0.00000452")) - #print(gateio.get_account()) + #print(gateio.subscribe_product("USDT", "10", "0.00000452")) + #print(gateio.get_position("USDT")) + #print(gateio.redeem_product("USDT", "10")) + pass