klaim: ⊥ percaya send() semata (V46/B11): landing dikonfirmasi di jalur sukses & exception via _confirm_landed (Hyperion executed ATAU last_claim_time maju dari baseline) — send() pyntelope ⊥ raise saat chain tolak (HTTP 500 sbg body) ; tak terkonfirmasi → retry senyap ⊥ catat/notif ; next_window baca producer gagal → raise (⊥ clamp prematur) ; image claim rebuild + push

This commit is contained in:
proitlab committed 2026-08-07 16:45:05 +07:00
1 parent cc9df71d9e
commit e9df89aaac
4 files changed
+104 -30

No files matched your search

+46 -26
View File
@@ -4,10 +4,13 @@ Setiap siklus (V32..V34): tentukan jendela klaim = `last_claim_time` (tabel
`producers`) + 24 jam, tidur sampai mendekatinya, lalu poll `claimrewards`
tiap `CLAIM_RETRY_SECONDS` sampai diterima chain. Jendela yang sudah lewat
(≥24 jam sejak last) → klaim dikejar segera (recovery, ⊥ spin-timeout
selamanya). Reward diukur PRIORITAS dari isi tx klaim via Hyperion (jumlah
transfer `vex.bpay`/`vex.vpay` → TARGET_BP; V45) — ⊥ selisih saldo yang
flaky/stale; selisih saldo jadi fallback; keduanya gagal → fee `pending` +
notif cek manual. Fee = floor(`VEX_BP_FEE_PERCENT` × reward) 4 desimal →
selamanya). Landing dikonfirmasi via Hyperion `executed` ATAU `last_claim_time`
maju dari baseline — `send()` pyntelope TIDAK raise saat chain menolak (HTTP
500 dikembalikan sbg body), jadi ⊥ pernah percaya send() semata (V46/B11).
Reward diukur PRIORITAS dari isi tx klaim via Hyperion (jumlah transfer
`vex.bpay`/`vex.vpay` → TARGET_BP; V45) — ⊥ selisih saldo yang flaky/stale;
selisih saldo jadi fallback; keduanya gagal → fee `pending` + notif cek
manual. Fee = floor(`VEX_BP_FEE_PERCENT` × reward) 4 desimal →
`VEX_BP_FEE_WALLET` (default `bpdbsjasprod`), memo `BP FEE YYYY-MM-DD` (V33).
Siklus selesai ⊥ bila klaim tercatat di `claim_runs` DAN fee terkirim; fee
@@ -82,10 +85,10 @@ def next_window(now):
⊥ jadi spin-timeout selamanya; klaim dikejar segera, lalu jendela dihitung
ulang dari last_claim_time yang baru.
Pembacaan `last_claim_time` node flaky di-retry: respons tak terbaca ⊥
langsung dianggap "belum pernah klaim" (yang akan clamp ke now prematur
→ percobaan klaim sebelum jendela → ditolak chain); hanya bila pembacaan
tetap gagal total maka `now` dipakai."""
Pembacaan `last_claim_time` node flaky di-retry: bila SEMUA pembacaan
gagal/kosong → raise (loop catch-and-sleep, ⊥ clamp ke now prematur yang
memicu percobaan klaim sebelum jendela → ditolak chain). `now` hanya utk
pembacaan yang BENAR-BENAR berhasil tanpa klaim sebelumnya (BP baru)."""
raw = None
for _ in range(3):
try:
@@ -93,8 +96,10 @@ def next_window(now):
if raw:
break
except Exception:
pass
raw = None
time.sleep(2)
if not raw:
raise RuntimeError('tak bisa membaca last_claim_time producer')
last = parse_claim_time(raw)
if last is None:
return now
@@ -180,14 +185,35 @@ def _measure_reward(txid, before):
return None
def _confirm_landed(txid, last_before):
"""Konfirmasi tx klaim benar-benar mendarat. → True | False (⊥ None).
`send()` pyntelope TIDAK raise saat chain menolak (HTTP 500 dikembalikan
sbg body) — jadi "sukses kirim" ⊥ cukup (V46/B11). Mendarat hanya bila
Hyperion `executed` ATAU `last_claim_time` MAJU dari baseline sebelum kirim.
Hyperion tak terjangkau (None) → cek `_claim_time_advanced`; False → retry
senyap (⊥ catat baris / sukses-0)."""
verified = dist.verify_txid(txid)
if verified is True:
return True
if verified is False:
return False
try:
last_after = fetch_producer_last_claim()
except Exception:
last_after = None
return _claim_time_advanced(last_before, last_after)
def _try_claim_once():
"""Satu percobaan klaim: klaim → ukur reward → catat `claim_runs`.
"""Satu percobaan klaim: klaim → konfirmasi mendarat → ukur reward →
catat `claim_runs`.
Return `claimed` (baris tercatat, fee pending/skipped) | `retry`.
Klaim yang sudah mendarat walau timeout (verifikasi txid / `last_claim_time`
maju) tetap diukur — reward tak hilang (V34).
V45: reward diukur dari isi tx (transfer bpay/vpay) — prioritas; selisih
saldo jadi fallback; keduanya gagal → fee `pending` + notif cek manual
Landing dikonfirmasi di KEDUA jalur (send sukses maupun exception) — `send()`
pyntelope ⊥ raise saat chain menolak (V46/B11); tak terkonfirmasi → retry
senyap. Reward diukur dari isi tx (transfer bpay/vpay) — prioritas (V45);
selisih saldo fallback; keduanya gagal → fee `pending` + notif cek manual
(⊥ sukses-0 yang menyesatkan).
"""
before = dist.fetch_balance()
@@ -203,23 +229,17 @@ def _try_claim_once():
signed = build_claim_action()
txid = signed.id()
signed.send()
landed = True
landed = _confirm_landed(txid, last_before)
except Exception as exc:
if txid is not None:
verified = dist.verify_txid(txid)
if verified is True:
landed = True
elif verified is None:
# tak bisa dipastikan via Hyperion — cek apakah last_claim_time
# benar-benar MAJU dari baseline (⊥ heuristik "dalam 24 jam")
try:
last_after = fetch_producer_last_claim()
except Exception:
last_after = None
landed = _claim_time_advanced(last_before, last_after)
landed = _confirm_landed(txid, last_before)
if not landed:
print(f'[Peringatan] klaim gagal: {exc}', flush=True)
return 'retry'
if not landed:
print('[Peringatan] klaim terkirim tapi tak terkonfirmasi mendarat '
'— retry (⊥ catat sukses)', flush=True)
return 'retry'
reward = _measure_reward(txid, before)
now = datetime.now()
now_iso = now.isoformat(timespec='seconds')