Source Code

;; title: Daily Activity Tracker
;; version: 1.0.0
;; summary: Track daily user activity with small fees
;; description: Simple daily check-in tracker with 0.05 STX fees

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-invalid-day (err u101))

(define-constant daily-fee u50000) ;; 0.05 STX

(define-data-var total-check-ins uint u0)
(define-data-var total-users uint u0)
(define-data-var total-fees uint u0)

(define-map daily-activities principal (list 365 uint))
(define-map user-stats principal {
  total-days: uint,
  last-check-in: uint,
  fees-paid: uint
})

(define-public (check-in-today)
  (let
    (
      (caller tx-sender)
      (today (/ stacks-block-height u144))
      (user-days (default-to (list) (map-get? daily-activities caller)))
    )
    ;; Collect fee
    (try! (stx-transfer? daily-fee caller (as-contract tx-sender)))
    
    ;; Update stats
    (match (map-get? user-stats caller)
      stats (map-set user-stats caller {
        total-days: (+ (get total-days stats) u1),
        last-check-in: today,
        fees-paid: (+ (get fees-paid stats) daily-fee)
      })
      (begin
        (map-set user-stats caller {
          total-days: u1,
          last-check-in: today,
          fees-paid: daily-fee
        })
        (var-set total-users (+ (var-get total-users) u1))
      )
    )
    
    (var-set total-check-ins (+ (var-get total-check-ins) u1))
    (var-set total-fees (+ (var-get total-fees) daily-fee))
    (map-set daily-activities caller (unwrap-panic (as-max-len? (append user-days today) u365)))
    
    (print {event: "daily-check-in", user: caller, day: today, fee: daily-fee})
    (ok true)
  )
)

(define-read-only (get-user-stats (user principal))
  (ok (map-get? user-stats user))
)

(define-read-only (get-total-stats)
  (ok {
    total-check-ins: (var-get total-check-ins),
    total-users: (var-get total-users),
    total-fees: (var-get total-fees)
  })
)

(define-public (withdraw-fees)
  (let ((fees (var-get total-fees)))
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (try! (as-contract (stx-transfer? fees tx-sender contract-owner)))
    (var-set total-fees u0)
    (ok fees)
  )
)

Functions (4)

FunctionAccessArgs
check-in-todaypublic
get-user-statsread-onlyuser: principal
get-total-statsread-only
withdraw-feespublic