;; SatGuard Leaderboard
(define-constant err-owner (err u1040))
(define-data-var admin principal tx-sender)
(define-map rankings {who: principal} {score: uint,rank: uint,last: uint})
(define-map top-by-rank {rank: uint} {who: principal,score: uint})
(define-read-only (get-rank (who principal)) (map-get? rankings {who: who}))
(define-read-only (get-top (rank uint)) (map-get? top-by-rank {rank: rank}))
(define-public (update-rank (who principal) (score uint) (rank uint))
(begin
(asserts! (is-eq tx-sender (var-get admin)) err-owner)
(map-set rankings {who: who} {score: score,rank: rank,last: block-height})
(map-set top-by-rank {rank: rank} {who: who,score: score})
(print {e: "rank-updated",who: who,score: score,rank: rank})
(ok true)))
(define-public (update-score (who principal) (pts uint))
(let ((ex (default-to {score: u0,rank: u0,last: u0} (map-get? rankings {who: who}))))
(asserts! (is-eq tx-sender (var-get admin)) err-owner)
(map-set rankings {who: who} {score: (+ (get score ex) pts),rank: (get rank ex),last: block-height})
(print {e: "score-updated",who: who,pts: pts})
(ok true)))
(define-read-only (get-top-3)
(ok {first: (get-top u1),second: (get-top u2),third: (get-top u3)}))