Source Code

;; validation-health - Clarity 4
;; Data validation and integrity checking for healthcare records

(define-constant ERR-VALIDATION-FAILED (err u100))
(define-constant ERR-INVALID-FORMAT (err u101))
(define-constant ERR-MISSING-REQUIRED-FIELD (err u102))

(define-map validation-rules uint
  {
    rule-name: (string-utf8 100),
    field-name: (string-ascii 50),
    validation-type: (string-ascii 50),
    min-value: (optional uint),
    max-value: (optional uint),
    is-required: bool,
    created-at: uint
  }
)

(define-map validation-results uint
  {
    data-id: uint,
    rule-id: uint,
    validated-by: principal,
    passed: bool,
    error-message: (optional (string-utf8 500)),
    validated-at: uint
  }
)

(define-map data-integrity-checks uint
  {
    data-hash: (buff 64),
    checksum: (buff 32),
    verified: bool,
    verified-by: principal,
    verified-at: uint
  }
)

(define-map schema-definitions uint
  {
    schema-name: (string-utf8 100),
    version: uint,
    required-fields: (list 20 (string-ascii 50)),
    field-types: (list 20 (string-ascii 50)),
    is-active: bool
  }
)

(define-data-var rule-counter uint u0)
(define-data-var result-counter uint u0)
(define-data-var check-counter uint u0)
(define-data-var schema-counter uint u0)

(define-public (create-validation-rule
    (rule-name (string-utf8 100))
    (field-name (string-ascii 50))
    (validation-type (string-ascii 50))
    (min-value (optional uint))
    (max-value (optional uint))
    (is-required bool))
  (let ((rule-id (+ (var-get rule-counter) u1)))
    (map-set validation-rules rule-id
      {
        rule-name: rule-name,
        field-name: field-name,
        validation-type: validation-type,
        min-value: min-value,
        max-value: max-value,
        is-required: is-required,
        created-at: stacks-block-time
      })
    (var-set rule-counter rule-id)
    (ok rule-id)))

(define-public (validate-data
    (data-id uint)
    (rule-id uint)
    (passed bool)
    (error-message (optional (string-utf8 500))))
  (let ((result-id (+ (var-get result-counter) u1)))
    (map-set validation-results result-id
      {
        data-id: data-id,
        rule-id: rule-id,
        validated-by: tx-sender,
        passed: passed,
        error-message: error-message,
        validated-at: stacks-block-time
      })
    (var-set result-counter result-id)
    (if passed
        (ok result-id)
        ERR-VALIDATION-FAILED)))

(define-public (verify-data-integrity
    (data-hash (buff 64))
    (checksum (buff 32)))
  (let ((check-id (+ (var-get check-counter) u1)))
    (map-set data-integrity-checks check-id
      {
        data-hash: data-hash,
        checksum: checksum,
        verified: true,
        verified-by: tx-sender,
        verified-at: stacks-block-time
      })
    (var-set check-counter check-id)
    (ok check-id)))

(define-public (define-schema
    (schema-name (string-utf8 100))
    (version uint)
    (required-fields (list 20 (string-ascii 50)))
    (field-types (list 20 (string-ascii 50))))
  (let ((schema-id (+ (var-get schema-counter) u1)))
    (asserts! (is-eq (len required-fields) (len field-types)) ERR-INVALID-FORMAT)
    (map-set schema-definitions schema-id
      {
        schema-name: schema-name,
        version: version,
        required-fields: required-fields,
        field-types: field-types,
        is-active: true
      })
    (var-set schema-counter schema-id)
    (ok schema-id)))

(define-read-only (get-validation-rule (rule-id uint))
  (ok (map-get? validation-rules rule-id)))

(define-read-only (get-validation-result (result-id uint))
  (ok (map-get? validation-results result-id)))

(define-read-only (get-integrity-check (check-id uint))
  (ok (map-get? data-integrity-checks check-id)))

(define-read-only (get-schema (schema-id uint))
  (ok (map-get? schema-definitions schema-id)))

(define-read-only (validate-range (value uint) (min-val uint) (max-val uint))
  (ok (and (>= value min-val) (<= value max-val))))

(define-read-only (validate-hash (data (buff 128)))
  (ok (sha256 data)))

(define-read-only (validate-principal (p principal))
  (principal-destruct? p))

(define-read-only (format-rule-id (rule-id uint))
  (ok (int-to-ascii rule-id)))

(define-read-only (parse-rule-id (id-str (string-ascii 20)))
  (string-to-uint? id-str))

(define-read-only (get-bitcoin-block)
  (ok burn-block-height))

Functions (14)

FunctionAccessArgs
create-validation-rulepublicrule-name: (string-utf8 100
validate-datapublicdata-id: uint, rule-id: uint, passed: bool, error-message: (optional (string-utf8 500
verify-data-integritypublicdata-hash: (buff 64
define-schemapublicschema-name: (string-utf8 100
get-validation-ruleread-onlyrule-id: uint
get-validation-resultread-onlyresult-id: uint
get-integrity-checkread-onlycheck-id: uint
get-schemaread-onlyschema-id: uint
validate-rangeread-onlyvalue: uint, min-val: uint, max-val: uint
validate-hashread-onlydata: (buff 128
validate-principalread-onlyp: principal
format-rule-idread-onlyrule-id: uint
parse-rule-idread-onlyid-str: (string-ascii 20
get-bitcoin-blockread-only