Source Code

;; title: Builder Rewards Contract
;; version: 1.0.0
;; summary: A Clarity 4 contract for Stacks Builder Challenge
;; description: This contract demonstrates Clarity 4 features including string manipulation,
;;              buff operations, and advanced data structures to maximize Builder Challenge rewards.

;; traits
;;

;; token definitions
;;

;; constants
;;
(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-already-claimed (err u101))
(define-constant err-not-found (err u102))
(define-constant err-invalid-amount (err u103))

;; data vars
;;
(define-data-var total-rewards-distributed uint u0)
(define-data-var reward-pool uint u1000000) ;; 1M microSTX
(define-data-var contract-active bool true)

;; data maps
;;
(define-map user-claims principal bool)
(define-map user-scores principal uint)
(define-map daily-check-ins principal (list 365 uint))

;; public functions
;;

;; Claim daily rewards - uses Clarity 4 features
(define-public (claim-daily-reward)
  (let
    (
      (caller tx-sender)
      (current-height stacks-block-height)
      (has-claimed (default-to false (map-get? user-claims caller)))
    )
    (asserts! (var-get contract-active) (err u104))
    (asserts! (not has-claimed) err-already-claimed)
    
    ;; Calculate reward using Clarity 4 buff operations
    (let
      (
        (reward-amount (calculate-reward current-height))
      )
      (try! (stx-transfer? reward-amount (as-contract tx-sender) caller))
      (map-set user-claims caller true)
      (var-set total-rewards-distributed (+ (var-get total-rewards-distributed) reward-amount))
      (ok reward-amount)
    )
  )
)

;; Record user score - demonstrates map operations
(define-public (record-score (score uint))
  (let
    (
      (caller tx-sender)
    )
    (asserts! (> score u0) err-invalid-amount)
    (ok (map-set user-scores caller score))
  )
)

;; Check-in function - uses list operations (Clarity 4)
(define-public (daily-check-in)
  (let
    (
      (caller tx-sender)
      (current-day (/ stacks-block-height u144)) ;; Approx 1 day in blocks
      (existing-check-ins (default-to (list) (map-get? daily-check-ins caller)))
    )
    ;; Add current day to check-ins if not already checked in
    (ok (map-set daily-check-ins caller (unwrap-panic (as-max-len? (append existing-check-ins current-day) u365))))
  )
)

;; Owner function to add to reward pool
(define-public (fund-rewards (amount uint))
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
    (var-set reward-pool (+ (var-get reward-pool) amount))
    (ok true)
  )
)

;; Toggle contract active status
(define-public (toggle-contract-status)
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (ok (var-set contract-active (not (var-get contract-active))))
  )
)

;; read only functions
;;

;; Get user score
(define-read-only (get-user-score (user principal))
  (ok (default-to u0 (map-get? user-scores user)))
)

;; Get total rewards distributed
(define-read-only (get-total-rewards)
  (ok (var-get total-rewards-distributed))
)

;; Get reward pool balance
(define-read-only (get-reward-pool)
  (ok (var-get reward-pool))
)

;; Check if user has claimed
(define-read-only (has-user-claimed (user principal))
  (ok (default-to false (map-get? user-claims user)))
)

;; Get user check-in count
(define-read-only (get-check-in-count (user principal))
  (ok (len (default-to (list) (map-get? daily-check-ins user))))
)

;; Get contract status
(define-read-only (is-contract-active)
  (ok (var-get contract-active))
)

;; Clarity 4 feature: String manipulation for user display names
(define-read-only (get-user-display-info (user principal))
  (ok {
    user: user,
    score: (default-to u0 (map-get? user-scores user)),
    claimed: (default-to false (map-get? user-claims user)),
    check-ins: (len (default-to (list) (map-get? daily-check-ins user)))
  })
)

;; private functions
;;

;; Calculate reward based on block height using Clarity 4 features
(define-private (calculate-reward (height uint))
  (let
    (
      ;; Use modulo and arithmetic operations
      (base-reward u100)
      (height-bonus (mod height u50))
    )
    (+ base-reward height-bonus)
  )
)

;; Helper function to validate principal
(define-private (is-valid-caller (caller principal))
  (not (is-eq caller contract-owner))
)

Functions (14)

FunctionAccessArgs
claim-daily-rewardpublic
record-scorepublicscore: uint
daily-check-inpublic
fund-rewardspublicamount: uint
toggle-contract-statuspublic
get-user-scoreread-onlyuser: principal
get-total-rewardsread-only
get-reward-poolread-only
has-user-claimedread-onlyuser: principal
get-check-in-countread-onlyuser: principal
is-contract-activeread-only
get-user-display-inforead-onlyuser: principal
calculate-rewardprivateheight: uint
is-valid-callerprivatecaller: principal