Source Code

;; Analytics Contract
(define-constant contract-owner tx-sender)

;; Analytics data maps
(define-map daily-stats uint {deposits: uint, withdrawals: uint, users: uint})
(define-map user-activity principal {deposits: uint, withdrawals: uint, last-active: uint})

;; Current day counter
(define-data-var current-day uint u0)

;; Record deposit analytics
(define-public (record-deposit (user principal) (amount uint))
  (begin
    (asserts! (is-eq tx-sender contract-owner) (err u401))
    (update-daily-deposits amount)
    (update-user-activity user amount true)
    (ok true)))

;; Record withdrawal analytics  
(define-public (record-withdrawal (user principal) (amount uint))
  (begin
    (asserts! (is-eq tx-sender contract-owner) (err u401))
    (update-daily-withdrawals amount)
    (update-user-activity user amount false)
    (ok true)))

(define-private (update-daily-deposits (amount uint))
  (let ((day (var-get current-day))
        (stats (default-to {deposits: u0, withdrawals: u0, users: u0} 
                           (map-get? daily-stats day))))
    (map-set daily-stats day 
             {deposits: (+ (get deposits stats) amount),
              withdrawals: (get withdrawals stats),
              users: (get users stats)})))

(define-private (update-daily-withdrawals (amount uint))
  (let ((day (var-get current-day))
        (stats (default-to {deposits: u0, withdrawals: u0, users: u0} 
                           (map-get? daily-stats day))))
    (map-set daily-stats day 
             {deposits: (get deposits stats),
              withdrawals: (+ (get withdrawals stats) amount),
              users: (get users stats)})))

(define-private (update-user-activity (user principal) (amount uint) (is-deposit bool))
  (let ((activity (default-to {deposits: u0, withdrawals: u0, last-active: u0}
                              (map-get? user-activity user))))
    (map-set user-activity user
             {deposits: (if is-deposit (+ (get deposits activity) amount) (get deposits activity)),
              withdrawals: (if is-deposit (get withdrawals activity) (+ (get withdrawals activity) amount)),
              last-active: block-height})))

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

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

Functions (7)

FunctionAccessArgs
record-depositpublicuser: principal, amount: uint
record-withdrawalpublicuser: principal, amount: uint
update-daily-depositsprivateamount: uint
update-daily-withdrawalsprivateamount: uint
update-user-activityprivateuser: principal, amount: uint, is-deposit: bool
get-daily-statsread-onlyday: uint
get-user-activityread-onlyuser: principal