Branch data Line data Source code
1 : : ;; BigMarket DAO
2 : : ;; Synopsis:
3 : : ;; bigmarket-dao is the core of the dao framework.
4 : : ;; Description:
5 : : ;; Valid extensions must be registered here. The DAO is bootstrapped
6 : : ;; by calling construct with a bootstrap proposal.
7 : :
8 : : (use-trait extension-trait 'SP3JP0N1ZXGASRJ0F7QAHWFPGTVK9T2XNXDB908Z.extension-trait.extension-trait)
9 : : (use-trait proposal-trait 'SP3JP0N1ZXGASRJ0F7QAHWFPGTVK9T2XNXDB908Z.proposal-trait.proposal-trait)
10 : :
11 : : (define-constant err-unauthorised (err u1000))
12 : : (define-constant err-already-executed (err u1001))
13 : : (define-constant err-invalid-extension (err u1002))
14 : :
15 : : (define-data-var executive principal tx-sender)
16 : : (define-map executed-proposals principal uint)
17 : : (define-map extensions principal bool)
18 : :
19 : : ;; --- Authorisation check
20 : :
21 : 300 : (define-private (is-self-or-extension)
22 [ - ][ + + ]: 704 : (ok (asserts! (or (is-eq tx-sender (as-contract tx-sender)) (is-extension contract-caller)) err-unauthorised))
23 : : )
24 : :
25 : : ;; --- Extensions
26 : :
27 : 277 : (define-read-only (is-extension (extension principal))
28 : 808 : (default-to false (map-get? extensions extension))
29 : : )
30 : :
31 : 0 : (define-public (set-extension (extension principal) (enabled bool))
32 : 0 : (begin
33 : 0 : (try! (is-self-or-extension))
34 : 0 : (print {event: "extension", extension: extension, enabled: enabled})
35 : 0 : (ok (map-set extensions extension enabled))
36 : : )
37 : : )
38 : :
39 : 300 : (define-private (set-extensions-iter (item {extension: principal, enabled: bool}))
40 : 4211 : (begin
41 : 4211 : (print {event: "extension", extension: (get extension item), enabled: (get enabled item)})
42 : 4211 : (map-set extensions (get extension item) (get enabled item))
43 : : )
44 : : )
45 : :
46 : 300 : (define-public (set-extensions (extension-list (list 200 {extension: principal, enabled: bool})))
47 : 310 : (begin
48 : 310 : (try! (is-self-or-extension))
49 : 310 : (ok (map set-extensions-iter extension-list))
50 : : )
51 : : )
52 : :
53 : : ;; --- Proposals
54 : :
55 : 54 : (define-read-only (executed-at (proposal <proposal-trait>))
56 : 79 : (map-get? executed-proposals (contract-of proposal))
57 : : )
58 : :
59 : 300 : (define-public (execute (proposal <proposal-trait>) (sender principal))
60 : 394 : (begin
61 : 394 : (try! (is-self-or-extension))
62 [ + ]: 394 : (asserts! (map-insert executed-proposals (contract-of proposal) stacks-block-height) err-already-executed)
63 : 370 : (print {event: "execute", proposal: proposal})
64 : 370 : (as-contract (contract-call? proposal execute sender))
65 : : )
66 : : )
67 : :
68 : : ;; --- Bootstrap
69 : :
70 : 300 : (define-public (construct (proposal <proposal-trait>))
71 : 415 : (let ((sender tx-sender))
72 [ + ]: 415 : (asserts! (is-eq sender (var-get executive)) err-unauthorised)
73 : 300 : (var-set executive (as-contract tx-sender))
74 : 300 : (as-contract (execute proposal sender))
75 : : )
76 : : )
77 : :
78 : : ;; --- Extension requests
79 : :
80 : 0 : (define-public (request-extension-callback (extension <extension-trait>) (memo (buff 34)))
81 : 0 : (let ((sender tx-sender))
82 [ - ]: 0 : (asserts! (is-extension contract-caller) err-invalid-extension)
83 [ - ]: 0 : (asserts! (is-eq contract-caller (contract-of extension)) err-invalid-extension)
84 : 0 : (as-contract (contract-call? extension callback sender memo))
85 : : )
86 : : )
|