Source Code

;; genome-vault - Clarity 4
;; Encrypted genomic storage with access control

(define-constant ERR-NOT-AUTHORIZED (err u100))
(define-constant ERR-VAULT-EXISTS (err u101))
(define-constant ERR-VAULT-NOT-FOUND (err u102))

(define-data-var vault-counter uint u0)

(define-map vaults
  { vault-id: uint }
  {
    owner: principal,
    encrypted-data-hash: (buff 64),
    storage-url: (string-utf8 256),
    created-at: uint,
    updated-at: uint,
    is-active: bool
  }
)

(define-map vault-keys
  { vault-id: uint, authorized-principal: principal }
  {
    encrypted-key: (buff 128),
    granted-at: uint,
    expires-at: uint
  }
)

(define-public (create-vault
    (encrypted-hash (buff 64))
    (storage-url (string-utf8 256)))
  (let
    ((new-vault-id (+ (var-get vault-counter) u1)))
    (asserts! (is-none (map-get? vaults { vault-id: new-vault-id })) ERR-VAULT-EXISTS)
    (map-set vaults { vault-id: new-vault-id }
      {
        owner: tx-sender,
        encrypted-data-hash: encrypted-hash,
        storage-url: storage-url,
        created-at: stacks-block-time,
        updated-at: stacks-block-time,
        is-active: true
      })
    (var-set vault-counter new-vault-id)
    (ok new-vault-id)))

(define-public (grant-access
    (vault-id uint)
    (authorized-user principal)
    (encrypted-key (buff 128))
    (expiration uint))
  (let
    ((vault (unwrap! (map-get? vaults { vault-id: vault-id }) ERR-VAULT-NOT-FOUND)))
    (asserts! (is-eq tx-sender (get owner vault)) ERR-NOT-AUTHORIZED)
    (map-set vault-keys { vault-id: vault-id, authorized-principal: authorized-user }
      {
        encrypted-key: encrypted-key,
        granted-at: stacks-block-time,
        expires-at: expiration
      })
    (ok true)))

;; Clarity 4: principal-destruct? - Validate vault owner
(define-read-only (validate-owner (owner principal))
  (principal-destruct? owner))

;; Clarity 4: int-to-ascii - Format vault ID
(define-read-only (format-vault-id (vault-id uint))
  (ok (int-to-ascii vault-id)))

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

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

(define-read-only (get-vault (vault-id uint))
  (ok (map-get? vaults { vault-id: vault-id })))

(define-read-only (get-access-key (vault-id uint) (user principal))
  (ok (map-get? vault-keys { vault-id: vault-id, authorized-principal: user })))

Functions (8)

FunctionAccessArgs
create-vaultpublicencrypted-hash: (buff 64
grant-accesspublicvault-id: uint, authorized-user: principal, encrypted-key: (buff 128
validate-ownerread-onlyowner: principal
format-vault-idread-onlyvault-id: uint
parse-vault-idread-onlyid-str: (string-ascii 20
get-bitcoin-heightread-only
get-vaultread-onlyvault-id: uint
get-access-keyread-onlyvault-id: uint, user: principal