Source Code

;; Badge Metadata Contract
;; Manages typed maps for badge metadata storage

;; Constants
(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-not-found (err u102))
(define-constant err-unauthorized (err u104))

;; Badge metadata structure using typed maps
(define-map badge-metadata 
  { id: uint }
  { 
    level: uint, 
    category: uint, 
    timestamp: uint,
    issuer: principal,
    active: bool
  }
)

;; Badge template information
(define-map badge-templates
  { template-id: uint }
  {
    name: (string-ascii 64),
    description: (string-ascii 256),
    category: uint,
    default-level: uint,
    creator: principal
  }
)

;; User badge ownership tracking
(define-map user-badges
  { owner: principal }
  { badge-ids: (list 100 uint) }
)

;; Data variables
(define-data-var next-template-id uint u1)

;; Read functions
(define-read-only (get-badge-metadata (badge-id uint))
  (map-get? badge-metadata { id: badge-id })
)

(define-read-only (get-badge-template (template-id uint))
  (map-get? badge-templates { template-id: template-id })
)

(define-read-only (get-user-badges (user principal))
  (default-to { badge-ids: (list) } (map-get? user-badges { owner: user }))
)

;; Write functions
(define-public (set-badge-metadata (badge-id uint) (metadata {level: uint, category: uint, timestamp: uint, issuer: principal, active: bool}))
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (ok (map-set badge-metadata { id: badge-id } metadata))
  )
)

(define-public (create-badge-template (name (string-ascii 64)) (description (string-ascii 256)) (category uint) (default-level uint))
  (let
    (
      (template-id (var-get next-template-id))
    )
    (map-set badge-templates 
      { template-id: template-id }
      {
        name: name,
        description: description,
        category: category,
        default-level: default-level,
        creator: tx-sender
      }
    )
    (var-set next-template-id (+ template-id u1))
    (ok template-id)
  )
)

Functions (5)

FunctionAccessArgs
get-badge-metadataread-onlybadge-id: uint
get-badge-templateread-onlytemplate-id: uint
get-user-badgesread-onlyuser: principal
set-badge-metadatapublicbadge-id: uint, metadata: {level: uint, category: uint, timestamp: uint, issuer: principal, active: bool}
create-badge-templatepublicname: (string-ascii 64