Source Code

;; voting-system.clar
;; Complex voting logic

;; Constants
(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-not-found (err u101))
(define-constant err-already-voted (err u102))
(define-constant err-voting-closed (err u103))
(define-constant err-voting-not-started (err u104))

;; Data Maps
(define-map proposals 
    { proposal-id: uint } 
    { 
        title: (string-ascii 64),
        description: (string-utf8 256),
        start-block: uint,
        end-block: uint,
        yes-votes: uint,
        no-votes: uint,
        status: (string-ascii 20) ;; "active", "passed", "failed"
    }
)

(define-map votes { proposal-id: uint, voter: principal } { vote: bool, weight: uint })
(define-map voter-power { voter: principal } { amount: uint })

;; Variables
(define-data-var proposal-count uint u0)
(define-data-var min-voting-power uint u10)

;; Read-only functions

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

(define-read-only (get-vote (proposal-id uint) (voter principal))
    (map-get? votes { proposal-id: proposal-id, voter: voter }))

(define-read-only (get-voter-power (voter principal))
    (default-to u0 (get amount (map-get? voter-power { voter: voter }))))

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

(define-read-only (is-voting-active (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (and (>= burn-block-height (get start-block proposal)) (< burn-block-height (get end-block proposal)))
        false))

;; Public functions

(define-public (create-proposal (title (string-ascii 64)) (description (string-utf8 256)) (duration uint))
    (let ((id (var-get proposal-count)))
        (map-set proposals { proposal-id: id } 
                 { 
                     title: title,
                     description: description,
                     start-block: burn-block-height,
                     end-block: (+ burn-block-height duration),
                     yes-votes: u0,
                     no-votes: u0,
                     status: "active"
                 })
        (var-set proposal-count (+ id u1))
        (ok id)))

(define-public (vote (proposal-id uint) (vote-for bool))
    (let ((power (get-voter-power tx-sender)))
        (asserts! (>= power (var-get min-voting-power)) (err u105))
        (asserts! (is-none (map-get? votes { proposal-id: proposal-id, voter: tx-sender })) err-already-voted)
        
        (match (map-get? proposals { proposal-id: proposal-id })
            proposal (begin
                        (asserts! (and (>= burn-block-height (get start-block proposal)) (< burn-block-height (get end-block proposal))) err-voting-closed)
                        (map-set votes { proposal-id: proposal-id, voter: tx-sender } { vote: vote-for, weight: power })
                        (map-set proposals { proposal-id: proposal-id } 
                                 (merge proposal { 
                                     yes-votes: (if vote-for (+ (get yes-votes proposal) power) (get yes-votes proposal)),
                                     no-votes: (if vote-for (get no-votes proposal) (+ (get no-votes proposal) power))
                                 }))
                        (ok true))
            err-not-found)))

(define-public (conclude-proposal (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (begin
                    (asserts! (>= burn-block-height (get end-block proposal)) err-voting-not-started)
                    (map-set proposals { proposal-id: proposal-id } 
                             (merge proposal { status: (if (> (get yes-votes proposal) (get no-votes proposal)) "passed" "failed") }))
                    (ok true))
        err-not-found))

(define-public (set-voting-power (voter principal) (amount uint))
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        (map-set voter-power { voter: voter } { amount: amount })
        (ok true)))

(define-public (set-min-voting-power (amount uint))
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        (var-set min-voting-power amount)
        (ok true)))

;; Helper functions for quota

(define-public (get-proposal-status (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (get status proposal))
        err-not-found))

(define-public (get-proposal-votes (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok { yes: (get yes-votes proposal), no: (get no-votes proposal) })
        err-not-found))

(define-public (has-voted (proposal-id uint) (voter principal))
    (ok (is-some (map-get? votes { proposal-id: proposal-id, voter: voter }))))

