py-near 1.1.42__py3-none-any.whl → 1.1.44__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
py_near/providers.py CHANGED
@@ -81,7 +81,8 @@ class JsonProvider(object):
81
81
  await asyncio.sleep(3)
82
82
 
83
83
  if not self._available_rpcs:
84
- raise RpcNotAvailableError("All RPCs are unavailable")
84
+ self._available_rpcs = self._rpc_addresses.copy()
85
+ logger.error("All RPCs are async, reset to default list")
85
86
 
86
87
  async def _check_available_rpcs(self):
87
88
  available_rpcs = []
@@ -93,31 +94,40 @@ class JsonProvider(object):
93
94
  "params": {"finality": "final"},
94
95
  "id": 1,
95
96
  }
96
- async with self.session.post(rpc_addr, json=data) as r:
97
- if r.status == 200:
98
- data = json.loads(await r.text())["result"]
99
- if data["sync_info"]["syncing"]:
100
- last_block_ts = datetime.datetime.fromisoformat(
101
- data["sync_info"]["latest_block_time"]
102
- )
103
- diff = (
104
- datetime.datetime.utcnow().timestamp()
105
- - last_block_ts.timestamp()
106
- )
107
- is_syncing = diff > 60
97
+ auth_key = "py-near"
98
+ if "@" in rpc_addr:
99
+ auth_key = rpc_addr.split("//")[1].split("@")[0]
100
+ rpc_addr = rpc_addr.replace(auth_key + "@", "")
101
+ async with aiohttp.ClientSession() as session:
102
+ async with session.post(rpc_addr, json=data, headers={
103
+ "Referer": "https://tgapp.herewallet.app",
104
+ "Authorization": f"Bearer {auth_key}",
105
+ }) as r:
106
+ if r.status == 200:
107
+ data = json.loads(await r.text())["result"]
108
+ if data["sync_info"]["syncing"]:
109
+ last_block_ts = datetime.datetime.fromisoformat(
110
+ data["sync_info"]["latest_block_time"]
111
+ )
112
+ diff = (
113
+ datetime.datetime.utcnow().timestamp()
114
+ - last_block_ts.timestamp()
115
+ )
116
+ is_syncing = diff > 60
117
+ else:
118
+ is_syncing = False
119
+ if is_syncing:
120
+ logger.error(f"Remove async RPC : {rpc_addr} ({diff})")
121
+ continue
122
+ available_rpcs.append(rpc_addr)
108
123
  else:
109
- is_syncing = False
110
- if is_syncing:
111
- logger.error(f"Remove async RPC : {rpc_addr} ({diff})")
112
- continue
113
- available_rpcs.append(rpc_addr)
114
- else:
115
- logger.error(
116
- f"Remove rpc because of error {r.status}: {rpc_addr}"
117
- )
124
+ logger.error(
125
+ f"Remove rpc because of error {r.status}: {rpc_addr}"
126
+ )
118
127
  except Exception as e:
119
128
  if rpc_addr in self._available_rpcs:
120
129
  logger.error(f"Remove rpc: {e}")
130
+ logger.error(f"Rpc check error: {e}")
121
131
  self._available_rpcs = available_rpcs
122
132
 
123
133
  @staticmethod
@@ -137,23 +147,24 @@ class JsonProvider(object):
137
147
  if "@" in rpc_call_addr:
138
148
  auth_key = rpc_call_addr.split("//")[1].split("@")[0]
139
149
  rpc_call_addr = rpc_call_addr.replace(auth_key + "@", "")
