2
2
;; version: 1.0.0
3
3
;; summary: A contract that allows specified principals to withdraw STX from the contract with given rules.
4
4
5
- ;; traits
6
- ;;
7
-
8
- ;; token definitions
9
- ;;
10
-
11
5
;; constants
12
6
;;
13
7
(define-constant DEPLOYER tx-sender )
22
16
(define-data-var withdrawalPeriod uint u144 ) ;; 144 Bitcoin blocks, ~1 day
23
17
(define-data-var withdrawalAmount uint u10000000 ) ;; 10,000,000 microSTX, or 10 STX
24
18
(define-data-var lastWithdrawalBlock uint u0 )
19
+ (define-data-var accountHolder principal SELF)
25
20
26
- ;; data maps
27
- ;;
28
- (define-map Users principal bool )
29
21
30
22
;; public functions
31
23
;;
32
24
25
+ (define-public (set-account-holder (new principal ))
26
+ (begin
27
+ (try! (is-deployer ))
28
+ (asserts! (not (is-eq (var-get accountHolder ) new)) ERR_INVALID)
29
+ (ok (var-set accountHolder new))
30
+ )
31
+ )
32
+
33
33
(define-public (set-withdrawal-period (period uint ))
34
34
(begin
35
35
(try! (is-deployer ))
54
54
)
55
55
)
56
56
57
- (define-public (set-user-list (userList (list 100 {user : principal , enabled : bool })))
58
- (begin
59
- (try! (is-deployer ))
60
- (asserts! (> (len userList) u0 ) ERR_INVALID)
61
- (ok (map set-user-iter userList))
62
- )
63
- )
64
-
65
57
(define-public (deposit-stx (amount uint ))
66
58
(begin
67
59
(print {
77
69
)
78
70
79
71
(define-public (withdraw-stx )
80
- (let
81
- (
82
- ;; verify user is known in the map (some not none)
83
- (requestor contract-caller )
84
- (userEnabled (unwrap! (map-get? Users contract-caller ) ERR_UNAUTHORIZED))
85
- )
72
+ (begin
86
73
;; verify user is enabled in the map
87
- (asserts! userEnabled ERR_UNAUTHORIZED )
74
+ (try! ( is-account-holder ) )
88
75
;; verify user is not withdrawing too soon
89
76
(asserts! (>= block-height (+ (var-get lastWithdrawalBlock ) (var-get withdrawalPeriod ))) ERR_TOO_SOON)
90
77
;; update last withdrawal block
95
82
payload : {
96
83
amount : (var-get withdrawalAmount ),
97
84
caller : contract-caller ,
98
- recipient : contract-caller
85
+ recipient : ( var-get accountHolder )
99
86
}
100
87
})
101
- (as-contract (stx-transfer? (var-get withdrawalAmount ) SELF requestor ))
88
+ (as-contract (stx-transfer? (var-get withdrawalAmount ) SELF ( var-get accountHolder ) ))
102
89
)
103
90
)
104
91
129
116
}
130
117
)
131
118
132
- (define-read-only (get-user (user principal ))
133
- (map-get? Users user)
134
- )
135
-
136
119
(define-read-only (get-standard-caller )
137
120
(let ((d (unwrap-panic (principal-destruct? contract-caller ))))
138
121
(unwrap-panic (principal-construct? (get version d) (get hash-bytes d)))
145
128
(ok (asserts! (is-eq DEPLOYER (get-standard-caller )) ERR_UNAUTHORIZED))
146
129
)
147
130
148
- (define-private (set-user-iter (item {user : principal , enabled : bool }))
149
- (begin
150
- (print {
151
- notification : " set-user" ,
152
- payload : {
153
- caller : contract-caller ,
154
- enabled : (get enabled item),
155
- user : (get user item),
156
- }
157
- })
158
- (map-set Users (get user item) (get enabled item))
159
- (ok (get enabled item))
160
- )
161
- )
131
+ (define-private (is-account-holder )
132
+ (ok (asserts! (is-eq (var-get accountHolder ) (get-standard-caller )) ERR_UNAUTHORIZED))
133
+ )
0 commit comments