/
diverse-salmon-antlion.clar
99 lines (79 loc) · 2.45 KB
/
diverse-salmon-antlion.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
;; TRAITS
(impl-trait 'SPX9XMC02T56N9PRXV4AM9TS88MMQ6A1Z3375MHD.extension-trait.extension-trait)
(use-trait proposal-trait 'SPX9XMC02T56N9PRXV4AM9TS88MMQ6A1Z3375MHD.proposal-trait.proposal-trait)
;; CONSTANTS
(define-constant ERR_UNAUTHORIZED (err u3000))
(define-constant ERR_NOT_APPROVER (err u3001))
;; DATA MAPS AND VARS
;; signals required for an action
(define-data-var signalsRequired uint u1)
;; approver information
(define-map Approvers
principal ;; address
bool ;; status
)
(define-map ApproverSignals
{
proposal: principal,
approver: principal
}
bool ;; yes/no
)
(define-map SignalCount
principal ;; proposal
uint ;; signals
)
;; Authorization Check
(define-public (is-dao-or-extension)
(ok (asserts!
(or
(is-eq tx-sender 'SPFP7J5S351CGCPBS2BX06HRF0WF3BYKQEZCGBW5.wooden-purple-turtle)
(contract-call? 'SPFP7J5S351CGCPBS2BX06HRF0WF3BYKQEZCGBW5.wooden-purple-turtle is-extension contract-caller))
ERR_UNAUTHORIZED
))
)
;; Internal DAO functions
(define-public (set-approver (who principal) (status bool))
(begin
(try! (is-dao-or-extension))
(ok (map-set Approvers who status))
)
)
(define-public (set-signals-required (newRequirement uint))
(begin
(try! (is-dao-or-extension))
(ok (var-set signalsRequired newRequirement))
)
)
;; Public Functions
(define-read-only (is-approver (who principal))
(default-to false (map-get? Approvers who))
)
(define-read-only (has-signaled (proposal principal) (who principal))
(default-to false (map-get? ApproverSignals {proposal: proposal, approver: who}))
)
(define-read-only (get-signals-required)
(var-get signalsRequired)
)
(define-read-only (get-signals (proposal principal))
(default-to u0 (map-get? SignalCount proposal))
)
(define-public (direct-execute (proposal <proposal-trait>))
(let
(
(proposalPrincipal (contract-of proposal))
(signals (+ (get-signals proposalPrincipal) (if (has-signaled proposalPrincipal tx-sender) u0 u1)))
)
(asserts! (is-approver tx-sender) ERR_NOT_APPROVER)
(and (>= signals (var-get signalsRequired))
(try! (contract-call? 'SPFP7J5S351CGCPBS2BX06HRF0WF3BYKQEZCGBW5.wooden-purple-turtle execute proposal tx-sender))
)
(map-set ApproverSignals {proposal: proposalPrincipal, approver: tx-sender} true)
(map-set SignalCount proposalPrincipal signals)
(ok signals)
)
)
;; Extension callback
(define-public (callback (sender principal) (memo (buff 34)))
(ok true)
)