Source Code

;; 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)))

Functions (4)

FunctionAccessArgs
get-referrerread-onlywho: principal
get-referral-countread-onlywho: principal
set-referrerpublicreferrer: principal
record-referral-valuepublicwho: principal, value: uint