Source Code

;; research-marketplace - Clarity 4
;; Marketplace for genomic data sharing with researchers

(define-constant ERR-LISTING-NOT-FOUND (err u100))
(define-constant ERR-NOT-AUTHORIZED (err u101))
(define-constant ERR-INSUFFICIENT-PAYMENT (err u102))

(define-map data-listings uint
  {
    provider: principal,
    data-type: (string-ascii 50),
    price: uint,
    sample-size: uint,
    created-at: uint,
    is-available: bool,
    quality-score: uint,
    access-restrictions: (list 5 (string-ascii 50))
  }
)

(define-map purchase-orders uint
  {
    listing-id: uint,
    buyer: principal,
    price-paid: uint,
    purchased-at: uint,
    access-granted: bool,
    license-type: (string-ascii 50)
  }
)

(define-map data-licenses uint
  {
    purchase-id: uint,
    license-terms: (string-utf8 500),
    duration: uint,
    expires-at: uint,
    usage-restrictions: (list 10 (string-ascii 50)),
    is-active: bool
  }
)

(define-map provider-ratings uint
  {
    provider: principal,
    rater: principal,
    rating: uint,
    comment: (string-utf8 300),
    rated-at: uint,
    verified-purchase: bool
  }
)

(define-map escrow-accounts uint
  {
    purchase-id: uint,
    amount: uint,
    deposited-by: principal,
    release-condition: (string-ascii 50),
    is-released: bool,
    deposited-at: uint
  }
)

(define-data-var listing-counter uint u0)
(define-data-var order-counter uint u0)
(define-data-var license-counter uint u0)
(define-data-var rating-counter uint u0)
(define-data-var escrow-counter uint u0)

(define-public (create-listing
    (data-type (string-ascii 50))
    (price uint)
    (sample-size uint)
    (quality-score uint)
    (access-restrictions (list 5 (string-ascii 50))))
  (let ((listing-id (+ (var-get listing-counter) u1)))
    (map-set data-listings listing-id
      {
        provider: tx-sender,
        data-type: data-type,
        price: price,
        sample-size: sample-size,
        created-at: stacks-block-time,
        is-available: true,
        quality-score: quality-score,
        access-restrictions: access-restrictions
      })
    (var-set listing-counter listing-id)
    (ok listing-id)))

(define-public (purchase-data
    (listing-id uint)
    (license-type (string-ascii 50)))
  (let ((listing (unwrap! (map-get? data-listings listing-id) ERR-LISTING-NOT-FOUND))
        (order-id (+ (var-get order-counter) u1)))
    (asserts! (get is-available listing) ERR-LISTING-NOT-FOUND)
    (map-set purchase-orders order-id
      {
        listing-id: listing-id,
        buyer: tx-sender,
        price-paid: (get price listing),
        purchased-at: stacks-block-time,
        access-granted: false,
        license-type: license-type
      })
    (var-set order-counter order-id)
    (ok order-id)))

(define-public (issue-license
    (purchase-id uint)
    (license-terms (string-utf8 500))
    (duration uint)
    (usage-restrictions (list 10 (string-ascii 50))))
  (let ((license-id (+ (var-get license-counter) u1)))
    (map-set data-licenses license-id
      {
        purchase-id: purchase-id,
        license-terms: license-terms,
        duration: duration,
        expires-at: (+ stacks-block-time duration),
        usage-restrictions: usage-restrictions,
        is-active: true
      })
    (var-set license-counter license-id)
    (ok license-id)))

(define-public (rate-provider
    (provider principal)
    (rating uint)
    (comment (string-utf8 300))
    (verified-purchase bool))
  (let ((rating-id (+ (var-get rating-counter) u1)))
    (map-set provider-ratings rating-id
      {
        provider: provider,
        rater: tx-sender,
        rating: rating,
        comment: comment,
        rated-at: stacks-block-time,
        verified-purchase: verified-purchase
      })
    (var-set rating-counter rating-id)
    (ok rating-id)))

(define-read-only (get-listing (listing-id uint))
  (ok (map-get? data-listings listing-id)))

(define-read-only (get-purchase-order (order-id uint))
  (ok (map-get? purchase-orders order-id)))

(define-read-only (get-license (license-id uint))
  (ok (map-get? data-licenses license-id)))

(define-read-only (get-rating (rating-id uint))
  (ok (map-get? provider-ratings rating-id)))

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

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

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

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

Functions (12)

FunctionAccessArgs
create-listingpublicdata-type: (string-ascii 50
purchase-datapubliclisting-id: uint, license-type: (string-ascii 50
issue-licensepublicpurchase-id: uint, license-terms: (string-utf8 500
rate-providerpublicprovider: principal, rating: uint, comment: (string-utf8 300
get-listingread-onlylisting-id: uint
get-purchase-orderread-onlyorder-id: uint
get-licenseread-onlylicense-id: uint
get-ratingread-onlyrating-id: uint
validate-providerread-onlyprovider: principal
format-listing-idread-onlylisting-id: uint
parse-listing-idread-onlyid-str: (string-ascii 20
get-bitcoin-blockread-only