Source Code

;; Community Crowdfund Contract

;; Constants
(define-constant GOAL u1000000) ;; 1 STX Goal
(define-constant OWNER tx-sender)

;; State Variables
(define-data-var total-pledged uint u0)
(define-map pledges principal uint)

;; Public: Pledge STX to the project
(define-public (pledge (amount uint))
  (begin
    ;; Transfer STX to contract
    (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
    ;; Update user's pledge amount in the map
    (map-set pledges tx-sender (+ (default-to u0 (map-get? pledges tx-sender)) amount))
    ;; Update total
    (var-set total-pledged (+ (var-get total-pledged) amount))
    (ok "Pledge successful!")
  )
)

;; Public: Refund if the goal hasn't been met (Self-Service)
(define-public (refund)
  (let (
    (user-pledge (default-to u0 (map-get? pledges tx-sender)))
  )
    (asserts! (< (var-get total-pledged) GOAL) (err u405))
    (asserts! (> user-pledge u0) (err u404))
    
    ;; Send money back
    (try! (as-contract (stx-transfer? user-pledge (as-contract tx-sender) tx-sender)))
    
    ;; Reset user's pledge
    (map-delete pledges tx-sender)
    (ok "Refunded!")
  )
)

;; Read-only: Check status
(define-read-only (get-status)
  {
    current-total: (var-get total-pledged),
    target-goal: GOAL,
    is-goal-met: (>= (var-get total-pledged) GOAL)
  }
)

Functions (3)

FunctionAccessArgs
pledgepublicamount: uint
refundpublic
get-statusread-only