Source Code

;; Referral System Contract
;; Track referrals and rewards

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-OWNER (err u100))
(define-constant ERR-ALREADY-REFERRED (err u101))
(define-constant ERR-SELF-REFER (err u102))

(define-data-var referral-bonus uint u1000000) ;; 1 STX bonus
(define-data-var total-referrals uint u0)

(define-map referrers principal principal) ;; user -> referrer
(define-map referral-counts principal uint) ;; referrer -> count
(define-map referral-earnings principal uint) ;; referrer -> total earned

(define-public (register-referral (referrer principal))
  (begin
    (asserts! (not (is-eq tx-sender referrer)) ERR-SELF-REFER)
    (asserts! (is-none (map-get? referrers tx-sender)) ERR-ALREADY-REFERRED)
    (map-set referrers tx-sender referrer)
    (map-set referral-counts referrer 
      (+ (default-to u0 (map-get? referral-counts referrer)) u1))
    (map-set referral-earnings referrer 
      (+ (default-to u0 (map-get? referral-earnings referrer)) (var-get referral-bonus)))
    (var-set total-referrals (+ (var-get total-referrals) u1))
    (ok true)))

(define-public (set-bonus (new-bonus uint))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-OWNER)
    (var-set referral-bonus new-bonus)
    (ok new-bonus)))

(define-read-only (get-referrer (user principal))
  (map-get? referrers user))

(define-read-only (get-referral-count (referrer principal))
  (default-to u0 (map-get? referral-counts referrer)))

(define-read-only (get-earnings (referrer principal))
  (default-to u0 (map-get? referral-earnings referrer)))

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

(define-read-only (get-bonus)
  (var-get referral-bonus))

Functions (7)

FunctionAccessArgs
register-referralpublicreferrer: principal
set-bonuspublicnew-bonus: uint
get-referrerread-onlyuser: principal
get-referral-countread-onlyreferrer: principal
get-earningsread-onlyreferrer: principal
get-total-referralsread-only
get-bonusread-only