Source Code

;; title: analytics-tracker
;; version: 1.0.0
;; summary: Protocol analytics tracking
;; description: Track user activities and events - Clarity 4

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

;; Event types
(define-constant EVENT-DEPOSIT u1)
(define-constant EVENT-WITHDRAWAL u2)
(define-constant EVENT-SWAP u3)
(define-constant EVENT-STAKE u4)
(define-constant EVENT-UNSTAKE u5)

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

;; Data Maps - Using stacks-block-time for Clarity 4
(define-map user-activity-summary principal {
  total-events: uint,
  first-seen: uint,  ;; Clarity 4: Unix timestamp
  last-seen: uint,
  deposit-count: uint,
  withdrawal-count: uint,
  total-volume: uint
})

(define-map analytics-events uint {
  user: principal,
  event-type: uint,
  amount: uint,
  timestamp: uint,  ;; Clarity 4: Unix timestamp
  metadata: (string-ascii 200)
})

(define-map daily-volume uint {
  date: uint,  ;; Day timestamp
  total-deposits: uint,
  total-withdrawals: uint,
  unique-users: uint,
  total-transactions: uint
})

;; Public Functions

(define-public (track-event
  (event-type uint)
  (amount uint)
  (metadata (string-ascii 200)))
  (let (
    (event-id (var-get next-event-id))
    (user tx-sender)
    (summary (default-to
      { total-events: u0, first-seen: stacks-block-time, last-seen: u0,
        deposit-count: u0, withdrawal-count: u0, total-volume: u0 }
      (map-get? user-activity-summary user)))
  )
    (map-set analytics-events event-id {
      user: user,
      event-type: event-type,
      amount: amount,
      timestamp: stacks-block-time,
      metadata: metadata
    })

    (map-set user-activity-summary user {
      total-events: (+ (get total-events summary) u1),
      first-seen: (get first-seen summary),
      last-seen: stacks-block-time,
      deposit-count: (if (is-eq event-type EVENT-DEPOSIT)
        (+ (get deposit-count summary) u1)
        (get deposit-count summary)),
      withdrawal-count: (if (is-eq event-type EVENT-WITHDRAWAL)
        (+ (get withdrawal-count summary) u1)
        (get withdrawal-count summary)),
      total-volume: (+ (get total-volume summary) amount)
    })

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

    (print {
      event: "analytics-tracked",
      event-id: event-id,
      user: user,
      type: event-type,
      timestamp: stacks-block-time
    })

    (ok event-id)
  )
)

;; Read-Only Functions

(define-read-only (get-user-summary (user principal))
  (map-get? user-activity-summary user)
)

(define-read-only (get-event (event-id uint))
  (map-get? analytics-events event-id)
)

(define-read-only (get-total-events)
  (var-get total-events)
)

(define-read-only (get-daily-volume (day-timestamp uint))
  (map-get? daily-volume day-timestamp)
)

Functions (5)

FunctionAccessArgs
track-eventpublicevent-type: uint, amount: uint, metadata: (string-ascii 200
get-user-summaryread-onlyuser: principal
get-eventread-onlyevent-id: uint
get-total-eventsread-only
get-daily-volumeread-onlyday-timestamp: uint