;; 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)
)