Source Code

;; TipStream Rewards
;; Earn TIPS tokens for tipping activity on the platform
;; Reads tip counts from tipstream.clar and mints TIPS via tipstream-token.clar

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u300))
(define-constant err-nothing-to-claim (err u301))

;; TIPS tokens awarded per tip sent (6 decimals, so 1000000 = 1 TIPS)
(define-data-var reward-per-tip uint u1000000)

;; Track how many tips each user has already claimed rewards for
(define-map claimed-tip-count principal uint)

;; Claim TIPS token rewards for unclaimed tips
(define-public (claim-rewards)
    (let
        (
            (user-stats (contract-call? .tipstream get-user-stats tx-sender))
            (total-sent (get tips-sent user-stats))
            (already-claimed (default-to u0 (map-get? claimed-tip-count tx-sender)))
            (unclaimed (- total-sent already-claimed))
            (reward (* unclaimed (var-get reward-per-tip)))
        )
        (asserts! (> unclaimed u0) err-nothing-to-claim)
        (try! (contract-call? .tipstream-token mint reward tx-sender))
        (map-set claimed-tip-count tx-sender total-sent)
        (ok reward)
    )
)

;; Admin: set the reward rate
(define-public (set-reward-per-tip (new-reward uint))
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        (var-set reward-per-tip new-reward)
        (ok true)
    )
)

;; ---------- Read-only ----------

(define-read-only (get-unclaimed-rewards (user principal))
    (let
        (
            (user-stats (contract-call? .tipstream get-user-stats user))
            (total-sent (get tips-sent user-stats))
            (already-claimed (default-to u0 (map-get? claimed-tip-count user)))
            (unclaimed (- total-sent already-claimed))
        )
        (* unclaimed (var-get reward-per-tip))
    )
)

(define-read-only (get-claimed-count (user principal))
    (default-to u0 (map-get? claimed-tip-count user))
)

(define-read-only (get-reward-rate)
    (var-get reward-per-tip)
)

Functions (5)

FunctionAccessArgs
claim-rewardspublic
set-reward-per-tippublicnew-reward: uint
get-unclaimed-rewardsread-onlyuser: principal
get-claimed-countread-onlyuser: principal
get-reward-rateread-only