Source Code

(define-data-var counter uint u0)
(define-data-var owner principal tx-sender) ;; contract deployer is owner
(define-constant ERR_NOT_OWNER u106)

;; Pseudo-random increment using block time
(define-public (increment)
  (let (
        (time stacks-block-time)
        (current (var-get counter))
        ;; VERY basic randomness (good enough for demo)
        (delta (+ u1 (mod time u10)))
       )
    (begin
      (var-set counter (+ current delta))

      ;; Chainhook will listen for this
      (print {
        event: "counter-updated",
        new-value: (var-get counter),
        delta: delta,
        direction: "up",
        timestamp: time,
        caller: tx-sender
      })

      (ok (var-get counter))
    )
  )
)

(define-public (decrement)
  (let (
        (time stacks-block-time)
        (current (var-get counter))
        ;; same pseudo-random delta as increment (1..10)
        (delta (+ u1 (mod time u10)))
       )
    (begin
      ;; subtract if possible, otherwise clamp to zero
      (if (>= current delta)
          (var-set counter (- current delta))
          (var-set counter u0)
      )

      ;; Chainhook will listen for this
      (print {
        event: "counter-updated",
        new-value: (var-get counter),
        delta: delta,
        direction: "down",
        timestamp: time,
        caller: tx-sender
      })

      (ok (var-get counter))
    )
  )
)

;; Reset counter (admin only)
(define-public (reset-counter)
  (begin
    (asserts! (is-eq tx-sender (var-get owner)) (err ERR_NOT_OWNER))
    (var-set counter u0)
    (print {
      event: "counter-reset",
      caller: tx-sender,
      timestamp: stacks-block-time
    })
    (ok u0)
  )
)

(define-read-only (get-counter)
  (var-get counter)
)

Functions (4)

FunctionAccessArgs
incrementpublic
decrementpublic
reset-counterpublic
get-counterread-only