Commit Graph
52 Commits
Author SHA1 Message Date
proitlab efd0e9374b backprop §B.25 + §V.64: oracle banner BERITA hermetik — route index pakai helper _now() injectable (⊖ datetime.now() inline) utk _next_schedule/_recurrence_label, oracle mock dashboard._now ke tanggal tetap sebelum/sesudah launch (setelah tanggal first-run baked 2026-08-17 lewat di kalender nyata, asersi baris-berulang-TAK-tampil gagal walau _next_schedule di-mock; test lulus hanya kalau kalender < tanggal launch) 2026-08-19 10:58:43 +07:00
proitlab 56ff265d11 stempel scan UTC-naive utk scanned_at/first_seen_at (V62/B24) — pemilih BARU ⊖ tertahan 7 jam 2026-08-17 00:55:53 +07:00
proitlab d6b5927307 red-team send-path hardening: hold pada verify False/None, _send_rejected whitelist, fee guard, non-dict skip (V61/B20-B23) 2026-08-13 23:12:51 +07:00
proitlab 69704fa23d 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
2026-08-13 21:30:31 +07:00
proitlab 663770f51b rename DATABISNIS_API → HYPERION_API (nama menyesatkan: host itu Hyperion vexascan.com, ⊖ API databisnis sendiri; rename bersih simbol + env)
config.py: HYPERION_API = getenv('HYPERION_API') or getenv('DATABISNIS_API') or
default — env lama masih dibaca utk backward-compat deploy (NFS config.env ⊖
perlu diubah) ; konsumen (dashboard _get_liquid_vex, distribute verify_txid,
claim reward_from_tx) rename simbol ; .env.example + docker-compose.yml
(HYPERION_API: ${HYPERION_API:-...} x3 service) ; oracle test_dashboard:
default + fallback env lama (importlib.reload) ; docs SPEC + AGENTS

