/
bitzombies.clar
201 lines (171 loc) · 5.88 KB
/
bitzombies.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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
(impl-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait)
;; Non Fungible Token, using sip-009
(define-non-fungible-token bitzombies uint)
;; Storage
(define-map tokens-count
principal
uint)
;; Constants
(define-constant ERR-ALL-MINTED u101)
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-AUTHORIZED u401)
(define-constant ERR-MINT-NOT-ENABLED (err u1004))
(define-constant ERR-NOT-MINT-TIME (err u1001))
(define-constant MINT-LIMIT u15)
;; Internal variables
(define-data-var last-id uint u0)
(define-data-var uri-prefix (string-ascii 256) "")
(define-data-var cost-per-mint uint u1000000)
(define-data-var commission uint u1500)
(define-data-var payout uint u0)
(define-data-var target-block uint u37295)
(define-data-var ipfs-full-metadata (string-ascii 107) "ipfs://ipfs/bafybeia2lrpf6mbytha4bwv4ziqnaszygwnyowxsmtfu2m5wzry74tk7ly/bitzombies/bitzombies_metadata.json")
(define-data-var ipfs-root (string-ascii 94) "ipfs://ipfs/bafybeia2lrpf6mbytha4bwv4ziqnaszygwnyowxsmtfu2m5wzry74tk7ly/bitzombies/bitzombies_")
(define-data-var artist-address principal 'SP4DCNFNJRWKR5R8VK28V7043BT6Q2TWS9T9V30P)
(define-data-var minting-enabled bool true)
(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)
)
)
;; Gets the amount of tokens owned by the specified address.
(define-private (balance-of (account principal))
(default-to u0 (map-get? tokens-count account)))
;; Internal - Register token
(define-private (mint (new-owner principal))
(let (
(next-id (+ u1 (var-get last-id)))
(count (var-get last-id))
(target (var-get target-block))
)
(asserts! (is-eq (var-get minting-enabled) true) ERR-MINT-NOT-ENABLED)
(asserts! (< count MINT-LIMIT) (err ERR-ALL-MINTED))
(asserts! (>= block-height target) ERR-NOT-MINT-TIME)
(match (stx-transfer? (var-get cost-per-mint) tx-sender (as-contract tx-sender))
success (begin
(try! (nft-mint? bitzombies next-id new-owner))
(var-set last-id next-id)
(try! (as-contract (stx-transfer? (/ (* (var-get cost-per-mint) (var-get commission)) u10000) (as-contract tx-sender) CONTRACT-OWNER)))
(try! (as-contract (stx-transfer? (- (var-get cost-per-mint) (/ (* (var-get cost-per-mint) (var-get commission)) u10000)) (as-contract tx-sender) (var-get artist-address))))
(ok next-id)
)
error (err error)
)
)
)
;; Public functions
;; Allows contract owner to change mint price
(define-public (set-cost-per-mint (value uint))
(if (is-eq tx-sender CONTRACT-OWNER)
(ok (var-set cost-per-mint value))
(err ERR-NOT-AUTHORIZED)
)
)
;; Allows contract owner to change mint price
(define-public (set-commission (value uint))
(if (is-eq tx-sender CONTRACT-OWNER)
(ok (var-set commission value))
(err ERR-NOT-AUTHORIZED)
)
)
;; Allows contract owner to change artist address if need be
(define-public (set-artist-address (value principal))
(if (is-eq tx-sender CONTRACT-OWNER)
(ok (var-set artist-address value))
(err ERR-NOT-AUTHORIZED)
)
)
;; Allows contract owner to change artist address if need be
(define-public (set-mint-time (value uint))
(if (is-eq tx-sender CONTRACT-OWNER)
(ok (var-set target-block value))
(err ERR-NOT-AUTHORIZED)
)
)
;; Turn minting on
(define-public (set-minting-enabled)
(if (is-eq tx-sender CONTRACT-OWNER)
(ok (var-set minting-enabled true))
(err ERR-NOT-AUTHORIZED)
)
)
;; Turn minting off
(define-public (set-minting-disabled)
(if (is-eq tx-sender CONTRACT-OWNER)
(ok (var-set minting-enabled false))
(err ERR-NOT-AUTHORIZED)
)
)
;; Transfers tokens to a specified principal.
(define-public (transfer (token-id uint) (sender principal) (recipient principal))
(if (and
(is-eq tx-sender sender))
;; Make sure to replace MY-OWN-NFT
(match (nft-transfer? bitzombies token-id sender recipient)
success (ok success)
error (err error))
(err u500)))
;; Transfers stx from contract to contract owner
(define-public (transfer-stx (address principal) (amount uint))
(if (is-eq tx-sender CONTRACT-OWNER)
(as-contract (stx-transfer? amount (as-contract tx-sender) address))
(err ERR-NOT-AUTHORIZED)
)
)
;; Gets the owner of the specified token ID.
(define-read-only (get-owner (token-id uint))
(ok (nft-get-owner? bitzombies token-id)))
;; Gets mint price
(define-read-only (get-mint-price)
(ok (var-get cost-per-mint)))
;; Gets commission
(define-read-only (get-commission)
(ok (/ (* (var-get cost-per-mint) (var-get commission)) u10000))
)
;; Gets artist address
(define-read-only (get-artist-address)
(ok (var-get artist-address)))
;; Gets the owner of the specified token ID.
(define-read-only (get-last-token-id)
(ok (var-get last-id)))
(define-read-only (get-contract-metadata)
(ok (some (var-get ipfs-full-metadata)))
)
(define-read-only (get-target-block)
(ok (var-get target-block))
)
(define-read-only (get-current-block)
(ok block-height)
)
(define-read-only (get-token-uri (token-id uint))
(if (< token-id u5001)
(ok (some (concat (concat (var-get ipfs-root) (unwrap-panic (contract-call? .conversion lookup token-id))) "_metadata.json")))
(ok (some (concat (concat (var-get ipfs-root) (unwrap-panic (contract-call? .conversion-v2 lookup (- token-id u5001)))) "_metadata.json")))
)
)
(begin
(try! (mint (var-get artist-address)))
(ok true)
)