;; SatGuard Multisig
(define-constant err-owner (err u1100))
(define-constant err-nf (err u1101))
(define-constant err-dup (err u1102))
(define-constant err-done (err u1103))
(define-data-var admin principal tx-sender)
(define-data-var m-nonce uint u0)
(define-data-var threshold uint u2) ;; 2-of-N
(define-map msigs {id: uint} {desc: (string-ascii 50),approvals: uint,executed: bool,ca: uint})
(define-map msig-approvals {id: uint,who: principal} {aa: uint})
(define-read-only (get-msig (id uint)) (map-get? msigs {id: id}))
(define-public (create-msig (desc (string-ascii 50)))
(let ((nid (+ (var-get m-nonce) u1)))
(map-set msigs {id: nid} {desc: desc,approvals: u0,executed: false,ca: block-height})
(var-set m-nonce nid)
(print {e: "msig-created",id: nid,desc: desc})
(ok nid)))
(define-public (approve-msig (id uint))
(let ((ms (unwrap! (get-msig id) err-nf))
(ex (map-get? msig-approvals {id: id,who: tx-sender})))
(asserts! (not (get executed ms)) err-done)
(asserts! (is-none ex) err-dup)
(map-set msig-approvals {id: id,who: tx-sender} {aa: block-height})
(map-set msigs {id: id} (merge ms {approvals: (+ (get approvals ms) u1)}))
(print {e: "msig-approved",id: id,who: tx-sender})
(ok true)))
(define-read-only (is-approved (id uint))
(match (get-msig id) ms (ok (>= (get approvals ms) (var-get threshold))) (ok false)))