Source Code

;; TipStream Referral
;; Referral tracking with voluntary bonus payments
;; Users register who referred them, then can send voluntary STX bonuses

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u900))
(define-constant err-already-referred (err u901))
(define-constant err-self-referral (err u902))
(define-constant err-no-referrer (err u903))
(define-constant err-invalid-amount (err u904))

;; referred user -> referrer
(define-map referrals principal principal)

;; referrer -> number of users referred
(define-map referral-count principal uint)

;; referrer -> total STX bonus earned
(define-map total-bonus-earned principal uint)

(define-data-var total-referrals uint u0)

;; ---------- Referral Registration ----------

(define-public (register-referral (referrer principal))
    (begin
        (asserts! (not (is-eq tx-sender referrer)) err-self-referral)
        (asserts! (is-none (map-get? referrals tx-sender)) err-already-referred)
        (map-set referrals tx-sender referrer)
        (map-set referral-count referrer
            (+ (default-to u0 (map-get? referral-count referrer)) u1))
        (var-set total-referrals (+ (var-get total-referrals) u1))
        (ok true)
    )
)

;; ---------- Bonus Payments ----------

;; Send a voluntary STX bonus to your referrer
(define-public (send-referral-bonus (amount uint))
    (let
        (
            (referrer (unwrap! (map-get? referrals tx-sender) err-no-referrer))
            (current-earned (default-to u0 (map-get? total-bonus-earned referrer)))
        )
        (asserts! (> amount u0) err-invalid-amount)
        (try! (stx-transfer? amount tx-sender referrer))
        (map-set total-bonus-earned referrer (+ current-earned amount))
        (ok true)
    )
)

;; ---------- Read-Only Queries ----------

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

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

(define-read-only (get-total-bonus-earned (referrer principal))
    (default-to u0 (map-get? total-bonus-earned referrer))
)

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

(define-read-only (is-referred (user principal))
    (is-some (map-get? referrals user))
)

Functions (7)

FunctionAccessArgs
register-referralpublicreferrer: principal
send-referral-bonuspublicamount: uint
get-referrerread-onlyuser: principal
get-referral-countread-onlyreferrer: principal
get-total-bonus-earnedread-onlyreferrer: principal
get-total-referralsread-only
is-referredread-onlyuser: principal