Source Code

;; Trial Tracker - Track free trials

(define-map trials
  { user: principal, creator: principal }
  {
    started-at: uint,
    expires-at: uint,
    active: bool
  }
)

(define-public (start-trial (creator principal) (duration uint))
  (begin
    (map-set trials { user: tx-sender, creator: creator } {
      started-at: stacks-block-height,
      expires-at: (+ stacks-block-height duration),
      active: true
    })
    (ok true)
  )
)

(define-public (end-trial (creator principal))
  (let ((trial (unwrap! (map-get? trials { user: tx-sender, creator: creator }) (err u404))))
    (map-set trials { user: tx-sender, creator: creator }
      (merge trial { active: false }))
    (ok true)
  )
)

(define-read-only (get-trial (user principal) (creator principal))
  (map-get? trials { user: user, creator: creator })
)

(define-read-only (is-trial-active (user principal) (creator principal))
  (match (map-get? trials { user: user, creator: creator })
    trial (and (get active trial) (< stacks-block-height (get expires-at trial)))
    false
  )
)

Functions (4)

FunctionAccessArgs
start-trialpubliccreator: principal, duration: uint
end-trialpubliccreator: principal
get-trialread-onlyuser: principal, creator: principal
is-trial-activeread-onlyuser: principal, creator: principal