(define-public (get-vote-weight (proposal-id uint) (voter principal))
    (match (map-get? votes { proposal-id: proposal-id, voter: voter })
        vote-info (ok (get weight vote-info))
        (ok u0)))

(define-public (admin-cancel-proposal (proposal-id uint))
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        (map-delete proposals { proposal-id: proposal-id })
        (ok true)))

(define-public (extend-proposal (proposal-id uint) (blocks uint))
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        (match (map-get? proposals { proposal-id: proposal-id })
            proposal (begin
                        (map-set proposals { proposal-id: proposal-id } 
                                 (merge proposal { end-block: (+ (get end-block proposal) blocks) }))
                        (ok true))
            err-not-found)))

(define-public (delegate-vote (to principal))
    (begin
        ;; Placeholder for delegation logic
        (ok true)))

(define-public (revoke-delegation)
    (begin
        ;; Placeholder
        (ok true)))

(define-public (get-delegated-power (user principal))
    (ok u0)) ;; Placeholder

(define-public (check-proposal-passed (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (> (get yes-votes proposal) (get no-votes proposal)))
        err-not-found))

(define-public (get-remaining-blocks (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (if (< burn-block-height (get end-block proposal)) 
                         (- (get end-block proposal) burn-block-height)
                         u0))
        err-not-found))

(define-public (batch-set-power (voters (list 10 principal)) (amount uint))
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        ;; Simplified batch logic
        (ok true)))

(define-public (emergency-pause-voting)
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        (ok true)))

(define-public (resume-voting)
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        (ok true)))

(define-public (update-proposal-description (proposal-id uint) (new-desc (string-utf8 256)))
    (begin
        (asserts! (is-eq tx-sender contract-owner) err-owner-only)
        (match (map-get? proposals { proposal-id: proposal-id })
            proposal (begin
                        (map-set proposals { proposal-id: proposal-id } (merge proposal { description: new-desc }))
                        (ok true))
            err-not-found)))

(define-public (get-current-block)
    (ok burn-block-height))

(define-public (is-admin (user principal))
    (ok (is-eq user contract-owner)))

(define-public (get-min-power)
    (ok (var-get min-voting-power)))

(define-public (get-voter-participation-rate (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (/ (+ (get yes-votes proposal) (get no-votes proposal)) u100))
        err-not-found))

(define-public (predict-proposal-outcome (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (if (> (get yes-votes proposal) (get no-votes proposal)) "likely-pass" "likely-fail"))
        err-not-found))

(define-public (get-voting-power-history (user principal))
    (ok (get-voter-power user))) ;; Simplified

