Source Code

;; title: kyc-registry
;; version: 1.0.0
;; summary: KYC verification registry
;; description: Track user KYC status - Clarity 4

;; Constants
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-UNAUTHORIZED (err u5100))
(define-constant ERR-NOT-VERIFIED (err u5101))

;; KYC levels
(define-constant KYC-NONE u0)
(define-constant KYC-LEVEL-1 u1)
(define-constant KYC-LEVEL-2 u2)
(define-constant KYC-LEVEL-3 u3)

;; Data Variables
(define-data-var total-verified uint u0)

;; Data Maps - Using stacks-block-time for Clarity 4
(define-map kyc-records principal {
  kyc-level: uint,
  verified-at: uint,  ;; Clarity 4: Unix timestamp
  verified-by: principal,
  expires-at: uint,
  country-code: (string-ascii 3),
  is-active: bool
})

(define-map kyc-providers principal {
  name: (string-ascii 50),
  approved: bool,
  added-at: uint  ;; Clarity 4: Unix timestamp
})

;; Public Functions

(define-public (add-kyc-provider (provider principal) (name (string-ascii 50)))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-UNAUTHORIZED)

    (map-set kyc-providers provider {
      name: name,
      approved: true,
      added-at: stacks-block-time
    })

    (ok true)
  )
)

(define-public (verify-user
  (user principal)
  (kyc-level uint)
  (country-code (string-ascii 3))
  (expires-at uint))
  (let (
    (provider-data (unwrap! (map-get? kyc-providers tx-sender) ERR-UNAUTHORIZED))
  )
    (asserts! (get approved provider-data) ERR-UNAUTHORIZED)

    (map-set kyc-records user {
      kyc-level: kyc-level,
      verified-at: stacks-block-time,
      verified-by: tx-sender,
      expires-at: expires-at,
      country-code: country-code,
      is-active: true
    })

    (var-set total-verified (+ (var-get total-verified) u1))

    (print {
      event: "kyc-verified",
      user: user,
      level: kyc-level,
      timestamp: stacks-block-time
    })

    (ok true)
  )
)

(define-public (revoke-kyc (user principal))
  (let (
    (kyc-data (unwrap! (map-get? kyc-records user) ERR-NOT-VERIFIED))
  )
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-UNAUTHORIZED)

    (map-set kyc-records user (merge kyc-data {
      is-active: false
    }))

    (ok true)
  )
)

;; Read-Only Functions

(define-read-only (get-kyc-status (user principal))
  (map-get? kyc-records user)
)

(define-read-only (is-kyc-verified (user principal))
  (match (map-get? kyc-records user)
    kyc-data (and
      (get is-active kyc-data)
      (or
        (is-eq (get expires-at kyc-data) u0)
        (> (get expires-at kyc-data) stacks-block-time)
      )
    )
    false
  )
)

(define-read-only (has-kyc-level (user principal) (required-level uint))
  (match (map-get? kyc-records user)
    kyc-data (and
      (get is-active kyc-data)
      (>= (get kyc-level kyc-data) required-level)
      (or
        (is-eq (get expires-at kyc-data) u0)
        (> (get expires-at kyc-data) stacks-block-time)
      )
    )
    false
  )
)

(define-read-only (get-total-verified)
  (var-get total-verified)
)
;; Clarity 4 Enhanced Functions

;; 1. Clarity 4: principal-destruct? - Validate KYC user principals
(define-read-only (validate-kyc-user (u principal))
  (principal-destruct? u)
)

;; 2. Clarity 4: int-to-ascii - Format KYC level
(define-read-only (format-kyc-level (l uint))
  (ok (int-to-ascii l))
)

;; 3. Clarity 4: string-to-uint? - Parse KYC level from string
(define-read-only (parse-kyc-level (l-str (string-ascii 5)))
  (match (string-to-uint? l-str)
    l (ok l)
    (err u998)
  )
)

;; 4. Clarity 4: burn-block-height - Track KYC timestamps
(define-read-only (get-kyc-timestamps)
  (ok {
    stacks-time: stacks-block-time,
    burn-time: burn-block-height
  })
)

Functions (11)

FunctionAccessArgs
add-kyc-providerpublicprovider: principal, name: (string-ascii 50
verify-userpublicuser: principal, kyc-level: uint, country-code: (string-ascii 3
revoke-kycpublicuser: principal
get-kyc-statusread-onlyuser: principal
is-kyc-verifiedread-onlyuser: principal
has-kyc-levelread-onlyuser: principal, required-level: uint
get-total-verifiedread-only
validate-kyc-userread-onlyu: principal
format-kyc-levelread-onlyl: uint
parse-kyc-levelread-onlyl-str: (string-ascii 5
get-kyc-timestampsread-only