44
55import grpc
66import aiocron
7- import datetime
87from decimal import Decimal
9- from http .cookies import SimpleCookie
10- from typing import Dict , List , Optional , Tuple , Union
8+ from typing import Dict , List , Optional , Tuple , Union , Coroutine
119
1210from pyinjective .composer import Composer
1311
2624from .proto .cosmos .auth .v1beta1 import (
2725 query_pb2_grpc as auth_query_grpc ,
2826 query_pb2 as auth_query ,
29- auth_pb2 as auth_type ,
3027)
3128from .proto .cosmos .authz .v1beta1 import (
3229 query_pb2_grpc as authz_query_grpc ,
3330 query_pb2 as authz_query ,
34- authz_pb2 as authz_type ,
35- )
36- from .proto .cosmos .authz .v1beta1 import (
37- query_pb2_grpc as authz_query_grpc ,
38- query_pb2 as authz_query ,
39- authz_pb2 as authz_type ,
4031)
4132from .proto .cosmos .bank .v1beta1 import (
4233 query_pb2_grpc as bank_query_grpc ,
@@ -85,31 +76,14 @@ def __init__(
8576 self ,
8677 network : Network ,
8778 insecure : bool = False ,
88- load_balancer : bool = True ,
8979 credentials = grpc .ssl_channel_credentials (),
90- chain_cookie_location = ".chain_cookie" ,
9180 ):
9281
93- # use append mode to create file if not exist
94- self .chain_cookie_location = chain_cookie_location
95- cookie_file = open (chain_cookie_location , "a+" )
96- cookie_file .close ()
97-
9882 self .addr = ""
9983 self .number = 0
10084 self .sequence = 0
10185
102- self .cookie_type = None
103- self .expiration_format = None
104- self .load_balancer = load_balancer
10586 self .network = network
106- self .cookie_type = "GCLB"
107- self .expiration_format = "{}"
108-
109- if self .network .string () == "testnet" :
110- self .load_balancer = False
111- self .cookie_type = "grpc-cookie"
112- self .expiration_format = "20{}"
11387
11488 # chain stubs
11589 self .chain_channel = (
@@ -126,14 +100,6 @@ def __init__(
126100 self .stubBank = bank_query_grpc .QueryStub (self .chain_channel )
127101 self .stubTx = tx_service_grpc .ServiceStub (self .chain_channel )
128102
129- # attempt to load from disk
130- cookie_file = open (chain_cookie_location , "r+" )
131- self .chain_cookie = cookie_file .read ()
132- cookie_file .close ()
133- LoggerProvider ().logger_for_class (logging_class = self .__class__ ).info (
134- f"chain session cookie loaded from disk: { self .chain_cookie } "
135- )
136-
137103 self .exchange_cookie = ""
138104 self .timeout_height = 1
139105
@@ -249,99 +215,15 @@ async def sync_timeout_height(self):
249215 )
250216 self .timeout_height = 0
251217
252- # cookie helper methods
253- async def fetch_cookie (self , type ):
254- metadata = None
255- if type == "chain" :
256- req = tendermint_query .GetLatestBlockRequest ()
257- metadata = await self .stubCosmosTendermint .GetLatestBlock (
258- req
259- ).initial_metadata ()
260- time .sleep (DEFAULT_BLOCK_TIME )
261- if type == "exchange" :
262- req = exchange_meta_rpc_pb .VersionRequest ()
263- metadata = await self .stubMeta .Version (req ).initial_metadata ()
264- return metadata
265-
266- async def renew_cookie (self , existing_cookie , type ):
267- metadata = None
268- # format cookie date into RFC1123 standard
269- cookie = SimpleCookie ()
270- cookie .load (existing_cookie )
271-
272- expires_at = cookie .get (f"{ self .cookie_type } " ).get ("expires" )
273- expires_at = expires_at .replace ("-" , " " )
274- yyyy = f"{ self .expiration_format } " .format (expires_at [12 :14 ])
275- expires_at = expires_at [:12 ] + yyyy + expires_at [14 :]
276-
277- # parse expire field to unix timestamp
278- expire_timestamp = datetime .datetime .strptime (
279- expires_at , "%a, %d %b %Y %H:%M:%S GMT"
280- ).timestamp ()
281-
282- # renew session if timestamp diff < offset
283- timestamp_diff = expire_timestamp - int (time .time ())
284- if timestamp_diff < DEFAULT_SESSION_RENEWAL_OFFSET :
285- metadata = await self .fetch_cookie (type )
286- else :
287- metadata = (("cookie" , existing_cookie ),)
288- return metadata
289-
290- async def load_cookie (self , type ):
291- metadata = None
292- if self .insecure :
293- return metadata
294-
295- if type == "chain" :
296- if self .chain_cookie != "" :
297- metadata = await self .renew_cookie (self .chain_cookie , type )
298- self .set_cookie (metadata , type )
299- else :
300- metadata = await self .fetch_cookie (type )
301- self .set_cookie (metadata , type )
302-
303- if type == "exchange" :
304- if self .exchange_cookie != "" :
305- metadata = await self .renew_cookie (self .exchange_cookie , type )
306- self .set_cookie (metadata , type )
307- else :
308- metadata = await self .fetch_cookie (type )
309- self .set_cookie (metadata , type )
310-
311- return metadata
312-
313- def set_cookie (self , metadata , type ):
314- new_cookie = None
315- if self .insecure :
316- return new_cookie
317-
318- for k , v in metadata :
319- if k == "set-cookie" :
320- new_cookie = v
321-
322- if new_cookie == None :
323- return
324-
325- if type == "chain" :
326- # write to client instance
327- self .chain_cookie = new_cookie
328- # write to disk
329- cookie_file = open (self .chain_cookie_location , "w" )
330- cookie_file .write (new_cookie )
331- cookie_file .close ()
332- LoggerProvider ().logger_for_class (logging_class = self .__class__ ).info ("chain session cookie saved to disk" )
333-
334- if type == "exchange" :
335- self .exchange_cookie = new_cookie
336-
337218 # default client methods
338219 async def get_latest_block (self ) -> tendermint_query .GetLatestBlockResponse :
339220 req = tendermint_query .GetLatestBlockRequest ()
340221 return await self .stubCosmosTendermint .GetLatestBlock (req )
341222
342223 async def get_account (self , address : str ) -> Optional [account_pb2 .EthAccount ]:
343224 try :
344- metadata = await self .load_cookie (type = "chain" )
225+ metadata = await self .network .chain_metadata (
226+ metadata_query_provider = self ._chain_cookie_metadata_requestor )
345227 account_any = (await self .stubAuth .Account (
346228 auth_query .QueryAccountRequest (address = address ), metadata = metadata
347229 )).account
@@ -379,7 +261,8 @@ async def simulate_tx(
379261 ) -> Tuple [Union [abci_type .SimulationResponse , grpc .RpcError ], bool ]:
380262 try :
381263 req = tx_service .SimulateRequest (tx_bytes = tx_byte )
382- metadata = await self .load_cookie (type = "chain" )
264+ metadata = await self .network .chain_metadata (
265+ metadata_query_provider = self ._chain_cookie_metadata_requestor )
383266 return await self .stubTx .Simulate (request = req , metadata = metadata ), True
384267 except grpc .RpcError as err :
385268 return err , False
@@ -388,23 +271,23 @@ async def send_tx_sync_mode(self, tx_byte: bytes) -> abci_type.TxResponse:
388271 req = tx_service .BroadcastTxRequest (
389272 tx_bytes = tx_byte , mode = tx_service .BroadcastMode .BROADCAST_MODE_SYNC
390273 )
391- metadata = await self .load_cookie ( type = "chain" )
274+ metadata = await self .network . chain_metadata ( metadata_query_provider = self . _chain_cookie_metadata_requestor )
392275 result = await self .stubTx .BroadcastTx (request = req , metadata = metadata )
393276 return result .tx_response
394277
395278 async def send_tx_async_mode (self , tx_byte : bytes ) -> abci_type .TxResponse :
396279 req = tx_service .BroadcastTxRequest (
397280 tx_bytes = tx_byte , mode = tx_service .BroadcastMode .BROADCAST_MODE_ASYNC
398281 )
399- metadata = await self .load_cookie ( type = "chain" )
282+ metadata = await self .network . chain_metadata ( metadata_query_provider = self . _chain_cookie_metadata_requestor )
400283 result = await self .stubTx .BroadcastTx (request = req , metadata = metadata )
401284 return result .tx_response
402285
403286 async def send_tx_block_mode (self , tx_byte : bytes ) -> abci_type .TxResponse :
404287 req = tx_service .BroadcastTxRequest (
405288 tx_bytes = tx_byte , mode = tx_service .BroadcastMode .BROADCAST_MODE_BLOCK
406289 )
407- metadata = await self .load_cookie ( type = "chain" )
290+ metadata = await self .network . chain_metadata ( metadata_query_provider = self . _chain_cookie_metadata_requestor )
408291 result = await self .stubTx .BroadcastTx (request = req , metadata = metadata )
409292 return result .tx_response
410293
@@ -672,7 +555,9 @@ async def stream_spot_markets(self, **kwargs):
672555 req = spot_exchange_rpc_pb .StreamMarketsRequest (
673556 market_ids = kwargs .get ("market_ids" )
674557 )
675- metadata = await self .load_cookie (type = "exchange" )
558+ metadata = await self .network .exchange_metadata (
559+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
560+ )
676561 return self .stubSpotExchange .StreamMarkets (request = req , metadata = metadata )
677562
678563 async def get_spot_orderbookV2 (self , market_id : str ):
@@ -729,12 +614,16 @@ async def get_spot_trades(self, **kwargs):
729614
730615 async def stream_spot_orderbook_snapshot (self , market_ids : List [str ]):
731616 req = spot_exchange_rpc_pb .StreamOrderbookV2Request (market_ids = market_ids )
732- metadata = await self .load_cookie (type = "exchange" )
617+ metadata = await self .network .exchange_metadata (
618+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
619+ )
733620 return self .stubSpotExchange .StreamOrderbookV2 (request = req , metadata = metadata )
734621
735622 async def stream_spot_orderbook_update (self , market_ids : List [str ]):
736623 req = spot_exchange_rpc_pb .StreamOrderbookUpdateRequest (market_ids = market_ids )
737- metadata = await self .load_cookie (type = "exchange" )
624+ metadata = await self .network .exchange_metadata (
625+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
626+ )
738627 return self .stubSpotExchange .StreamOrderbookUpdate (request = req , metadata = metadata )
739628
740629 async def stream_spot_orders (self , market_id : str , ** kwargs ):
@@ -743,7 +632,9 @@ async def stream_spot_orders(self, market_id: str, **kwargs):
743632 order_side = kwargs .get ("order_side" ),
744633 subaccount_id = kwargs .get ("subaccount_id" ),
745634 )
746- metadata = await self .load_cookie (type = "exchange" )
635+ metadata = await self .network .exchange_metadata (
636+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
637+ )
747638 return self .stubSpotExchange .StreamOrders (request = req , metadata = metadata )
748639
749640 async def stream_historical_spot_orders (self , market_id : str , ** kwargs ):
@@ -755,7 +646,9 @@ async def stream_historical_spot_orders(self, market_id: str, **kwargs):
755646 state = kwargs .get ("state" ),
756647 execution_types = kwargs .get ("execution_types" )
757648 )
758- metadata = await self .load_cookie (type = "exchange" )
649+ metadata = await self .network .exchange_metadata (
650+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
651+ )
759652 return self .stubSpotExchange .StreamOrdersHistory (request = req , metadata = metadata )
760653
761654 async def stream_historical_derivative_orders (self , market_id : str , ** kwargs ):
@@ -767,7 +660,9 @@ async def stream_historical_derivative_orders(self, market_id: str, **kwargs):
767660 state = kwargs .get ("state" ),
768661 execution_types = kwargs .get ("execution_types" )
769662 )
770- metadata = await self .load_cookie (type = "exchange" )
663+ metadata = await self .network .exchange_metadata (
664+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
665+ )
771666 return self .stubDerivativeExchange .StreamOrdersHistory (request = req , metadata = metadata )
772667
773668 async def stream_spot_trades (self , ** kwargs ):
@@ -780,7 +675,9 @@ async def stream_spot_trades(self, **kwargs):
780675 subaccount_ids = kwargs .get ("subaccount_ids" ),
781676 execution_types = kwargs .get ("execution_types" ),
782677 )
783- metadata = await self .load_cookie (type = "exchange" )
678+ metadata = await self .network .exchange_metadata (
679+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
680+ )
784681 return self .stubSpotExchange .StreamTrades (request = req , metadata = metadata )
785682
786683 async def get_spot_subaccount_orders (self , subaccount_id : str , ** kwargs ):
@@ -820,7 +717,9 @@ async def stream_derivative_markets(self, **kwargs):
820717 req = derivative_exchange_rpc_pb .StreamMarketRequest (
821718 market_ids = kwargs .get ("market_ids" )
822719 )
823- metadata = await self .load_cookie (type = "exchange" )
720+ metadata = await self .network .exchange_metadata (
721+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
722+ )
824723 return self .stubDerivativeExchange .StreamMarket (request = req , metadata = metadata )
825724
826725 async def get_derivative_orderbook (self , market_id : str ):
@@ -886,12 +785,16 @@ async def get_derivative_trades(self, **kwargs):
886785
887786 async def stream_derivative_orderbook_snapshot (self , market_ids : List [str ]):
888787 req = derivative_exchange_rpc_pb .StreamOrderbookV2Request (market_ids = market_ids )
889- metadata = await self .load_cookie (type = "exchange" )
788+ metadata = await self .network .exchange_metadata (
789+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
790+ )
890791 return self .stubDerivativeExchange .StreamOrderbookV2 (request = req , metadata = metadata )
891792
892793 async def stream_derivative_orderbook_update (self , market_ids : List [str ]):
893794 req = derivative_exchange_rpc_pb .StreamOrderbookUpdateRequest (market_ids = market_ids )
894- metadata = await self .load_cookie (type = "exchange" )
795+ metadata = await self .network .exchange_metadata (
796+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
797+ )
895798 return self .stubDerivativeExchange .StreamOrderbookUpdate (request = req , metadata = metadata )
896799
897800 async def stream_derivative_orders (self , market_id : str , ** kwargs ):
@@ -900,7 +803,9 @@ async def stream_derivative_orders(self, market_id: str, **kwargs):
900803 order_side = kwargs .get ("order_side" ),
901804 subaccount_id = kwargs .get ("subaccount_id" ),
902805 )
903- metadata = await self .load_cookie (type = "exchange" )
806+ metadata = await self .network .exchange_metadata (
807+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
808+ )
904809 return self .stubDerivativeExchange .StreamOrders (request = req , metadata = metadata )
905810
906811 async def stream_derivative_trades (self , ** kwargs ):
@@ -915,7 +820,9 @@ async def stream_derivative_trades(self, **kwargs):
915820 limit = kwargs .get ("limit" ),
916821 execution_types = kwargs .get ("execution_types" ),
917822 )
918- metadata = await self .load_cookie (type = "exchange" )
823+ metadata = await self .network .exchange_metadata (
824+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
825+ )
919826 return self .stubDerivativeExchange .StreamTrades (request = req , metadata = metadata )
920827
921828 async def get_derivative_positions (self , ** kwargs ):
@@ -937,7 +844,9 @@ async def stream_derivative_positions(self, **kwargs):
937844 subaccount_id = kwargs .get ("subaccount_id" ),
938845 subaccount_ids = kwargs .get ("subaccount_ids" ),
939846 )
940- metadata = await self .load_cookie (type = "exchange" )
847+ metadata = await self .network .exchange_metadata (
848+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
849+ )
941850 return self .stubDerivativeExchange .StreamPositions (request = req , metadata = metadata )
942851
943852 async def get_derivative_liquidable_positions (self , ** kwargs ):
@@ -1013,7 +922,9 @@ async def stream_account_portfolio(self, account_address: str, **kwargs):
1013922 subaccount_id = kwargs .get ("subaccount_id" ),
1014923 type = kwargs .get ("type" )
1015924 )
1016- metadata = await self .load_cookie (type = "exchange" )
925+ metadata = await self .network .exchange_metadata (
926+ metadata_query_provider = self ._exchange_cookie_metadata_requestor
927+ )
1017928 return self .stubPortfolio .StreamAccountPortfolio (request = req , metadata = metadata )
1018929
1019930 async def composer (self ):
@@ -1152,3 +1063,11 @@ def _token_representation(self, symbol: str, token_meta, denom: str, all_tokens:
11521063 existing_token = token
11531064
11541065 return existing_token
1066+
1067+ def _chain_cookie_metadata_requestor (self ) -> Coroutine :
1068+ request = tendermint_query .GetLatestBlockRequest ()
1069+ return self .stubCosmosTendermint .GetLatestBlock (request ).initial_metadata ()
1070+
1071+ def _exchange_cookie_metadata_requestor (self ) -> Coroutine :
1072+ request = exchange_meta_rpc_pb .VersionRequest ()
1073+ return self .stubMeta .Version (request ).initial_metadata ()
0 commit comments