Source Code

;; Goal Tracker

(define-map goals
  uint
  { owner: principal, target: uint, progress: uint, completed: bool }
)

(define-data-var counter uint u0)

(define-public (create-goal (target uint))
  (let ((id (var-get counter)))
    (map-set goals id { owner: tx-sender, target: target, progress: u0, completed: false })
    (var-set counter (+ id u1))
    (ok id)
  )
)

(define-public (update-progress (id uint) (amount uint))
  (let ((goal (unwrap! (map-get? goals id) (err u404))))
    (asserts! (is-eq (get owner goal) tx-sender) (err u403))
    (let ((new-progress (+ (get progress goal) amount)))
      (map-set goals id (merge goal { progress: new-progress, completed: (>= new-progress (get target goal)) }))
    )
    (ok true)
  )
)

(define-read-only (get-goal (id uint))
  (map-get? goals id)
)

Functions (3)

FunctionAccessArgs
create-goalpublictarget: uint
update-progresspublicid: uint, amount: uint
get-goalread-onlyid: uint