Skip to content

Commit e3b4dff

Browse files
author
abel
committed
(feat) Applied the new cookies assistant in the AsyncClient
1 parent f871090 commit e3b4dff

File tree

6 files changed

+298
-355
lines changed

6 files changed

+298
-355
lines changed

examples/chain_client/1_MsgSend.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ async def main() -> None:
1111
network = Network.testnet()
1212

1313
# initialize grpc client
14-
# set custom cookie location (optional) - defaults to current dir
15-
client = AsyncClient(network, insecure=False, chain_cookie_location="/tmp/.chain_cookie")
14+
client = AsyncClient(network, insecure=False)
1615
composer = await client.composer()
1716
await client.sync_timeout_height()
1817

pyinjective/async_client.py

Lines changed: 58 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44

55
import grpc
66
import aiocron
7-
import datetime
87
from 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

1210
from pyinjective.composer import Composer
1311

@@ -26,17 +24,10 @@
2624
from .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
)
3128
from .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
)
4132
from .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

Comments
 (0)