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:
1 parent
b0b3ba8ab3
commit
41990af9af
10 files changed
+131
-159
No files matched your search
+27
-7
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user