(define-constant O tx-sender)
(define-constant E1 (err u910))
(define-constant E2 (err u911))
(define-constant E3 (err u912))
(define-data-var premium-rate uint u500)
(define-data-var ic uint u0)
(define-map policies uint
{owner: principal, mid: uint, side: uint, coverage: uint, premium: uint, active: bool})
(define-public (buy-insurance (mid uint) (side uint) (coverage uint))
(let ((prem (/ (* coverage (var-get premium-rate)) u10000))
(id (var-get ic)))
(asserts! (> coverage u0) E2)
(try! (stx-transfer? prem tx-sender (as-contract tx-sender)))
(var-set ic (+ id u1))
(ok (map-set policies id
{owner: tx-sender, mid: mid, side: side, coverage: coverage, premium: prem, active: true}))))
(define-public (claim-insurance (pid uint))
(let ((p (unwrap! (map-get? policies pid) E3)))
(asserts! (is-eq tx-sender (get owner p)) E1)
(asserts! (get active p) E2)
(try! (as-contract (stx-transfer? (get coverage p) tx-sender (get owner p))))
(ok (map-set policies pid (merge p {active: false})))))
(define-public (set-premium-rate (r uint))
(begin (asserts! (is-eq tx-sender O) E1) (ok (var-set premium-rate r))))
(define-read-only (get-policy (pid uint)) (map-get? policies pid))
(define-read-only (get-premium-rate) (var-get premium-rate))
(define-read-only (get-policy-count) (var-get ic))