Source Code

;; SatGuard Badges - achievement system
(define-constant err-owner (err u910))
(define-constant err-dup (err u911))
(define-data-var admin principal tx-sender)
(define-data-var b-nonce uint u0)
(define-map badge-types {id: uint} {name: (string-ascii 30),desc: (string-utf8 100)})
(define-map user-badges {who: principal,bid: uint} {aa: uint})
(define-map badge-counts {who: principal} {count: uint})
(define-read-only (get-badge-type (id uint)) (map-get? badge-types {id: id}))
(define-read-only (has-badge (who principal) (bid uint)) (is-some (map-get? user-badges {who: who,bid: bid})))
(define-read-only (get-badge-count (who principal)) (default-to {count: u0} (map-get? badge-counts {who: who})))
(define-public (create-badge-type (name (string-ascii 30)) (desc (string-utf8 100)))
  (let ((nid (+ (var-get b-nonce) u1)))
    (asserts! (is-eq tx-sender (var-get admin)) err-owner)
    (map-set badge-types {id: nid} {name: name,desc: desc})
    (var-set b-nonce nid)
    (print {e: "badge-type-created",id: nid,name: name})
    (ok nid)))
(define-public (award-badge (who principal) (bid uint))
  (let ((bt (unwrap! (map-get? badge-types {id: bid}) (err u912)))
        (bc (get count (get-badge-count who))))
    (asserts! (is-eq tx-sender (var-get admin)) err-owner)
    (asserts! (not (has-badge who bid)) err-dup)
    (map-set user-badges {who: who,bid: bid} {aa: block-height})
    (map-set badge-counts {who: who} {count: (+ bc u1)})
    (print {e: "badge-awarded",who: who,bid: bid})
    (ok true)))

Functions (5)

FunctionAccessArgs
get-badge-typeread-onlyid: uint
has-badgeread-onlywho: principal, bid: uint
get-badge-countread-onlywho: principal
create-badge-typepublicname: (string-ascii 30
award-badgepublicwho: principal, bid: uint