Source Code

;; 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"))

Functions (9)

FunctionAccessArgs
require-ownerprivatecaller: principal
toggle-pausepublic
incrementpublic
decrementpublic
set-accumulatorpublicnew-value: uint
get-accumulatorread-only
get-ownerread-only
is-pausedread-only
get-inforead-only