;; SatGuard Governance Delegation
(define-constant err-nf (err u240))
(define-constant err-self (err u241))
(define-constant err-dup (err u242))
(define-map delegates {from: principal} {to: principal,da: uint})
(define-map del-power {to: principal} {total: uint,count: uint})
(define-read-only (get-delegate (from principal)) (map-get? delegates {from: from}))
(define-read-only (get-del-power (to principal)) (map-get? del-power {to: to}))
(define-public (delegate-to (to principal))
(let ((contrib (unwrap! (contract-call? .insurance-pool get-contrib u1 tx-sender) err-nf))
(wt (get a contrib))
(ex (map-get? delegates {from: tx-sender}))
(dp (default-to {total: u0,count: u0} (map-get? del-power {to: to}))))
(asserts! (not (is-eq tx-sender to)) err-self)
(asserts! (is-none ex) err-dup)
(map-set delegates {from: tx-sender} {to: to,da: block-height})
(map-set del-power {to: to} {total: (+ (get total dp) wt),count: (+ (get count dp) u1)})
(print {e: "delegated",from: tx-sender,to: to,wt: wt})
(ok true)))
(define-public (revoke-delegation)
(let ((del (unwrap! (map-get? delegates {from: tx-sender}) err-nf))
(contrib (unwrap! (contract-call? .insurance-pool get-contrib u1 tx-sender) err-nf))
(wt (get a contrib))
(dp (default-to {total: u0,count: u0} (map-get? del-power {to: (get to del)}))))
(map-delete delegates {from: tx-sender})
(map-set del-power {to: (get to del)} {total: (- (get total dp) wt),count: (- (get count dp) u1)})
(print {e: "delegation-revoked",from: tx-sender})
(ok true)))