T15: buang voter basi di scan + hapus bobot suara & UI basi di web

get_voters.py kini menyimpan hanya pemilih segar (last_vote tak
diketahui atau > VEX_STALE_DAYS dibuang di normalize, V13). Web
menampilkan kolom RANK/AKUN/STAKE/VOTE TERAKHIR, tanpa BOBOT SUARA,
stat VOTE BASI, penanda/ filter ?stale=1 (V15). voters.db dipangkas
336 → 42. Oracle diperbarui dan lolos.
This commit is contained in:
proitlab committed 2026-08-04 17:18:50 +07:00
1 parent b0b3ba8ab3
commit 41990af9af
10 files changed
+131 -159

No files matched your search

+27 -7
View File
@@ -1,17 +1,18 @@
"""Scan tabel voters Vexanium, simpan pemilih BP databisnisid + bobot suara ke SQLite.
Berjalan imparsial (repeatable) dan siap dijadwalkan (cron). Memakai requests.
Hanya pemilih segar (revote ≤ VEX_STALE_DAYS lalu) yang disimpan — vote basi
dibuang. Berjalan imparsial (repeatable) dan siap dijadwalkan (cron).
"""
import math
import sqlite3
import sys
import time
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
import requests
from config import API_NODE, DB_PATH, MIN_STAKED_VEX, TARGET_BP
from config import API_NODE, DB_PATH, MIN_STAKED_VEX, TARGET_BP, VEX_STALE_DAYS
# Kontrak & scope sistem Vexanium = vexcore (BUKAN vexio sesuai konvensi EOS)
CODE = 'vexcore'
@@ -104,8 +105,23 @@ def scan_voters():
return rows_all
def normalize(row):
"""V4/V5/V6: saring ke baris yang relevan, bidang dinormalisasi."""
def _is_stale(last_vote, now):
"""V13: apakah revote terakhir sudah lewat ambang basi (VEX_STALE_DAYS)."""
try:
vote_at = datetime.fromisoformat(last_vote)
except (TypeError, ValueError):
return True
return (now - vote_at) > timedelta(days=VEX_STALE_DAYS)
def normalize(row, now=None):
"""V4/V5/V6/V13: saring ke baris yang relevan, bidang dinormalisasi.
V13: pemilih dengan last_vote tak diketahui atau basi dibuang di sini —
hanya pemilih segar yang berakhir di DB.
"""
if now is None:
now = datetime.now(timezone.utc).replace(tzinfo=None)
owner = row['owner']
if owner == ZERO_OWNER: # V4: lewati sentinel nama akun 0
return None
@@ -114,11 +130,14 @@ def normalize(row):
staked_vex = float(row.get('staked', 0)) / 10000 # V8/V9: bisa string, ÷10000
if staked_vex < MIN_STAKED_VEX:
return None
last_vote = derive_last_vote(row.get('last_vote_weight', ''), staked_vex)
if last_vote is None or _is_stale(last_vote, now): # V13: basi ⊥ disimpan
return None
return {
'owner': owner,
'weight': row.get('last_vote_weight', ''), # V6: bobot verbatim (string)
'staked': staked_vex,
'last_vote': derive_last_vote(row.get('last_vote_weight', ''), staked_vex),
'last_vote': last_vote,
}
@@ -171,9 +190,10 @@ def main():
"""Titik masuk CLI."""
print(f'Mulai memindai voters untuk BP: "{TARGET_BP}"...')
raw = scan_voters()
now = datetime.now(timezone.utc).replace(tzinfo=None)
filtered = []
for row in raw:
item = normalize(row)
item = normalize(row, now=now) # satu stempel waktu untuk seluruh skan
if item is not None:
filtered.append(item)
scanned_at = persist(filtered)