(define-public (is-proposal-contentious (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (let ((diff (if (> (get yes-votes proposal) (get no-votes proposal)) 
                                 (- (get yes-votes proposal) (get no-votes proposal)) 
                                 (- (get no-votes proposal) (get yes-votes proposal)))))
                     (ok (< diff u100)))
        err-not-found))

(define-public (get-proposal-duration (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (- (get end-block proposal) (get start-block proposal)))
        err-not-found))

(define-public (check-voter-eligibility (user principal))
    (ok (>= (get-voter-power user) (var-get min-voting-power))))

(define-public (get-total-votes-cast (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (+ (get yes-votes proposal) (get no-votes proposal)))
        err-not-found))

(define-public (is-voting-period-over (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (>= burn-block-height (get end-block proposal)))
        err-not-found))

(define-public (get-proposal-age (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (- burn-block-height (get start-block proposal)))
        err-not-found))

(define-public (calculate-quorum (proposal-id uint))
    (ok u1000)) ;; Placeholder

(define-public (has-quorum-reached (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (> (+ (get yes-votes proposal) (get no-votes proposal)) u1000))
        err-not-found))

(define-public (get-winning-side (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (if (> (get yes-votes proposal) (get no-votes proposal)) "yes" "no"))
        err-not-found))

(define-public (get-vote-margin (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (if (> (get yes-votes proposal) (get no-votes proposal)) 
                         (- (get yes-votes proposal) (get no-votes proposal)) 
                         (- (get no-votes proposal) (get yes-votes proposal))))
        err-not-found))

(define-public (is-proposal-active-at (proposal-id uint) (height uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (and (>= height (get start-block proposal)) (< height (get end-block proposal))))
        err-not-found))

(define-public (get-proposal-end-time (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (get end-block proposal))
        err-not-found))

(define-public (get-proposal-start-time (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (get start-block proposal))
        err-not-found))

(define-public (can-vote-with-power (user principal) (power uint))
    (ok (>= (get-voter-power user) power)))

(define-public (get-average-voting-power)
    (ok u50)) ;; Placeholder

(define-public (get-active-proposal-count)
    (ok u0)) ;; Placeholder

(define-public (is-voter-registered (user principal))
    (ok (> (get-voter-power user) u0)))

(define-public (get-proposal-title-length (proposal-id uint))
    (match (map-get? proposals { proposal-id: proposal-id })
        proposal (ok (len (get title proposal)))
        err-not-found))

(define-public (check-proposal-validity (proposal-id uint))
    (ok true))

(define-public (get-system-status)
    (ok "operational"))

(define-public (get-protocol-version)
    (ok "v1.0.0"))

(define-public (is-emergency-mode)
    (ok false))

Functions (53)

FunctionAccessArgs
get-proposalread-onlyproposal-id: uint
get-voteread-onlyproposal-id: uint, voter: principal
get-voter-powerread-onlyvoter: principal
get-proposal-countread-only
is-voting-activeread-onlyproposal-id: uint
create-proposalpublictitle: (string-ascii 64
votepublicproposal-id: uint, vote-for: bool
conclude-proposalpublicproposal-id: uint
set-voting-powerpublicvoter: principal, amount: uint
set-min-voting-powerpublicamount: uint
get-proposal-statuspublicproposal-id: uint
get-proposal-votespublicproposal-id: uint
has-votedpublicproposal-id: uint, voter: principal
get-vote-weightpublicproposal-id: uint, voter: principal
admin-cancel-proposalpublicproposal-id: uint
extend-proposalpublicproposal-id: uint, blocks: uint
delegate-votepublicto: principal
revoke-delegationpublic
get-delegated-powerpublicuser: principal
check-proposal-passedpublicproposal-id: uint
get-remaining-blockspublicproposal-id: uint
batch-set-powerpublicvoters: (list 10 principal
emergency-pause-votingpublic
resume-votingpublic
update-proposal-descriptionpublicproposal-id: uint, new-desc: (string-utf8 256
get-current-blockpublic
is-adminpublicuser: principal
get-min-powerpublic
get-voter-participation-ratepublicproposal-id: uint
predict-proposal-outcomepublicproposal-id: uint
get-voting-power-historypublicuser: principal
is-proposal-contentiouspublicproposal-id: uint
get-proposal-durationpublicproposal-id: uint
check-voter-eligibilitypublicuser: principal
get-total-votes-castpublicproposal-id: uint
is-voting-period-overpublicproposal-id: uint
get-proposal-agepublicproposal-id: uint
calculate-quorumpublicproposal-id: uint
has-quorum-reachedpublicproposal-id: uint
get-winning-sidepublicproposal-id: uint
get-vote-marginpublicproposal-id: uint
is-proposal-active-atpublicproposal-id: uint, height: uint
get-proposal-end-timepublicproposal-id: uint
get-proposal-start-timepublicproposal-id: uint
can-vote-with-powerpublicuser: principal, power: uint
get-average-voting-powerpublic
get-active-proposal-countpublic
is-voter-registeredpublicuser: principal
get-proposal-title-lengthpublicproposal-id: uint
check-proposal-validitypublicproposal-id: uint
get-system-statuspublic
get-protocol-versionpublic
is-emergency-modepublic