Source Code

;; langar-kitchen -- community kitchen / langar meal service
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-AUTH (err u401))
(define-constant ERR-NONE (err u404))
(define-data-var kitchen-count uint u0)
(define-data-var total-meals-served uint u0)
(define-map kitchens uint { manager: principal, name: (string-utf8 100), location: (string-utf8 100), meals-served: uint, active: bool })
(define-map kitchen-donors { kitchen-id: uint, donor: principal } uint)

(define-public (register-kitchen (name (string-utf8 100)) (location (string-utf8 100)))
  (let ((id (+ (var-get kitchen-count) u1)))
    (var-set kitchen-count id)
    (map-set kitchens id { manager: tx-sender, name: name, location: location, meals-served: u0, active: true })
    (ok id)))

(define-public (donate-to-kitchen (kitchen-id uint) (amount uint))
  (let ((prev (default-to u0 (map-get? kitchen-donors { kitchen-id: kitchen-id, donor: tx-sender }))))
    (map-set kitchen-donors { kitchen-id: kitchen-id, donor: tx-sender } (+ prev amount))
    (ok amount)))

(define-public (log-meals (kitchen-id uint) (meals uint))
  (let ((k (unwrap! (map-get? kitchens kitchen-id) ERR-NONE)))
    (asserts! (is-eq tx-sender (get manager k)) ERR-AUTH)
    (var-set total-meals-served (+ (var-get total-meals-served) meals))
    (map-set kitchens kitchen-id (merge k { meals-served: (+ (get meals-served k) meals) }))
    (ok meals)))

(define-read-only (get-kitchen (id uint)) (map-get? kitchens id))
(define-read-only (get-total-meals) (var-get total-meals-served))

Functions (5)

FunctionAccessArgs
register-kitchenpublicname: (string-utf8 100
donate-to-kitchenpublickitchen-id: uint, amount: uint
log-mealspublickitchen-id: uint, meals: uint
get-kitchenread-onlyid: uint
get-total-mealsread-only