(define-constant O tx-sender)
(define-constant E1 (err u710))
(define-constant E2 (err u711))
(define-constant E3 (err u712))
(define-data-var fee-rate uint u50)
(define-data-var collected uint u0)
(define-map market-fees uint uint)
(define-public (set-fee-rate (r uint))
(begin (asserts! (is-eq tx-sender O) E1)
(asserts! (<= r u1000) E2)
(ok (var-set fee-rate r))))
(define-public (record-fee (mid uint) (amt uint))
(let ((fee (/ (* amt (var-get fee-rate)) u10000))
(cur (default-to u0 (map-get? market-fees mid))))
(map-set market-fees mid (+ cur fee))
(var-set collected (+ (var-get collected) fee))
(ok fee)))
(define-public (withdraw-fees)
(begin (asserts! (is-eq tx-sender O) E1)
(let ((bal (var-get collected)))
(asserts! (> bal u0) E3)
(var-set collected u0)
(ok bal))))
(define-read-only (get-fee-rate) (var-get fee-rate))
(define-read-only (get-collected) (var-get collected))
(define-read-only (get-market-fee (mid uint))
(default-to u0 (map-get? market-fees mid)))