22from urllib .parse import urlparse
33
44import grpc
5+ from grpc import _channel
56import web3
6- from snet .sdk .resources .root_certificate import certificate
7- from snet .sdk .utils .utils import RESOURCES_PATH , add_to_path
87
98from snet .sdk .payment_strategies .payment_strategy import PaymentStrategy
10-
9+ from snet .sdk .resources .root_certificate import certificate
10+ from snet .sdk .utils .utils import RESOURCES_PATH , add_to_path
1111
1212class FreeCallPaymentStrategy (PaymentStrategy ):
1313
14- def is_free_call_available (self , service_client ):
14+ def is_free_call_available (self , service_client ) -> bool :
1515 try :
16- org_id , service_id , group_id , daemon_endpoint = service_client .get_service_details ()
17- email , token_for_free_call , token_expiry_date_block = service_client . get_free_call_config ( )
16+ self . _user_address = service_client .options [ "user_address" ]
17+ self . _free_call_token , self . _token_expiry_date_block = self . get_free_call_token_details ( service_client )
1818
19- if not token_for_free_call :
19+ if not self . _free_call_token :
2020 return False
2121
22- signature , current_block_number = self .generate_signature (service_client )
2322 with add_to_path (str (RESOURCES_PATH .joinpath ("proto" ))):
2423 state_service_pb2 = importlib .import_module ("state_service_pb2" )
2524
2625 with add_to_path (str (RESOURCES_PATH .joinpath ("proto" ))):
2726 state_service_pb2_grpc = importlib .import_module ("state_service_pb2_grpc" )
2827
28+ signature , current_block_number = self .generate_signature (service_client )
29+
2930 request = state_service_pb2 .FreeCallStateRequest ()
30- request .user_id = email
31- request .token_for_free_call = token_for_free_call
32- request .token_expiry_date_block = token_expiry_date_block
31+ request .user_address = self . _user_address
32+ request .token_for_free_call = self . _free_call_token
33+ request .token_expiry_date_block = self . _token_expiry_date_block
3334 request .signature = signature
3435 request .current_block = current_block_number
3536
36- endpoint_object = urlparse (daemon_endpoint )
37- if endpoint_object .port is not None :
38- channel_endpoint = endpoint_object .hostname + ":" + str (endpoint_object .port )
39- else :
40- channel_endpoint = endpoint_object .hostname
41-
42- if endpoint_object .scheme == "http" :
43- channel = grpc .insecure_channel (channel_endpoint )
44- elif endpoint_object .scheme == "https" :
45- channel = grpc .secure_channel (channel_endpoint , grpc .ssl_channel_credentials (root_certificates = certificate ))
46- else :
47- raise ValueError ('Unsupported scheme in service metadata ("{}")' .format (endpoint_object .scheme ))
37+ channel = self .select_channel (service_client )
4838
4939 stub = state_service_pb2_grpc .FreeCallStateServiceStub (channel )
5040 response = stub .GetFreeCallsAvailable (request )
5141 if response .free_calls_available > 0 :
5242 return True
5343 return False
44+ except grpc .RpcError as e :
45+ if self ._user_address :
46+ print (f"Warning: { e .details ()} " )
47+ return False
5448 except Exception as e :
5549 return False
5650
57- def get_payment_metadata (self , service_client ):
58- email , token_for_free_call , token_expiry_date_block = service_client .get_free_call_config ()
51+ def get_payment_metadata (self , service_client ) -> list :
5952 signature , current_block_number = self .generate_signature (service_client )
60- metadata = [("snet-free-call-auth-token-bin" , token_for_free_call ),
61- ("snet-free-call-token-expiry-block" , str (token_expiry_date_block )),
53+ metadata = [("snet-free-call-auth-token-bin" , self . _free_call_token ),
54+ ("snet-free-call-token-expiry-block" , str (self . _token_expiry_date_block )),
6255 ("snet-payment-type" , "free-call" ),
63- ("snet-free-call-user-id" , email ),
56+ ("snet-free-call-user-id" , self . _user_address ),
6457 ("snet-current-block-number" , str (current_block_number )),
6558 ("snet-payment-channel-signature-bin" , signature )]
6659
6760 return metadata
6861
69- def select_channel (self , service_client ):
70- pass
71-
72- def generate_signature (self , service_client ):
73- org_id , service_id , group_id , daemon_endpoint = service_client .get_service_details ()
74- email , token_for_free_call , token_expiry_date_block = service_client .get_free_call_config ()
75-
76- if token_expiry_date_block == 0 or len (email ) == 0 or len (token_for_free_call ) == 0 :
62+ def select_channel (self , service_client ) -> _channel .Channel :
63+ _ , _ , _ , daemon_endpoint = service_client .get_service_details ()
64+ endpoint_object = urlparse (daemon_endpoint )
65+ if endpoint_object .port is not None :
66+ channel_endpoint = endpoint_object .hostname + ":" + str (endpoint_object .port )
67+ else :
68+ channel_endpoint = endpoint_object .hostname
69+
70+ if endpoint_object .scheme == "http" :
71+ channel = grpc .insecure_channel (channel_endpoint )
72+ elif endpoint_object .scheme == "https" :
73+ channel = grpc .secure_channel (channel_endpoint , grpc .ssl_channel_credentials (root_certificates = certificate ))
74+ else :
75+ raise ValueError ('Unsupported scheme in service metadata ("{}")' .format (endpoint_object .scheme ))
76+ return channel
77+
78+ def generate_signature (self , service_client ) -> tuple [bytes , int ]:
79+ org_id , service_id , group_id , _ = service_client .get_service_details ()
80+
81+ if self ._token_expiry_date_block == 0 or len (self ._user_address ) == 0 or len (self ._free_call_token ) == 0 :
7782 raise Exception (
7883 "You are using default 'FreeCallPaymentStrategy' to use this strategy you need to pass "
79- "'free_call_auth_token-bin','email ','free-call-token-expiry-block' in config" )
84+ "'free_call_auth_token-bin','user_address ','free-call-token-expiry-block' in config" )
8085
8186 current_block_number = service_client .get_current_block_number ()
8287
8388 message = web3 .Web3 .solidity_keccak (
8489 ["string" , "string" , "string" , "string" , "string" , "uint256" , "bytes32" ],
85- ["__prefix_free_trial" , email , org_id , service_id , group_id , current_block_number ,
86- token_for_free_call ]
90+ ["__prefix_free_trial" , self . _user_address , org_id , service_id , group_id , current_block_number ,
91+ self . _free_call_token ]
8792 )
8893 return service_client .generate_signature (message ), current_block_number
94+
95+ def get_free_call_token_details (self , service_client ) -> tuple [bytes , int ]:
96+ with add_to_path (str (RESOURCES_PATH .joinpath ("proto" ))):
97+ state_service_pb2 = importlib .import_module ("state_service_pb2" )
98+
99+ request = state_service_pb2 .GetFreeCallTokenRequest ()
100+ request .address = self ._user_address
101+
102+ with add_to_path (str (RESOURCES_PATH .joinpath ("proto" ))):
103+ state_service_pb2_grpc = importlib .import_module ("state_service_pb2_grpc" )
104+
105+ channel = self .select_channel (service_client )
106+ stub = state_service_pb2_grpc .FreeCallStateServiceStub (channel )
107+ response = stub .GetFreeCallToken (request )
108+
109+ return response .token , response .token_expiration_block
110+
0 commit comments