Source Code


;; DeFi Governance
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-AUTHORIZED (err u1))
(define-constant ERR-ALREADY-VOTED (err u2))

(define-data-var proposal-count uint u0)
(define-map proposals uint {title: (string-ascii 100), votes-for: uint, votes-against: uint, active: bool})
(define-map votes {proposal: uint, voter: principal} bool)

(define-public (create-proposal (title (string-ascii 100)))
  (let ((id (var-get proposal-count)))
    (map-set proposals id {title: title, votes-for: u0, votes-against: u0, active: true})
    (var-set proposal-count (+ id u1))
    (ok id)))

(define-public (vote (proposal-id uint) (support bool))
  (let ((p (unwrap! (map-get? proposals proposal-id) ERR-NOT-AUTHORIZED)))
    (asserts! (is-none (map-get? votes {proposal: proposal-id, voter: tx-sender})) ERR-ALREADY-VOTED)
    (asserts! (get active p) ERR-NOT-AUTHORIZED)
    (map-set votes {proposal: proposal-id, voter: tx-sender} support)
    (if support
      (map-set proposals proposal-id (merge p {votes-for: (+ (get votes-for p) u1)}))
      (map-set proposals proposal-id (merge p {votes-against: (+ (get votes-against p) u1)})))
    (ok support)))

(define-public (close-proposal (id uint))
  (let ((p (unwrap! (map-get? proposals id) ERR-NOT-AUTHORIZED)))
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (map-set proposals id (merge p {active: false}))
    (ok true)))

(define-read-only (get-proposal (id uint))
  (map-get? proposals id))

(define-read-only (get-proposal-count)
  (var-get proposal-count))

Functions (5)

FunctionAccessArgs
create-proposalpublictitle: (string-ascii 100
votepublicproposal-id: uint, support: bool
close-proposalpublicid: uint
get-proposalread-onlyid: uint
get-proposal-countread-only