failover pool Hyperion utk semua pembacaan /v2/* (V60)
verify_txid (distribute) ⊖ lagi single-host single-shot — blip Hyperion sesaat dulu menahan payout (V59 hold) / gagal ukur reward klaim / kosongkan SALDO LIQUID dashboard. config.py: HYPERION_NODES (CSV VEX_HYPERION_NODES, default HYPERION_API + API_NODES dedup, utama di depan — kedua host mainnet terverifikasi layani /v2, probe 2026-08-13) ; distribute._get_json GET mirror _post_json V58 (3 putaran, 2s, coba semua host per putaran, semua gagal → None) dipakai verify_txid — None kini berarti SEMUA host Hyperion gagal, hold V59 jarang palsu ; claim.reward_from_tx via dist._get_json (tiap attempt settle V55 pool-robust) ; dashboard._get_liquid_vex loop HYPERION_NODES lokal (web ⊖ impor distribute, V31), SALDO LIQUID tetap live saat host mati oracle: test_distribute V60 failover verify_txid + semua-mati None ; test_claim V60 reward_from_tx failover ; test_dashboard V60 saldo cadangan + config default HYPERION_NODES ; docs SPEC §V/V60 + §I + T53 + AGENTS + .env.example image web + dist + claim rebuild + push ; live smoke pool /v2/health
This commit is contained in:
1 parent
663770f51b
commit
69704fa23d
10 files changed
+159
-40
No files matched your search
+31
-8
@@ -20,7 +20,7 @@ import requests
|
||||
|
||||
import db
|
||||
import telegram
|
||||
from config import (API_NODES, BP_PRIVATE_KEY, HYPERION_API,
|
||||
from config import (API_NODES, BP_PRIVATE_KEY, HYPERION_NODES,
|
||||
DISTRIBUTE_ENABLED, DISTRIBUTE_MAX_ATTEMPTS, TARGET_BP,
|
||||
TOKEN_CONTRACT, VEX_SYMBOL)
|
||||
|
||||
@@ -109,19 +109,42 @@ def compute_shares(balance, voters):
|
||||
return shares
|
||||
|
||||
|
||||
def _get_json(url, params=None, max_retries=3, timeout=10):
|
||||
"""GET JSON dengan retry + failover pool Hyperion (V60).
|
||||
|
||||
`url` = path di belakang host (mis. `/v2/history/get_transaction`) — coba
|
||||
SETIAP `HYPERION_NODES` per putaran (semua mainnet terverifikasi layani
|
||||
`/v2`), `max_retries` putaran penuh, jeda 2s antar putaran. → dict bila
|
||||
sukses, None bila SEMUA host gagal SEMUA putaran (⊥ raise — pemanggil
|
||||
butuh None utk jalan tak-terukur / hold, pola `verify_txid`).
|
||||
"""
|
||||
for attempt in range(max_retries):
|
||||
for node in HYPERION_NODES:
|
||||
try:
|
||||
resp = requests.get(f'{node}{url}', params=params, timeout=timeout)
|
||||
resp.raise_for_status()
|
||||
return resp.json()
|
||||
except requests.RequestException:
|
||||
continue
|
||||
if attempt < max_retries - 1:
|
||||
print(f'[Peringatan] Semua node Hyperion gagal, mencoba lagi... '
|
||||
f'({attempt + 1}/{max_retries})', flush=True)
|
||||
time.sleep(2)
|
||||
return None
|
||||
|
||||
|
||||
def verify_txid(txid):
|
||||
"""V22: cek tx benar-benar mendarat via Hyperion `get_transaction`.
|
||||
|
||||
→ True bila `executed`, False bila tak ditemukan/diproses, None bila
|
||||
Hyperion tak terjangkau (⊥ kirim ulang bila tak bisa dipastikan).
|
||||
Hyperion TAK TERJANGKAU (⊥ kirim ulang bila tak bisa dipastikan).
|
||||
V60: None kini berarti SEMUA `HYPERION_NODES` gagal semua putaran
|
||||
(bukan satu host hiccup) — hold V59 jadi jarang palsu.
|
||||
"""
|
||||
try:
|
||||
resp = requests.get(f'{HYPERION_API}/v2/history/get_transaction',
|
||||
params={'id': txid}, timeout=10)
|
||||
resp.raise_for_status()
|
||||
return bool(resp.json().get('executed'))
|
||||
except requests.RequestException:
|
||||
data = _get_json('/v2/history/get_transaction', params={'id': txid})
|
||||
if data is None:
|
||||
return None
|
||||
return bool(data.get('executed'))
|
||||
|
||||
|
||||
def _send_rejected(resp):
|
||||
|
||||
Reference in new issue
Block a user