image web + dist + claim rebuild + push
2026-08-13 21:22:33 +07:00
proitlab fb16eeafaa distribusi hardened vs node mati + send ⊖ pernah menyesatkan (V58/V59)
V58 failover node pool: config += API_NODES (CSV VEX_API_NODES, default
v2.vexascan.com:2096 + https://api.databisnis.id, mainnet terverifikasi) ;
distribute _post_json coba SEMUA node per putaran (semua mati → RuntimeError),
build_signed_transfer coba tiap node utk link+sign (net ter-bind → send ikut
node sama), fetch_balance_with_retry backoff [30..180]s ~10 mnt real-run /
dry-run satu attempt ; scan/claim tetap API_NODE tunggal, fee klaim mewarisi
failover gratis ; oracle failover saldo + semua-mati raise + backoff + mock Net

V59 send aman per pemilih (B19): (1) verify_txid → None (Hyperion down) =
TAHAN sungguhan — break + failed di attempt 1, ⊖ resend dgn tapos/expiration
baru → txid baru → double-send (kode lama cuma print ditahan lalu fallthrough
ke retry, oracle lolos karena set MAX_ATTEMPTS=1) ; (2) _send_rejected(resp)
deteksi body HTTP-500 pyntelope ⊖ raise (pola V46/B11, duplicate/
insufficient-balance) → raise → jalur verify/retry, ⊖ pernah sent utk tx yang
⊥ mendarat ; oracle hold-attempt-1 (3 attempt default, build sekali per pemilih)
+ rejection-500 → failed ; docs §V58/V59 + §B/B19 + T51/T52 + AGENTS

image dist + claim rebuild + push (claim impor distribute)
2026-08-13 20:52:32 +07:00
proitlab 8e80653df9 klaim baseline saldo stabil (V56/B18) + endpoint cek akun payout-eligible /api/voter (V57)
V56/B18: pre-claim liquid balance dibaca SEKALI per window (poll_claim) dan dibawa ke tiap _try_claim_once — klaim yang mendarat di attempt 1 membuat before attempt 2 (ditolak already-claimed) sudah termasuk reward → delta 0 → alert palsu KLAIM MENDARAT · REWARD TAK TERUKUR (kasus 10 Agt: bfa9ab02 reward 1679.3365 vs tx ditolak b0a8b2f9) ; oracle B18 attempt-1-mendarat → claimed + reward asli terukur

V57: db.py single source eligible_voters(owner=None) — SQL jendela payout V40/V52 (last_vote > now−STALE AND first_seen_at IS NOT NULL AND first_seen_at ≤ now−MATURITY, cutoff UTC-naive) dipakai BAIK distribute.py run_distribution (refactor, hapus _eligible_cutoffs) MAUPUN endpoint baru GET /api/voter/<owner> → 200 {owner, is_valid_voter} (DB-snapshot, selalu 200, ⊖ format-validation); BARU/kadaluarsa/hidden/asing → false ; docs §I/§V/V57 + T50 + AGENTS ; oracle test_dashboard (V57 true/false + drift endpoint==db pool + pool distribusi==db) + test_distribute (mock eligible_voters utk no-op, distribusi luas)
2026-08-12 22:28:42 +07:00
proitlab ee4682da00 klaim: reward tak terukur ⊖ pernah jadi sukses-0 (V55/B17): _measure_reward retry reward_from_tx 4x dgn SETTLE_SECONDS=30 (tx baru mendarat belum terindeks Hyperion → None palsu) lalu fallback selisih saldo HANYA delta positif (after > before) — delta 0 ambigu (node balik saldo lama) → None → fee pending + alert KLAIM MENDARAT · REWARD TAK TERUKUR, ⊖ notif KLAIM REWARD SUKSES 0.0000 palsu (kasus 8 Agt: klaim 48c2066f reward 1683.3641 tapi app notif 0.0000, fee tak terkirim) ; reward 0 asli dibuktikan dari isi tx (Decimal 0) ; oracle B17-a delta-0 → pending, B17-b catch-up reward asli ; image claim rebuild + push 2026-08-10 06:47:36 +07:00
proitlab 2f043c20bd klaim: baseline landing stabil per window (V54/B16): poll_claim baca last_claim_time sekali & oper ke tiap _try_claim_once (⊥ baseline ikut maju tiap attempt → retry-loop permanen walau klaim mendarat) ; _confirm_landed retry baca last_after (node RPC lag) ; oracle stale-lalu-maju → claimed ; image claim rebuild + push 2026-08-08 23:13:30 +07:00
proitlab a5e8367363 promo VEXWALLET pakai logo IDRS (static/idrs.png) + BARU band kolom TOTAL REWARD → MATURITY PERIOD (V52/V53) ; image web rebuild + push 2026-08-08 21:40:23 +07:00
proitlab cd1452a353 BARU band: hapus kolom VOTE TERAKHIR + tambah countdown VALID DALAM N HARI (V52) — _edge_rows bawa first_seen_at, filter countdown (first_seen + MATURITY), grid band-list 4 kolom, .valid-in ; image web rebuild + push 2026-08-08 21:09:01 +07:00
proitlab d6a15a07ae maturity pemilih baru diukur dari first_seen_at (V52/B15): last_vote terkuantisasi pekan (stake2vote) membuat voter baru Senin–Kamis tampak matang → lolos wait 3-hari ; BARU = first_seen baru/NULL, VALID = first_seen matang ; dashboard + distribusi konsisten ; image web+dist rebuild + push 2026-08-08 00:46:11 +07:00
proitlab 9b040a8c71 dashboard: nama akun jadi link https://vexascan.com/account/{owner} (V51) — index list (4 spot) + history pay-list + live search, .owner-link target=_blank ; image web rebuild + push 2026-08-08 00:07:55 +07:00
proitlab 5618bad427 klaim: _confirm_landed ⊥ menyerah saat Hyperion executed:false (V50/B14) — tx baru mendarat belum terindeks (lag) dianggap tak mendarat → retry-loop permanen, reward & fee tak tercatat ; landing = Hyperion executed ATAU last_claim_time maju, dicek utk verified False MAUPUN None ; oracle + image claim rebuild + push 2026-08-07 23:01:46 +07:00
proitlab 642822989c klaim: math jendela UTC-naive (V49/B13): _utcnow() di step/poll_claim/_try_claim_once konsisten dgn last_claim_time chain — ⊥ datetime.now() lokal (TZ Asia/Jakarta) yang menggeser jendela ~7 jam → poll prematur ditolak chain → retry tanpa henti ; oracle UTC + image claim rebuild + push 2026-08-07 22:34:57 +07:00
proitlab 0e83137b5a dashboard: hapus TOTAL VEX + perbaiki wrap mobile (V48) ; catatan stats-note dipendekkan (buang perbandingan vexascan) ; formula last_vote 52-pekan (V13/B12) ; image web rebuild + push 2026-08-07 22:04:25 +07:00
proitlab e9df89aaac 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 2026-08-07 16:45:05 +07:00
proitlab cc9df71d9e klaim: anti false-success + ukur reward dari isi tx (V45): deteksi mendarat = Hyperion executed ATAU last_claim_time maju dari baseline (⊥ heuristik 24 jam) ; reward_from_tx (bpay+vpay → BP) prioritas, selisih saldo fallback ; reward tak terukur → fee pending + notif KLAIM MENDARAT · REWARD TAK TERUKUR ; next_window baca producer di-retry (⊥ clamp prematur) ; image claim rebuild + push 2026-08-07 16:22:54 +07:00
proitlab a6db3be436 jadwal distribusi multi-hari Rabu & Sabtu (V44/T49): DISTRIBUTE_WEEKDAY=wed,sat (CSV), next_boundary pilih hari terdekat, banner BERITA SETIAP RABU & SABTU ; image web+dist rebuild + push 2026-08-07 15:49:26 +07:00
proitlab bdb5923097 compose: publik port web 5000 → 5001 (host) 2026-08-07 12:08:54 +07:00
proitlab 81ec6bdfe7 V40-V43: band umur vote (BARU/VALID/KADALUARSA, scan simpan semua umur) → REVOTE = VALID langsung (V42) → tag mint 1-hari + badge VOTE ULANG SEGERA (V43) ; klaim recovery jendela lewat + parse respons dict rows (B7/B8) ; backend mysql test_mariadb ; oracle test_dashboard/distribute/get_voters/mariadb ; images web/scan/dist/claim rebuild + push 2026-08-07 12:07:34 +07:00
proitlab af9a0291b9 banner BERITA: sembunyikan baris SETIAP SABTU saat event berikutnya = first-run (17 Agt) — hanya tampil utk putaran mingguan 2026-08-06 21:44:19 +07:00
proitlab 192e27aff3 first run distribusi baked 17 Agt 2026 (config default + loop via config + compose) ; saldo liquid pindah paling kiri ; empty-state history jadi BELUM ADA DISTRIBUSI 2026-08-06 21:35:19 +07:00
proitlab 2f1f19c435 jadwal distribusi mingguan + banner BERITA jadwal berikutnya di dashboard (V37/V38, T43/T44) 2026-08-06 19:05:03 +07:00
proitlab b1e6e93796 klaim reward BP harian (claim service V32-V34) + kill-switch DISTRIBUTE_ENABLED (V35) + Telegram dua kanal komunitas/internal (V30/V36) + placement web/scan/dist/claim != server2U 2026-08-06 06:30:19 +07:00
proitlab d3a0e768a0 spec: fix §I /api/search hasil tambah total_reward; §C lib += pyntelope 2026-08-06 05:42:13 +07:00
proitlab 0b1749a062 backprop §B.4 + §V.31: image dist ⊥ bawa modul yang diimpor → ModuleNotFoundError (oracle test_images.py) 2026-08-06 05:36:24 +07:00
proitlab 025f46d399 distribusi: notifikasi Telegram mulai/selesai/gagal (telegram.py, V30) 2026-08-06 05:30:22 +07:00
proitlab 397e20ec3a spec: T25 x — service distribute (Dockerfile.dist + distribute_loop.py, key via bind NFS config.env:/app/.env:ro) 2026-08-05 22:38:13 +07:00
proitlab 83e294dec8 stack: distribute baca VEX_BP_PRIVATE_KEY dari bind NFS config.env:/app/.env:ro (bukan interpolasi) 2026-08-05 22:34:30 +07:00
proitlab 4e02701887 stack: service distribute (Dockerfile.dist + distribute_loop.py, harian DISTRIBUTE_HOUR) 2026-08-05 22:22:24 +07:00
proitlab f77681793f history: grid pay-list desktop 200/200/120 + TXID fleksibel, tablet 180/180/110, ?v=8 2026-08-05 21:16:18 +07:00
proitlab d30dd8b292 history: TXID pay-list kolom diukur (460px), ?v=7 2026-08-05 21:05:42 +07:00
proitlab 3ad5eb32d2 dashboard: kolom TOTAL REWARD per pemilih + TXID jadi link explorer 2026-08-05 20:56:28 +07:00
proitlab 344de409cd history: payments hanya run terbaru, TANGGAL pindah ke judul, MEMO dihapus (DB+UI) 2026-08-05 20:37:50 +07:00
proitlab a3251eebc4 dashboard: kolom AKUN/STAKE/VOTE sama lebar di desktop 2026-08-05 19:58:35 +07:00
proitlab e4fa6bf1dc dashboard: seimbangkan kolom dan responsifkan riwayat 2026-08-05 17:28:38 +07:00
proitlab 9a269e224c tata letak: kolom STAKE (VEX) rata tengah 2026-08-05 16:57:08 +07:00
proitlab 8ab8001b34 T19-T28: distribusi profit harian (distribute.py, /history, tests) 2026-08-05 16:07:36 +07:00
proitlab 656f26085f T18: stack swarm docker — image web+scan, scan_loop.py, mariadb bind-mount server5.saltis.id
- Dockerfile (web) + Dockerfile.scan (scan; sertakan tzdata) + .dockerignore
- scan_loop.py: jadwal skan SCAN_HOURS (0,8,16 lokal via TZ) + skan-awal SCAN_RUN_ON_START; loop tak keluar; tunggu DB siap
- docker-compose.yml → STACK SWARM produksi (mariadb bind mount /data/db/mariadb/databisnisid/data + placement node.hostname == server5.saltis.id; web :5000; scan); image dari registry git.proit.id/proitlab/databisnisid-{web,scan}
- docker-compose.dev.yml: mariadb uji lokal (127.0.0.1:3306) — pengganti docker-compose.yml lama
- SPEC.md §V18/T18; AGENTS.md runbook swarm + dev compose
- .env.example: TZ/SCAN_HOURS/SCAN_RUN_ON_START/MARIADB_*
2026-08-05 14:26:29 +07:00
proitlab fdb5d0de15 T17: backend penyimpanan bersama db.py (sqlite | mysql via PyMySQL)
- db.py: abstraksi connect/query/queryone/replace_snapshot; %s → ? utk sqlite;
  replace snapshot mysql = CREATE IF NOT EXISTS + DELETE + INSERT (MVCC)
- config/.env.example: VEX_DB_BACKEND (default sqlite) + VEX_DB_HOST/PORT/USER/PASS/NAME
- get_voters.persist → db.replace_snapshot; dashboard baca via db.query
- LIKE pakai ESCAPE '!' (backslash memutus literal string MySQL, B2);
  db.query selalu kembalikan list (PyMySQL tuple vs sqlite list, B3)
- docker-compose.yml: kontainer uji mariadb:11 (databisnisid-mariadb, 127.0.0.1:3306)
- test_mariadb.py: suite integrasi opt-in (skip bila bukan mysql)
- SPEC.md §V17/T17/B2/B3; AGENTS.md runbook
2026-08-05 12:41:17 +07:00
proitlab 063fb5e5eb run.sh: launcher gunicorn mudah (foreground, $@ passthrough)
./run.sh = ./venv/bin/gunicorn -c gunicorn.conf.py dashboard:app dari
cwd mana pun. Peringatan bila venv belum siap. AGENTS.md diperbarui.
2026-08-05 10:46:45 +07:00
proitlab f0fc4715a1 T16: saldo liquid akun BP di dashboard (API databisnis + cache TTL)
Sel stat SALDO LIQUID menampilkan account.core_liquid_balance dari
GET {DATABISNIS_API}/v2/state/get_account. Cache in-memory per worker
selama DASH_LIQUID_TTL (60s); gagal fetch → nilai lama (atau '—' bila
belum pernah sukses) + cooldown supaya API tak dipukul berulang. Stats
grid 4 kolom desktop, 2x2 tablet. Oracle + smoke lolos.
2026-08-05 10:41:44 +07:00
proitlab eb4f941b37 T13: klamp last_vote heuristik ke waktu scan (⊥ di masa depan)
Unstake tanpa revote membuat rasio bobot/stake membesar → estimasi
last_vote melewati now. normalize() kini mengklamp ke now; voters.db
dikembalikan (27 baris, MAX(last_vote) ≤ MAX(scanned_at)). Oracle lolos.
2026-08-05 10:21:45 +07:00
proitlab 41990af9af 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.
2026-08-04 17:18:50 +07:00
proitlab b0b3ba8ab3 T14: penanda vote basi (last_vote dari rasio bobot/stake, filter ?stale=1, VEX_STALE_DAYS) 2026-08-04 17:05:16 +07:00
proitlab 2b95be3091 T13: produksi web dengan gunicorn + WAL (gunicorn.conf.py, DASH_WORKERS, V12) 2026-08-04 16:40:16 +07:00
proitlab 0374f9f4c2 responsive: perbaikan wrap timestamp & bobot panjang di mobile 2026-08-04 16:31:08 +07:00
proitlab 205ad35c70 T9-T12: env config + live owner search + responsive (§V11, I.env, I.web)
- config.py: env/.env (python-dotenv), defaults = konstanta lama; get_voters & dashboard pakai config
- dashboard: ?q= server filter + /api/search JSON (substring, LIKE-escape, rank global via correlated count)
- static/app.js: debounced live search; degrades to GET ?q=
- static/style.css: input search + responsive (1024/768/480), list→kartu berlabel di mobile
- test_dashboard: search/API/rank-global/config tests; .env.example; .env gitignored
2026-08-04 16:23:26 +07:00
proitlab 0b3a86aad2 T6-T8: web dashboard spec-list (§V10, I.web, I.db)
- dashboard.py: Flask read-only, paged 50/page, ORDER BY staked DESC
- templates/index.html + static/style.css: DESIGN.md Bugatti austere tokens
- test_dashboard.py: oracle (ordering, paging, read-only)
- DESIGN.md style guide (was untracked)
2026-08-04 16:08:08 +07:00