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:
1 parent
cc9df71d9e
commit
e9df89aaac
4 files changed
+104
-30
No files matched your search
@@ -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')
|
||||
|
||||
Reference in new issue
Block a user