Source Code

;; date-market -- halal date fruit marketplace
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-AUTH (err u401))
(define-constant ERR-NONE (err u404))
(define-data-var listing-count uint u0)
(define-data-var total-sold uint u0)
(define-map listings uint { seller: principal, variety: (string-utf8 50), kg: uint, price-per-kg: uint, origin: (string-utf8 100), sold: bool })
(define-map seller-earnings principal uint)

(define-public (create-listing (variety (string-utf8 50)) (kg uint) (price-per-kg uint) (origin (string-utf8 100)))
  (let ((id (+ (var-get listing-count) u1)))
    (var-set listing-count id)
    (map-set listings id { seller: tx-sender, variety: variety, kg: kg, price-per-kg: price-per-kg, origin: origin, sold: false })
    (ok id)))

(define-public (buy-listing (id uint))
  (let ((l (unwrap! (map-get? listings id) ERR-NONE))
        (prev (default-to u0 (map-get? seller-earnings (get seller l)))))
    (asserts! (not (get sold l)) ERR-AUTH)
    (var-set total-sold (+ (var-get total-sold) (get kg l)))
    (map-set listings id (merge l { sold: true }))
    (map-set seller-earnings (get seller l) (+ prev (* (get kg l) (get price-per-kg l))))
    (ok true)))

(define-read-only (get-listing (id uint)) (map-get? listings id))
(define-read-only (get-total-sold) (var-get total-sold))

Functions (4)

FunctionAccessArgs
create-listingpublicvariety: (string-utf8 50
buy-listingpublicid: uint
get-listingread-onlyid: uint
get-total-soldread-only