Source Code

;; Clicker Contract - Earn 0.001 STX per interaction
;; Contract 1 of 3 for Stacks Transaction Hub

;; Constants
(define-constant contract-owner tx-sender)
(define-constant interaction-fee u1000) ;; 0.001 STX = 1000 microSTX
(define-constant err-insufficient-fee (err u100))
(define-constant err-transfer-failed (err u101))

;; Data Variables
(define-data-var total-clicks uint u0)
(define-data-var total-fees-collected uint u0)
(define-data-var last-clicker (optional principal) none)

;; Data Maps
(define-map user-clicks principal uint)
(define-map user-streaks principal uint)

;; Private function to collect fee
(define-private (collect-fee)
  (begin
    (try! (stx-transfer? interaction-fee tx-sender contract-owner))
    (var-set total-fees-collected (+ (var-get total-fees-collected) interaction-fee))
    (ok true)
  )
)

;; Read-only functions
(define-read-only (get-total-clicks)
  (var-get total-clicks)
)

(define-read-only (get-total-fees-collected)
  (var-get total-fees-collected)
)

(define-read-only (get-interaction-fee)
  interaction-fee
)

(define-read-only (get-user-clicks (user principal))
  (default-to u0 (map-get? user-clicks user))
)

(define-read-only (get-user-streak (user principal))
  (default-to u0 (map-get? user-streaks user))
)

(define-read-only (get-last-clicker)
  (var-get last-clicker)
)

(define-read-only (get-stats (user principal))
  {
    total: (var-get total-clicks),
    user-clicks: (get-user-clicks user),
    streak: (get-user-streak user),
    last-clicker: (var-get last-clicker),
    fees-collected: (var-get total-fees-collected)
  }
)

;; Public functions - Each call costs 0.001 STX

;; Simple click - costs 0.001 STX
(define-public (click)
  (let
    (
      (current-clicks (get-user-clicks tx-sender))
      (current-streak (get-user-streak tx-sender))
    )
    ;; Collect fee first
    (try! (collect-fee))
    ;; Update user clicks
    (map-set user-clicks tx-sender (+ current-clicks u1))
    ;; Update streak
    (map-set user-streaks tx-sender (+ current-streak u1))
    ;; Update global stats
    (var-set total-clicks (+ (var-get total-clicks) u1))
    (var-set last-clicker (some tx-sender))
    ;; Return success with click count
    (ok (+ current-clicks u1))
  )
)

;; Multi-click - costs 0.001 STX (same fee regardless of count)
(define-public (multi-click (count uint))
  (let
    (
      (current-clicks (get-user-clicks tx-sender))
      (safe-count (if (> count u100) u100 count))
    )
    ;; Collect fee first
    (try! (collect-fee))
    ;; Update user clicks
    (map-set user-clicks tx-sender (+ current-clicks safe-count))
    ;; Update global stats
    (var-set total-clicks (+ (var-get total-clicks) safe-count))
    (var-set last-clicker (some tx-sender))
    ;; Return success
    (ok safe-count)
  )
)

;; Reset streak - costs 0.001 STX
(define-public (reset-streak)
  (begin
    (try! (collect-fee))
    (map-set user-streaks tx-sender u0)
    (ok true)
  )
)

;; Ping - costs 0.001 STX
(define-public (ping)
  (begin
    (try! (collect-fee))
    (ok block-height)
  )
)

Functions (12)

FunctionAccessArgs
collect-feeprivate
get-total-clicksread-only
get-total-fees-collectedread-only
get-interaction-feeread-only
get-user-clicksread-onlyuser: principal
get-user-streakread-onlyuser: principal
get-last-clickerread-only
get-statsread-onlyuser: principal
clickpublic
multi-clickpubliccount: uint
reset-streakpublic
pingpublic