Source Code

;; crowdfund.clar
;; A campaign where users pledge funds. Funds are released only if goal is met by deadline.

(define-constant campaign-goal u10000)
(define-constant campaign-deadline u100) ;; Block height
(define-data-var pledged-amount uint u0)
(define-map pledges principal uint)

(define-public (pledge (amount uint))
    (begin
        (asserts! (> amount u0) (err u103))
        (asserts! (< block-height campaign-deadline) (err u100)) ;; ERR_CAMPAIGN_ENDED
        (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
        (map-set pledges tx-sender (+ (default-to u0 (map-get? pledges tx-sender)) amount))
        (var-set pledged-amount (+ (var-get pledged-amount) amount))
        (ok true)
    )
)

(define-public (claim-funds)
    (begin
        (asserts! (>= (var-get pledged-amount) campaign-goal) (err u101)) ;; ERR_GOAL_NOT_MET
        ;; In reality, check if sender is owner
        (try! (as-contract (stx-transfer? (var-get pledged-amount) tx-sender tx-sender)))
        (ok true)
    )
)

(define-public (refund)
    (let
        (
            (amount (unwrap! (map-get? pledges tx-sender) (err u102))) ;; ERR_NO_PLEDGE
        )
        (asserts! (> block-height campaign-deadline) (err u103)) ;; ERR_CAMPAIGN_ACTIVE
        (asserts! (< (var-get pledged-amount) campaign-goal) (err u104)) ;; ERR_GOAL_MET
        (try! (as-contract (stx-transfer? amount tx-sender tx-sender)))
        (map-delete pledges tx-sender)
        (ok true)
    )
)

Functions (3)

FunctionAccessArgs
pledgepublicamount: uint
claim-fundspublic
refundpublic