Source Code

;; SPDX-License-Identifier: MIT
;; Daily Check-in & Points Contract (Fixed for 2026)

;; --- CONSTANTS ---
(define-constant ERR_ALREADY_CHECKED_IN (err u100))

;; --- DATA ---
(define-map users
  { user: principal }
  {
    points: uint,
    streak: uint,
    last-day: uint
  }
)

;; --- PUBLIC FUNCTIONS ---

(define-public (check-in)
  (let (
        ;; burn-block-height tracks Bitcoin blocks (~144/day) accurately
        (current-day (/ burn-block-height u144))
        (user-data (map-get? users { user: tx-sender }))
       )
    (match user-data
        data
        (if (> current-day (get last-day data))
            (begin
              (map-set users
                { user: tx-sender }
                {
                  points: (+ (get points data) u10),
                  streak: (if (is-eq current-day (+ (get last-day data) u1)) ;; FIXED: use is-eq
                            (+ (get streak data) u1)
                            u1),
                  last-day: current-day
                }
              )
              (ok "Check-in successful"))
            ERR_ALREADY_CHECKED_IN)
        ;; First-time user setup
        (begin
          (map-set users
            { user: tx-sender }
            { points: u10, streak: u1, last-day: current-day }
          )
          (ok "First check-in"))
    )
  )
)

;; --- READ ONLY ---

(define-read-only (get-user (user principal))
  (map-get? users { user: user })
)

(define-read-only (get-my-info)
  (map-get? users { user: tx-sender })
)

Functions (3)

FunctionAccessArgs
check-inpublic
get-userread-onlyuser: principal
get-my-inforead-only