Source Code

;; genome-sharing - Clarity 4
;; Secure sharing of genomic data between parties

(define-constant ERR-SHARE-NOT-FOUND (err u100))
(define-data-var share-counter uint u0)

(define-map shares { share-id: uint }
  { owner: principal, recipient: principal, data-ref: uint, shared-at: uint, expires-at: uint, is-active: bool })

(define-public (create-share (recipient principal) (data-ref uint) (expiration uint))
  (let ((new-id (+ (var-get share-counter) u1)))
    (map-set shares { share-id: new-id }
      { owner: tx-sender, recipient: recipient, data-ref: data-ref, shared-at: stacks-block-time, expires-at: expiration, is-active: true })
    (var-set share-counter new-id)
    (ok new-id)))

(define-public (revoke-share (share-id uint))
  (let ((share (unwrap! (map-get? shares { share-id: share-id }) ERR-SHARE-NOT-FOUND)))
    (ok (map-set shares { share-id: share-id } (merge share { is-active: false })))))

(define-read-only (get-share (share-id uint))
  (ok (map-get? shares { share-id: share-id })))

;; Clarity 4: principal-destruct?
(define-read-only (validate-recipient (recipient principal)) (principal-destruct? recipient))

;; Clarity 4: int-to-utf8
(define-read-only (format-share-id (share-id uint)) (ok (int-to-utf8 share-id)))

;; Clarity 4: string-to-uint?
(define-read-only (parse-share-id (id-str (string-ascii 20))) (string-to-uint? id-str))

;; Clarity 4: burn-block-height
(define-read-only (get-bitcoin-block) (ok burn-block-height))

Functions (7)

FunctionAccessArgs
create-sharepublicrecipient: principal, data-ref: uint, expiration: uint
revoke-sharepublicshare-id: uint
get-shareread-onlyshare-id: uint
validate-recipientread-onlyrecipient: principal
format-share-idread-onlyshare-id: uint
parse-share-idread-onlyid-str: (string-ascii 20
get-bitcoin-blockread-only