-
Notifications
You must be signed in to change notification settings - Fork 2
/
multisig-vault.clar
56 lines (47 loc) · 1.99 KB
/
multisig-vault.clar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
;; multisig-vault
;; A simple multisig vault that allows members to vote on who should receive the STX contents.
(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-already-locked (err u101))
(define-constant err-more-votes-than-members-required (err u102))
(define-constant err-not-a-member (err u103))
(define-constant err-votes-required-not-met (err u104))
(define-data-var members (list 100 principal) (list))
(define-data-var votes-required uint u0)
(define-map votes {member: principal, recipient: principal} {decision: bool})
(define-public (start (new-members (list 100 principal)) (new-votes-required uint))
(begin
(asserts! (is-eq tx-sender contract-owner) err-owner-only)
(asserts! (is-eq (len (var-get members)) u0) err-already-locked)
(asserts! (>= (len new-members) new-votes-required) err-more-votes-than-members-required)
(var-set members new-members)
(var-set votes-required new-votes-required)
(ok true)
)
)
(define-public (vote (recipient principal) (decision bool))
(begin
(asserts! (is-some (index-of (var-get members) tx-sender)) err-not-a-member)
(ok (map-set votes {member: tx-sender, recipient: recipient} {decision: decision}))
)
)
(define-read-only (get-vote (member principal) (recipient principal))
(default-to false (get decision (map-get? votes {member: member, recipient: tx-sender})))
)
(define-private (tally (member principal) (accumulator uint))
(if (get-vote member tx-sender) (+ accumulator u1) accumulator)
)
(define-read-only (tally-votes)
(fold tally (var-get members) u0)
)
;; Temporary function until tx.transferSTX() works in test.
(define-public (deposit (amount uint))
(stx-transfer? amount tx-sender (as-contract tx-sender))
)
(define-public (withdraw)
(let ((recipient tx-sender) (total-votes (tally-votes)))
(asserts! (>= total-votes (var-get votes-required)) err-votes-required-not-met)
(try! (as-contract (stx-transfer? (stx-get-balance tx-sender) tx-sender recipient)))
(ok total-votes)
)
)