;; SatGuard Referral Program
(define-constant err-self (err u940))
(define-constant err-dup (err u941))
(define-constant err-nf (err u942))
(define-map referrals {who: principal} {referrer: principal,ra: uint})
(define-map ref-counts {who: principal} {count: uint,total-value: uint})
(define-read-only (get-referrer (who principal)) (map-get? referrals {who: who}))
(define-read-only (get-referral-count (who principal)) (default-to {count: u0,total-value: u0} (map-get? ref-counts {who: who})))
(define-public (set-referrer (referrer principal))
(begin
(asserts! (not (is-eq tx-sender referrer)) err-self)
(asserts! (is-none (map-get? referrals {who: tx-sender})) err-dup)
(map-set referrals {who: tx-sender} {referrer: referrer,ra: block-height})
(let ((rc (get-referral-count referrer)))
(map-set ref-counts {who: referrer} {count: (+ (get count rc) u1),total-value: (get total-value rc)}))
(print {e: "referrer-set",who: tx-sender,referrer: referrer})
(ok true)))
(define-public (record-referral-value (who principal) (value uint))
(let ((ref (unwrap! (map-get? referrals {who: who}) err-nf))
(rc (get-referral-count (get referrer ref))))
(map-set ref-counts {who: (get referrer ref)} {count: (get count rc),total-value: (+ (get total-value rc) value)})
(print {e: "referral-value",who: who,referrer: (get referrer ref),value: value})
(ok true)))