Source Code

;; title: stx-deed-trust
;; version:
;; summary:
;; description:
;; Document Authentication Registry Smart Contract
;;
;; A comprehensive blockchain-based document verification platform that enables secure registration,
;; authentication, and management of digital documents with cryptographic integrity guarantees.
;; Features include multi-party verification workflows, granular access controls, version tracking,
;; and immutable audit trails for complete document lifecycle management.

;; Error constants for contract operations
(define-constant ERR-UNAUTHORIZED-ACCESS (err u100))
(define-constant ERR-DOCUMENT-ALREADY-EXISTS (err u101))
(define-constant ERR-DOCUMENT-NOT-FOUND (err u102))
(define-constant ERR-VERIFICATION-ALREADY-COMPLETED (err u103))
(define-constant ERR-INVALID-DOCUMENT-ID (err u104))
(define-constant ERR-INVALID-HASH-FORMAT (err u105))
(define-constant ERR-INVALID-METADATA (err u106))
(define-constant ERR-INVALID-VERIFIER-ADDRESS (err u107))
(define-constant ERR-INVALID-PARAMETERS (err u108))
(define-constant ERR-INSUFFICIENT-PERMISSIONS (err u109))
(define-constant ERR-NULL-VALUE-ERROR (err u110))

;; Document verification status constants
(define-constant verification-status-pending "PENDING_REVIEW")
(define-constant verification-status-verified "VERIFIED")
(define-constant verification-status-rejected "REJECTED")

;; Validation constraints for data integrity
(define-constant required-hash-byte-length u32)
(define-constant maximum-metadata-character-limit u256)

;; Primary document record structure template
(define-data-var document-record-template {
  original-registrant: principal,
  content-hash: (buff 32),
  registration-timestamp: uint,
  verification-status: (string-ascii 20),
  assigned-verifier: (optional principal),
  descriptive-metadata: (string-utf8 256),
  revision-number: uint,
  modification-locked: bool,
} {
  original-registrant: tx-sender,
  content-hash: 0x0000000000000000000000000000000000000000000000000000000000000000,
  registration-timestamp: u0,
  verification-status: verification-status-pending,
  assigned-verifier: none,
  descriptive-metadata: u"",
  revision-number: u0,
  modification-locked: false,
})

;; Main registry for storing authenticated documents
(define-map document-authentication-registry
  { document-identifier: (buff 32) }
  {
    original-registrant: principal,
    content-hash: (buff 32),
    registration-timestamp: uint,
    verification-status: (string-ascii 20),
    assigned-verifier: (optional principal),
    descriptive-metadata: (string-utf8 256),
    revision-number: uint,
    modification-locked: bool,
  }
)

;; Access control matrix for verifier permissions
(define-map verifier-permission-registry
  {
    document-identifier: (buff 32),
    verifier-principal: principal,
  }
  {
    read-access-granted: bool,
    verification-authority-granted: bool,
  }
)

;; Utility function to validate hash buffer length
(define-private (is-valid-hash-length (hash-buffer (buff 32)))
  (is-eq (len hash-buffer) required-hash-byte-length)
)

;; Utility function to validate metadata string constraints
(define-private (is-valid-metadata-format (metadata-content (string-utf8 256)))
  (and
    (<= (len metadata-content) maximum-metadata-character-limit)
    (> (len metadata-content) u0)
  )
)

;; Utility function to validate principal addresses

;; Comprehensive document identifier validation
(define-private (validate-document-identifier (document-id (buff 32)))
  (if (is-valid-hash-length document-id)
    (ok document-id)
    ERR-INVALID-DOCUMENT-ID
  )
)

;; Comprehensive content hash validation
(define-private (validate-content-hash (hash-value (buff 32)))
  (if (is-valid-hash-length hash-value)
    (ok hash-value)
    ERR-INVALID-HASH-FORMAT
  )
)

;; Comprehensive metadata validation
(define-private (validate-metadata-content (metadata-string (string-utf8 256)))
  (if (is-valid-metadata-format metadata-string)
    (ok metadata-string)
    ERR-INVALID-METADATA
  )
)

;; Enhanced document identifier validation with assertions
(define-private (perform-document-id-validation (document-id (buff 32)))
  (begin
    (asserts! (is-valid-hash-length document-id) ERR-INVALID-DOCUMENT-ID)
    (validate-document-identifier document-id)
  )
)

;; Enhanced metadata validation with assertions
(define-private (perform-metadata-validation (metadata-input (string-utf8 256)))
  (begin
    (asserts! (is-valid-metadata-format metadata-input) ERR-INVALID-METADATA)
    (validate-metadata-content metadata-input)
  )
)

;; Secure document record retrieval function
(define-private (get-document-record (document-id (buff 32)))
  (begin
    (asserts! (is-valid-hash-length document-id) ERR-INVALID-DOCUMENT-ID)
    (let ((validation-result (validate-document-identifier document-id)))
      (match validation-result
        validated-id (match (map-get? document-authentication-registry { document-identifier: validated-id })
          document-record (ok document-record)
          ERR-DOCUMENT-NOT-FOUND
        )
        validation-error (err validation-error)
      )
    )
  )
)

