1
1
import base64
2
2
import json
3
+ import re
3
4
from typing import Any , Optional
5
+ from secret_sdk .exceptions import LCDResponseError
4
6
5
7
from secret_sdk .client .lcd .api ._base import BaseAsyncAPI , sync_bind
6
8
from secret_sdk .core .coins import Coins
@@ -62,7 +64,6 @@ async def code_hash_by_code_id(self, code_id: int) -> dict:
62
64
res = await self ._c ._get (f"/compute/v1beta1/code_hash/by_code_id/{ code_id } " )
63
65
return res
64
66
65
-
66
67
async def contract_hash (self , contract_address : str ) -> str :
67
68
"""Fetches information about an instantiated contract.
68
69
@@ -81,7 +82,7 @@ async def contract_hash(self, contract_address: str) -> str:
81
82
return _contract_code_hash [contract_address ]
82
83
83
84
async def contract_query (
84
- self , contract_address : str , query : dict , contract_code_hash : Optional [str ] = None ,
85
+ self , contract_address : str , query : dict , contract_code_hash : Optional [str ] = None ,
85
86
height : Optional [int ] = 0 , timeout : Optional [int ] = 15 , retry_attempts : Optional [int ] = 1
86
87
) -> Any :
87
88
"""Runs a QueryMsg on a contract.
@@ -114,21 +115,33 @@ async def contract_query(
114
115
params ['block_height' ] = str (height )
115
116
116
117
query_path = f"/compute/v1beta1/query/{ contract_address } "
117
- query_result = await BaseAsyncAPI ._try_await (
118
- self ._c ._get (query_path , params = params , timeout = timeout , retry_attempts = retry_attempts )
119
- )
118
+ try :
119
+ query_result = await BaseAsyncAPI ._try_await (
120
+ self ._c ._get (query_path , params = params , timeout = timeout , retry_attempts = retry_attempts )
121
+ )
122
+ except LCDResponseError as lcd_error :
123
+ # trying to decrypt error
124
+ error_json = json .loads (lcd_error .message .replace ("'" , '"' ))
125
+ error_msg = error_json .get ('message' ,'' )
126
+ encrypted_error = re .findall ('encrypted: (.+?):' , error_msg )
127
+ if encrypted_error :
128
+ decrypted_error = self ._c .encrypt_utils .decrypt (base64 .b64decode (bytes (encrypted_error [0 ], 'utf-8' )), nonce )
129
+ lcd_error .message = decrypted_error .decode ('utf-8' )
130
+ raise lcd_error
131
+ except :
132
+ raise
120
133
121
134
encoded_result = base64 .b64decode (bytes (query_result ["data" ], "utf-8" ))
122
135
decrypted = self ._c .encrypt_utils .decrypt (encoded_result , nonce )
123
136
return json .loads (base64 .b64decode (decrypted ))
124
137
125
138
async def contract_execute_msg (
126
- self ,
127
- sender_address : AccAddress ,
128
- contract_address : AccAddress ,
129
- handle_msg : dict ,
130
- transfer_amount : Optional [Coins ] = None ,
131
- contract_code_hash : Optional [str ] = None
139
+ self ,
140
+ sender_address : AccAddress ,
141
+ contract_address : AccAddress ,
142
+ handle_msg : dict ,
143
+ transfer_amount : Optional [Coins ] = None ,
144
+ contract_code_hash : Optional [str ] = None
132
145
) -> MsgExecuteContract :
133
146
if not contract_code_hash :
134
147
if contract_address not in _contract_code_hash :
@@ -183,7 +196,7 @@ def code_hash_by_code_id(self, code_info: int) -> dict:
183
196
184
197
@sync_bind (AsyncWasmAPI .contract_query )
185
198
def contract_query (
186
- self , contract_address : str , query_msg : dict , contract_code_hash : Optional [str ] = None ,
199
+ self , contract_address : str , query_msg : dict , contract_code_hash : Optional [str ] = None ,
187
200
height : Optional [int ] = 0 , timeout : Optional [int ] = 15 , retry_attempts : Optional [int ] = 1
188
201
) -> Any :
189
202
pass
@@ -192,12 +205,12 @@ def contract_query(
192
205
193
206
@sync_bind (AsyncWasmAPI .contract_execute_msg )
194
207
def contract_execute_msg (
195
- self ,
196
- sender_address : AccAddress ,
197
- contract_address : AccAddress ,
198
- handle_msg : dict ,
199
- transfer_amount : Coins ,
200
- contract_code_hash : str
208
+ self ,
209
+ sender_address : AccAddress ,
210
+ contract_address : AccAddress ,
211
+ handle_msg : dict ,
212
+ transfer_amount : Coins ,
213
+ contract_code_hash : str
201
214
) -> MsgExecuteContract :
202
215
pass
203
216
0 commit comments