;; SatGuard Staking Rewards
(define-constant err-owner (err u510))
(define-constant err-amt (err u511))
(define-constant err-nf (err u512))
(define-data-var admin principal tx-sender)
(define-data-var yield-rate uint u5) ;; 5% per epoch
(define-data-var epoch-len uint u4320) ;; ~30 days
(define-map claimed-epoch {who: principal} {last: uint})
(define-read-only (get-yield-rate) (var-get yield-rate))
(define-read-only (get-epoch-len) (var-get epoch-len))
(define-public (set-yield-rate (rate uint))
(begin
(asserts! (is-eq tx-sender (var-get admin)) err-owner)
(var-set yield-rate rate)
(print {e: "yield-rate-set",rate: rate})
(ok true)))
(define-read-only (calc-yield (who principal))
(let ((s (contract-call? .sg-staking-core get-stake who))
(sa (get amt s)))
(ok (/ (* sa (var-get yield-rate)) u100))))
(define-public (distribute-yield)
(let ((s (contract-call? .sg-staking-core get-stake tx-sender))
(sa (get amt s))
(cl (default-to {last: u0} (map-get? claimed-epoch {who: tx-sender})))
(reward (/ (* sa (var-get yield-rate)) u100)))
(asserts! (> sa u0) err-amt)
(asserts! (>= (- block-height (get last cl)) (var-get epoch-len)) err-amt)
(try! (contract-call? .sg-token-core mint reward tx-sender))
(map-set claimed-epoch {who: tx-sender} {last: block-height})
(print {e: "yield-distributed",who: tx-sender,amt: reward})
(ok reward)))