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 (4)

FunctionAccessArgs
join-daopublic
depositpublicamount: uint
is-memberread-onlyuser: principal
get-proposalread-onlyproposal-id: uint