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