-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy patharties.clar
168 lines (142 loc) · 5.63 KB
/
arties.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
;; arties
(impl-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait)
;; (impl-trait .nft-trait.nft-trait)
;; Non Fungible Token, using sip-009
(define-non-fungible-token arties uint)
;; Constants
(define-constant err-no-more-nfts u300)
(define-constant err-invalid-user u500)
(define-constant mint-limit u11111)
(define-constant commission-address tx-sender)
;; Internal variables
(define-map discounts {user: principal} {discount: uint})
(define-data-var last-id uint u0)
(define-data-var commission uint u500)
(define-data-var total-price uint u98000000)
(define-data-var second-artist-address principal 'SP2966ET85MQR187H8EA4S4YMVCFR2MKZ2F40JQ5) ;; ST (2.5%)
(define-data-var third-artist-address principal 'SP352D2TJFYYMGAZ234D7ETHR4WVH0H9D54348TQY) ;; SV (10%)
(define-data-var artist-address principal 'SPPB55WCQ53904NCG71XF8YNG8D86JAJJEF6B1BV) ;; OAS (rest)
(define-data-var ipfs-root (string-ascii 80) "ipfs://ipfs/QmWhLJ7D3xEGKUpDymxCWZRUj2VCZxaBC8Yfx6kZ5hLjBL/")
;; private functions
(define-private (mint (new-owner principal))
(let ((next-id (+ u1 (var-get last-id)))
(count (var-get last-id)))
(asserts! (< count mint-limit) (err err-no-more-nfts))
(let
((discounted-price (match (map-get? discounts {user: new-owner})
discount-data
(/ (* (var-get total-price) (get discount discount-data)) u10000)
(var-get total-price)))
(total-commission (/ (* discounted-price (var-get commission)) u10000))
(total-second-artist (/ (* discounted-price u250) u10000))
(total-third-artist (/ (* discounted-price u1000) u10000))
(total-artist (- discounted-price (+ total-commission total-second-artist total-third-artist))))
(if (is-eq tx-sender (var-get artist-address))
(mint-helper new-owner next-id)
(if (is-eq tx-sender commission-address)
(begin
(mint-helper new-owner next-id))
(begin
(try! (stx-transfer? total-commission tx-sender commission-address))
(try! (stx-transfer? total-artist tx-sender (var-get artist-address)))
(try! (stx-transfer? total-second-artist tx-sender (var-get second-artist-address)))
(try! (stx-transfer? total-third-artist tx-sender (var-get third-artist-address)))
(mint-helper new-owner next-id))))
)
)
)
(define-private (mint-helper (new-owner principal) (next-id uint))
(match (nft-mint? arties next-id new-owner)
success
(begin
(var-set last-id next-id)
(ok true))
error (err error)))
;; public functions
(define-public (claim)
(mint tx-sender))
(define-public (claim-five)
(begin
(try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender))
(ok true)
)
)
(define-public (claim-ten)
(begin
(try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (ok true)
)
)
(define-public (claim-for (user principal))
(if (is-eq tx-sender commission-address)
(mint user)
(err err-invalid-user))
)
(define-public (claim-five-for (user principal))
(if (is-eq tx-sender commission-address)
(begin
(try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user))
(ok true)
)
(err err-invalid-user))
)
(define-public (claim-ten-for (user principal))
(if (is-eq tx-sender commission-address)
(begin
(try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user))
(ok true)
)
(err err-invalid-user))
)
(define-public (set-artist-address (address principal))
(if (is-eq tx-sender commission-address)
(begin
(var-set artist-address address)
(ok true)
)
(err err-invalid-user)))
(define-public (set-second-artist-address (address principal))
(if (is-eq tx-sender commission-address)
(begin
(var-set second-artist-address address)
(ok true)
)
(err err-invalid-user)))
(define-public (set-third-artist-address (address principal))
(if (is-eq tx-sender commission-address)
(begin
(var-set third-artist-address address)
(ok true)
)
(err err-invalid-user)))
(define-public (set-price (price uint))
(if (is-eq tx-sender commission-address)
(begin
(var-set total-price price)
(ok true)
)
(err err-invalid-user)))
(define-public (set-discount (user principal) (basis uint))
(if (is-eq tx-sender commission-address)
(ok (map-set discounts {user: user} {discount: basis}))
(err err-invalid-user)))
(define-public (set-ipfs-root (new-ipfs-root (string-ascii 80)))
(if (is-eq tx-sender commission-address)
(begin
(var-set ipfs-root new-ipfs-root)
(ok true)
)
(err err-invalid-user)))
(define-public (transfer (token-id uint) (sender principal) (recipient principal))
(if (and
(is-eq tx-sender sender))
(match (nft-transfer? arties token-id sender recipient)
success (ok success)
error (err error))
(err err-invalid-user)))
;; read-only functions
(define-read-only (get-owner (token-id uint))
(ok (nft-get-owner? arties token-id)))
(define-read-only (get-last-token-id)
(ok (var-get last-id)))
(define-read-only (get-token-uri (token-id uint))
(ok (some (concat (concat (var-get ipfs-root) "$TOKEN_ID") ".json"))))