Source Code

;; Milk Bank - Breast milk bank for orphans and needy
;; Halal - nourishing infants (rada'ah)
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-AUTH (err u401))
(define-constant ERR-NONE (err u404))
(define-data-var donation-count uint u0)
(define-data-var total-ml uint u0)
(define-map milk-donations uint { donor-id: uint, ml: uint, screened: bool, block: uint })
(define-map milk-requests uint { requester: principal, ml-needed: uint, fulfilled: bool })
(define-data-var request-count uint u0)
(define-public (donate-milk (donor-id uint) (ml uint))
  (let ((id (+ (var-get donation-count) u1)))
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-AUTH)
    (map-set milk-donations id { donor-id: donor-id, ml: ml, screened: false, block: stacks-block-height })
    (var-set donation-count id)
    (var-set total-ml (+ (var-get total-ml) ml)) (ok id)))
(define-public (screen-donation (id uint))
  (let ((d (unwrap! (map-get? milk-donations id) ERR-NONE)))
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-AUTH)
    (map-set milk-donations id (merge d { screened: true })) (ok true)))
(define-public (request-milk (ml uint))
  (let ((id (+ (var-get request-count) u1)))
    (map-set milk-requests id { requester: tx-sender, ml-needed: ml, fulfilled: false })
    (var-set request-count id) (ok id)))
(define-public (fulfill-request (id uint))
  (let ((r (unwrap! (map-get? milk-requests id) ERR-NONE)))
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-AUTH)
    (map-set milk-requests id (merge r { fulfilled: true })) (ok true)))
(define-read-only (get-donation (id uint)) (map-get? milk-donations id))
(define-read-only (get-request (id uint)) (map-get? milk-requests id))
(define-read-only (get-stats) (ok { donations: (var-get donation-count), total-ml: (var-get total-ml) }))

Functions (7)

FunctionAccessArgs
donate-milkpublicdonor-id: uint, ml: uint
screen-donationpublicid: uint
request-milkpublicml: uint
fulfill-requestpublicid: uint
get-donationread-onlyid: uint
get-requestread-onlyid: uint
get-statsread-only