;; Document ownership verification function
(define-private (confirm-document-ownership
    (document-id (buff 32))
    (requesting-user principal)
  )
  (match (get-document-record document-id)
    document-record (ok (is-eq (get original-registrant document-record) requesting-user))
    error-response (err error-response)
  )
)

;; Read-only function to retrieve document information
(define-read-only (get-document-details (document-id (buff 32)))
  (begin
    (asserts! (is-valid-hash-length document-id) ERR-INVALID-DOCUMENT-ID)
    (get-document-record document-id)
  )
)

;; Read-only function to check verifier authorization status

;; Read-only function to verify if document exists in registry
(define-read-only (check-document-exists (document-id (buff 32)))
  (begin
    (asserts! (is-valid-hash-length document-id) ERR-INVALID-DOCUMENT-ID)
    (ok (is-some (map-get? document-authentication-registry { document-identifier: document-id })))
  )
)

;; Public function to register new document in authentication registry
(define-public (register-new-document
    (document-identifier (buff 32))
    (document-hash (buff 32))
    (metadata-description (string-utf8 256))
  )
  (begin
    (asserts! (is-valid-hash-length document-identifier) ERR-INVALID-DOCUMENT-ID)
    (asserts! (is-valid-hash-length document-hash) ERR-INVALID-HASH-FORMAT)
    (asserts! (is-valid-metadata-format metadata-description)
      ERR-INVALID-METADATA
    )

    (let (
        (id-validation-result (perform-document-id-validation document-identifier))
        (hash-validation-result (validate-content-hash document-hash))
        (metadata-validation-result (perform-metadata-validation metadata-description))
      )
      (match id-validation-result
        validated-document-id (match hash-validation-result
          validated-content-hash (match metadata-validation-result
            validated-metadata (match (map-get? document-authentication-registry { document-identifier: validated-document-id })
              existing-document ERR-DOCUMENT-ALREADY-EXISTS
              (ok (map-set document-authentication-registry { document-identifier: validated-document-id } {
                original-registrant: tx-sender,
                content-hash: validated-content-hash,
                registration-timestamp: stacks-block-height,
                verification-status: verification-status-pending,
                assigned-verifier: none,
                descriptive-metadata: validated-metadata,
                revision-number: u1,
                modification-locked: false,
              }))
            )
            validation-error (err validation-error)
          )
          validation-error (err validation-error)
        )
        validation-error (err validation-error)
      )
    )
  )
)

;; Public function to update existing document version
(define-public (update-document-revision
    (document-identifier (buff 32))
    (new-document-hash (buff 32))
    (updated-metadata (string-utf8 256))
  )
  (begin
    (asserts! (is-valid-hash-length document-identifier) ERR-INVALID-DOCUMENT-ID)
    (asserts! (is-valid-hash-length new-document-hash) ERR-INVALID-HASH-FORMAT)
    (asserts! (is-valid-metadata-format updated-metadata) ERR-INVALID-METADATA)

    (let (
        (id-validation-result (perform-document-id-validation document-identifier))
        (hash-validation-result (validate-content-hash new-document-hash))
        (metadata-validation-result (perform-metadata-validation updated-metadata))
      )
      (match id-validation-result
        validated-document-id (begin
          (asserts!
            (is-some (map-get? document-authentication-registry { document-identifier: validated-document-id }))
            ERR-DOCUMENT-NOT-FOUND
          )
          (let ((current-document-record (unwrap-panic (map-get? document-authentication-registry { document-identifier: validated-document-id }))))
            (match hash-validation-result
              validated-new-hash (match metadata-validation-result
                validated-updated-metadata (begin
                  (asserts!
                    (is-eq (get original-registrant current-document-record)
                      tx-sender
                    )
                    ERR-UNAUTHORIZED-ACCESS
                  )
                  (asserts!
                    (not (get modification-locked current-document-record))
                    ERR-VERIFICATION-ALREADY-COMPLETED
                  )
                  (ok (map-set document-authentication-registry { document-identifier: validated-document-id }
                    (merge current-document-record {
                      content-hash: validated-new-hash,
                      descriptive-metadata: validated-updated-metadata,
                      registration-timestamp: stacks-block-height,
                      revision-number: (+ (get revision-number current-document-record) u1),
                      verification-status: verification-status-pending,
                      modification-locked: false,
                    })
                  ))
                )
                validation-error (err validation-error)
              )
              validation-error (err validation-error)
            )
          )
        )
        validation-error (err validation-error)
      )
    )
  )
)

Functions (13)

FunctionAccessArgs
is-valid-hash-lengthprivatehash-buffer: (buff 32
is-valid-metadata-formatprivatemetadata-content: (string-utf8 256
validate-document-identifierprivatedocument-id: (buff 32
validate-content-hashprivatehash-value: (buff 32
validate-metadata-contentprivatemetadata-string: (string-utf8 256
perform-document-id-validationprivatedocument-id: (buff 32
perform-metadata-validationprivatemetadata-input: (string-utf8 256
get-document-recordprivatedocument-id: (buff 32
confirm-document-ownershipprivatedocument-id: (buff 32
get-document-detailsread-onlydocument-id: (buff 32
check-document-existsread-onlydocument-id: (buff 32
register-new-documentpublicdocument-identifier: (buff 32
update-document-revisionpublicdocument-identifier: (buff 32