Source Code

;; Credential Issuer Contract

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))

(define-data-var next-credential-id uint u1)

(define-map credentials
  uint
  {
    holder: principal,
    credential-type: (string-ascii 64),
    issued-at: uint,
    revoked: bool
  }
)

(define-read-only (get-credential (credential-id uint))
  (map-get? credentials credential-id)
)

(define-public (issue-credential (holder principal) (credential-type (string-ascii 64)))
  (let ((credential-id (var-get next-credential-id)))
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (map-set credentials credential-id {
      holder: holder,
      credential-type: credential-type,
      issued-at: block-height,
      revoked: false
    })
    (var-set next-credential-id (+ credential-id u1))
    (ok credential-id)
  )
)

(define-public (revoke-credential (credential-id uint))
  (let ((credential (unwrap! (map-get? credentials credential-id) (err u101))))
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (map-set credentials credential-id (merge credential { revoked: true }))
    (ok true)
  )
)

Functions (3)

FunctionAccessArgs
get-credentialread-onlycredential-id: uint
issue-credentialpublicholder: principal, credential-type: (string-ascii 64
revoke-credentialpubliccredential-id: uint