140
- r = await self.session.post(
141
- rpc_call_addr,
142
- json=j,
143
- timeout=self._timeout,
144
- headers={
145
- "Referer": "https://tgapp.herewallet.app",
146
- "Authorization": f"Bearer {auth_key}",
147
- }, # NEAR RPC requires Referer header
148
- )
149
- if r.status == 200:
150
- return json.loads(await r.text())
151
- return {
152
- "error": {
153
- "cause": {"name": "RPC_ERROR", "message": f"Status: {r.status}"},
154
- "data": await r.text(),
150
+ async with aiohttp.ClientSession() as session:
151
+ r = await session.post(
152
+ rpc_call_addr,
153
+ json=j,
154
+ timeout=self._timeout,
155
+ headers={
156
+ "Referer": "https://tgapp.herewallet.app",
157
+ "Authorization": f"Bearer {auth_key}",
158
+ }, # NEAR RPC requires Referer header
159
+ )
160
+ if r.status == 200:
161
+ return json.loads(await r.text())
162
+ return {
163
+ "error": {
164
+ "cause": {"name": "RPC_ERROR", "message": f"Status: {r.status}"},
165
+ "data": await r.text(),
166
+ }
155
167
  }
156
- }
157
168
 
158
169
  if broadcast or threshold:
159
170
  pending = [
@@ -161,6 +172,7 @@ class JsonProvider(object):
161
172
  ]
162
173
 
163
174
  responses = []
175
+ correct_responses = []
164
176
  while pending and len(pending):
165
177
  done, pending = await asyncio.wait(
166
178
  pending, return_when=asyncio.FIRST_COMPLETED
@@ -173,7 +185,7 @@ class JsonProvider(object):
173
185
  responses.append(result)
174
186
  except Exception as e:
175
187
  logger.warning(e)
176
- if responses:
188
+ if responses and threshold:
177
189
  array = [hash(json.dumps(x)) for x in responses]
178
190
  most_frequent_element = self.most_frequent_by_hash(array)
179
191
  correct_responses = [
@@ -183,6 +195,7 @@ class JsonProvider(object):
183
195
  for task in pending:
184
196
  task.cancel()
185
197
  return most_frequent_element
198
+ raise RpcEmptyResponse(f"Threshold not reached: {len(correct_responses)}/{threshold}")
186
199
  else:
187
200
  for rpc_addr in self._available_rpcs:
188
201
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: py-near
3
- Version: 1.1.42
3
+ Version: 1.1.44
4
4
  Summary: Pretty simple and fully asynchronous framework for working with NEAR blockchain
5
5
  Author: pvolnov
6
6
  Author-email: petr@herewallet.app
@@ -20,10 +20,10 @@ py_near/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
20
20
  py_near/exceptions/exceptions.py,sha256=DEFipaAHm0y7oCuN2QKzHsiQvUTUQVl-Ce36Ag7n7hs,5509
21
21
  py_near/exceptions/provider.py,sha256=K-wexgjPJ8sw42JePwaP7R5dJEIn9DoFJRvVcURsx6s,7718
22
22
  py_near/models.py,sha256=GZQD1TKGWlwqsJsKRXrVNBjCdAIpk7GQypU-QOtAPFs,11533
23
- py_near/providers.py,sha256=1uRxch7rcDCOPcCIV0gcGtNd8omdtM3MVChJiZjTod8,15718
23
+ py_near/providers.py,sha256=oi4ZE-zYQv78Hiv6qNmdaJ3eD4mXYnSH6aXaP02f2lA,16626
24
24
  py_near/transactions.py,sha256=QAXegv2JpKISk92NaChtIH6-QPHrcWbrwdKH_lH4TsU,3186
25
25
  py_near/utils.py,sha256=FirRH93ydH1cwjn0-sNrZeIn3BRD6QHedrP2VkAdJ6g,126
26
- py_near-1.1.42.dist-info/LICENSE,sha256=I_GOA9xJ35FiL-KnYXZJdATkbO2KcV2dK2enRGVxzKM,1023
27
- py_near-1.1.42.dist-info/METADATA,sha256=-jADRK62NB3mZoSvfakuNIa5kTeAEqZ5BseeJkN6Eko,4713
28
- py_near-1.1.42.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
29
- py_near-1.1.42.dist-info/RECORD,,
26
+ py_near-1.1.44.dist-info/LICENSE,sha256=I_GOA9xJ35FiL-KnYXZJdATkbO2KcV2dK2enRGVxzKM,1023
27
+ py_near-1.1.44.dist-info/METADATA,sha256=YIo51QllJAUSMYBg-9qfPN--N8CAgIzorZHdeTMPBPs,4713
28
+ py_near-1.1.44.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
29
+ py_near-1.1.44.dist-info/RECORD,,