Source Code

;; title: Btc-DAOFund
;; version:
;; summary:
;; description:

;; token definitions  
(define-fungible-token sbtc-token)

;; constants
(define-constant err-not-member (err u101))
(define-constant err-proposal-not-found (err u102))
(define-constant err-voting-ended (err u103))
(define-constant err-insufficient-funds (err u104))

;; data vars
(define-data-var proposal-nonce uint u0)

;; data maps
(define-map dao-members principal bool)
(define-map proposals
  uint
  {
    creator: principal,
    amount: uint,
    recipient: principal,
    yes-votes: uint,
    no-votes: uint,
    end-block: uint,
    executed: bool
  }
)
(define-map member-votes { proposal-id: uint, voter: principal } bool)

;; public functions
(define-public (join-dao)
  (begin
    (map-set dao-members tx-sender true)
    (ok true)
  )
)

(define-public (deposit (amount uint))
  (begin
    (asserts! (is-member tx-sender) err-not-member)
    (ft-mint? sbtc-token amount tx-sender)
  )
)

(define-public (create-proposal (amount uint) (recipient principal))
  (let ((proposal-id (+ (var-get proposal-nonce) u1)))
    (asserts! (is-member tx-sender) err-not-member)
    (map-set proposals proposal-id {
      creator: tx-sender,
      amount: amount,
      recipient: recipient,
      yes-votes: u0,
      no-votes: u0,
      end-block: (+ stacks-block-height u144),
      executed: false
    })
    (var-set proposal-nonce proposal-id)
    (ok proposal-id)
  )
)

(define-public (vote (proposal-id uint) (vote-yes bool))
  (let ((proposal (unwrap! (map-get? proposals proposal-id) err-proposal-not-found)))
    (asserts! (is-member tx-sender) err-not-member)
    (asserts! (< stacks-block-height (get end-block proposal)) err-voting-ended)
    (asserts! (is-none (map-get? member-votes { proposal-id: proposal-id, voter: tx-sender })) (err u105))
    
    (map-set member-votes { proposal-id: proposal-id, voter: tx-sender } true)
    
    (if vote-yes
      (map-set proposals proposal-id (merge proposal { yes-votes: (+ (get yes-votes proposal) u1) }))
      (map-set proposals proposal-id (merge proposal { no-votes: (+ (get no-votes proposal) u1) }))
    )
    (ok true)
  )
)

;; read only functions
(define-read-only (is-member (user principal))
  (default-to false (map-get? dao-members user))
)


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

Functions (6)

FunctionAccessArgs
join-daopublic
depositpublicamount: uint
create-proposalpublicamount: uint, recipient: principal
votepublicproposal-id: uint, vote-yes: bool
is-memberread-onlyuser: principal
get-proposalread-onlyproposal-id: uint