Source Code

;; title: Weekly Rewards Pool
;; version: 1.0.0
;; summary: Weekly reward distribution system
;; description: Users contribute, top contributors get weekly rewards

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-week-not-ended (err u101))
(define-constant err-already-claimed (err u102))

(define-constant contribution-fee u75000) ;; 0.075 STX
(define-constant blocks-per-week u1008) ;; ~7 days

(define-data-var current-week uint u0)
(define-data-var reward-pool uint u0)

(define-map week-contributions {week: uint, user: principal} uint)
(define-map week-claims {week: uint, user: principal} bool)
(define-map week-totals uint uint)

(define-public (contribute)
  (let
    (
      (caller tx-sender)
      (week (/ stacks-block-height blocks-per-week))
      (current-contribution (default-to u0 (map-get? week-contributions {week: week, user: caller})))
    )
    ;; Collect contribution
    (try! (stx-transfer? contribution-fee caller (as-contract tx-sender)))
    
    ;; Update contributions
    (map-set week-contributions {week: week, user: caller} (+ current-contribution contribution-fee))
    (map-set week-totals week (+ (default-to u0 (map-get? week-totals week)) contribution-fee))
    (var-set reward-pool (+ (var-get reward-pool) contribution-fee))
    
    (print {event: "weekly-contribution", user: caller, week: week, amount: contribution-fee})
    (ok true)
  )
)

(define-public (claim-weekly-reward (week uint) (reward-amount uint))
  (let ((caller tx-sender))
    (asserts! (< week (/ stacks-block-height blocks-per-week)) err-week-not-ended)
    (asserts! (is-none (map-get? week-claims {week: week, user: caller})) err-already-claimed)
    
    ;; Mark as claimed
    (map-set week-claims {week: week, user: caller} true)
    
    ;; Transfer reward
    (try! (as-contract (stx-transfer? reward-amount tx-sender caller)))
    (var-set reward-pool (- (var-get reward-pool) reward-amount))
    
    (print {event: "reward-claimed", user: caller, week: week, amount: reward-amount})
    (ok true)
  )
)

(define-read-only (get-user-contribution (week uint) (user principal))
  (ok (default-to u0 (map-get? week-contributions {week: week, user: user})))
)

(define-read-only (get-week-total (week uint))
  (ok (default-to u0 (map-get? week-totals week)))
)

(define-read-only (get-current-week)
  (ok (/ stacks-block-height blocks-per-week))
)

Functions (5)

FunctionAccessArgs
contributepublic
claim-weekly-rewardpublicweek: uint, reward-amount: uint
get-user-contributionread-onlyweek: uint, user: principal
get-week-totalread-onlyweek: uint
get-current-weekread-only