;; Contract variation 12
;; Enhanced Counter Contract
(define-constant ERR_NOT_OWNER u1000)
(define-constant ERR_UNDERFLOW u1001)
(define-constant ERR_PAUSED u1002)
(define-data-var owner principal tx-sender)
(define-data-var accumulator uint u0)
(define-data-var paused bool false)
(define-private (require-owner (caller principal))
(if (is-eq caller (var-get owner))
(ok true)
(err ERR_NOT_OWNER)))
(define-public (toggle-pause)
(begin
(try! (require-owner tx-sender))
(var-set paused (not (var-get paused)))
(ok true)))
(define-public (increment)
(if (var-get paused)
(err ERR_PAUSED)
(let ((new-value (+ (var-get accumulator) u1)))
(var-set accumulator new-value)
(ok new-value))))
(define-public (decrement)
(if (var-get paused)
(err ERR_PAUSED)
(let ((current (var-get accumulator)))
(if (< current u1)
(err ERR_UNDERFLOW)
(let ((new-value (- current u1)))
(var-set accumulator new-value)
(ok new-value))))))
(define-public (set-accumulator (new-value uint))
(begin
(try! (require-owner tx-sender))
(var-set accumulator new-value)
(ok new-value)))
(define-read-only (get-accumulator)
(var-get accumulator))
(define-read-only (get-owner)
(var-get owner))
(define-read-only (is-paused)
(var-get paused))
(define-read-only (get-info)
(ok "active"))