Source Code

;; 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)))

Functions (5)

FunctionAccessArgs
get-yield-rateread-only
get-epoch-lenread-only
set-yield-ratepublicrate: uint
calc-yieldread-onlywho: principal
distribute-yieldpublic