Source Code

;; title: event-emitter
;; version: 1.0.0
;; summary: Centralized event emitter
;; description: Emit and log protocol events - Clarity 4

;; Constants
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-UNAUTHORIZED (err u5500))

;; Event categories
(define-constant CATEGORY-VAULT u1)
(define-constant CATEGORY-GOVERNANCE u2)
(define-constant CATEGORY-SECURITY u3)
(define-constant CATEGORY-ORACLE u4)
(define-constant CATEGORY-DEFI u5)

;; Data Variables
(define-data-var total-events-emitted uint u0)
(define-data-var next-event-log-id uint u1)

;; Data Maps - Using stacks-block-time for Clarity 4
(define-map event-logs uint {
  category: uint,
  event-name: (string-ascii 50),
  emitter: principal,
  data: (string-ascii 500),
  timestamp: uint,  ;; Clarity 4: Unix timestamp
  severity: uint  ;; 1=Info, 2=Warning, 3=Error, 4=Critical
})

(define-map category-stats uint {
  total-events: uint,
  last-event: uint  ;; Clarity 4: Unix timestamp
})

;; Public Functions

(define-public (emit-event
  (category uint)
  (event-name (string-ascii 50))
  (data (string-ascii 500))
  (severity uint))
  (let (
    (event-id (var-get next-event-log-id))
    (stats (default-to
      { total-events: u0, last-event: u0 }
      (map-get? category-stats category)))
  )
    (map-set event-logs event-id {
      category: category,
      event-name: event-name,
      emitter: tx-sender,
      data: data,
      timestamp: stacks-block-time,
      severity: severity
    })

    (map-set category-stats category {
      total-events: (+ (get total-events stats) u1),
      last-event: stacks-block-time
    })

    (var-set next-event-log-id (+ event-id u1))
    (var-set total-events-emitted (+ (var-get total-events-emitted) u1))

    (print {
      event: "event-emitted",
      event-id: event-id,
      category: category,
      name: event-name,
      severity: severity,
      timestamp: stacks-block-time
    })

    (ok event-id)
  )
)

(define-public (emit-vault-event
  (event-name (string-ascii 50))
  (data (string-ascii 500)))
  (emit-event CATEGORY-VAULT event-name data u1)
)

(define-public (emit-security-alert
  (event-name (string-ascii 50))
  (data (string-ascii 500)))
  (emit-event CATEGORY-SECURITY event-name data u4)
)

;; Read-Only Functions

(define-read-only (get-event-log (event-id uint))
  (map-get? event-logs event-id)
)

(define-read-only (get-category-stats (category uint))
  (map-get? category-stats category)
)

(define-read-only (get-total-events)
  (var-get total-events-emitted)
)
;; Clarity 4 Enhanced Functions

;; 1. Clarity 4: principal-destruct? - Validate emitter principals
(define-read-only (validate-emitter (em principal))
  (principal-destruct? em)
)

;; 2. Clarity 4: int-to-ascii - Format event count
(define-read-only (format-event-count)
  (ok (int-to-ascii (var-get total-events-emitted)))
)

;; 3. Clarity 4: string-to-uint? - Parse event ID from string
(define-read-only (parse-event-id (e-str (string-ascii 20)))
  (match (string-to-uint? e-str)
    e (ok e)
    (err u998)
  )
)

;; 4. Clarity 4: burn-block-height - Track event timestamps
(define-read-only (get-ee-timestamps)
  (ok {
    stacks-time: stacks-block-time,
    burn-time: burn-block-height
  })
)

Functions (10)

FunctionAccessArgs
get-total-eventsread-only
emit-eventpubliccategory: uint, event-name: (string-ascii 50
emit-vault-eventpublicevent-name: (string-ascii 50
emit-security-alertpublicevent-name: (string-ascii 50
get-event-logread-onlyevent-id: uint
get-category-statsread-onlycategory: uint
validate-emitterread-onlyem: principal
format-event-countread-only
parse-event-idread-onlye-str: (string-ascii 20
get-ee-timestampsread-only