-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathtickets-90stx-raffle-1.clar
177 lines (154 loc) · 6.12 KB
/
tickets-90stx-raffle-1.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
;; Traits
(impl-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait)
(use-trait commission-trait .commission-trait.commission)
;; Define NFT token
(define-non-fungible-token ticket-90stx-raffle-1 uint)
;; Storage
(define-map token-count principal uint)
(define-map market uint {price: uint, commission: principal})
(define-map mint-address bool principal)
;; Constats and Errors
(define-constant CONTRACT-OWNER tx-sender)
(define-constant WALLET_1 'SP1STYSN178Q1D9YGKX4JRR67J8ZMV93G5S134Z8N)
(define-constant WALLET_2 'SP2QM7P3NPYE21TEESBPPVGGA0CD2KYBBPCPFERTG)
(define-constant ERR-SOLD-OUT (err u300))
(define-constant ERR-WRONG-COMMISSION (err u301))
(define-constant ERR-NOT-AUTHORIZED (err u401))
(define-constant ERR-NOT-FOUND (err u404))
(define-constant ERR-METADATA-FROZEN (err u505))
(define-constant ERR-MINT-ALREADY-SET (err u506))
(define-constant ERR-LISTING (err u507))
(define-constant ERR-MINT-LIMIT (err u700))
;; Variables
(define-data-var last-id uint u0)
(define-data-var mint-limit uint u800)
(define-data-var mintpass-sale-active bool false)
(define-data-var metadata-frozen bool false)
(define-data-var base-uri (string-ascii 80) "ipfs://QmYFC5dsz1TTW8we618vwkFZ2AkJSPYookaZKfvuEvBiKD/")
;; Get balance
(define-read-only (get-balance (account principal))
(default-to u0
(map-get? token-count account)))
;; Transfer token to a specified principal
(define-public (transfer (id uint) (sender principal) (recipient principal))
(begin
(asserts! (is-eq tx-sender sender) ERR-NOT-AUTHORIZED)
(asserts! (is-none (map-get? market id)) ERR-LISTING)
(trnsfr id sender recipient)))
;; Get the owner of the specified token ID
(define-read-only (get-owner (id uint))
(ok (nft-get-owner? ticket-90stx-raffle-1 id)))
;; Get the last token ID
(define-read-only (get-last-token-id)
(ok (var-get last-id)))
;; Get the token URI
(define-read-only (get-token-uri (token-id uint))
(ok (some (concat (concat (var-get base-uri) "{id}") ".json"))))
;; Get the mint limit
(define-read-only (get-mint-limit)
(ok (var-get mint-limit)))
;; Change the base uri (only contract owner)
(define-public (set-base-uri (new-base-uri (string-ascii 80)))
(begin
(asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
(asserts! (not (var-get metadata-frozen)) ERR-METADATA-FROZEN)
(var-set base-uri new-base-uri)
(ok true)))
;; Set mint limit (only contract owner)
(define-public (set-mint-limit (limit uint))
(begin
(asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
(asserts! (< (var-get mint-limit) limit) ERR-MINT-LIMIT)
(var-set mint-limit limit)
(ok true)))
;; Freeze metadata
(define-public (freeze-metadata)
(begin
(asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
(var-set metadata-frozen true)
(ok true)))
;; Manage the Mint
(define-private (called-from-mint)
(let ((the-mint
(unwrap! (map-get? mint-address true)
false)))
(is-eq contract-caller the-mint)))
;; Set mint address
(define-public (set-mint-address)
(let ((the-mint (map-get? mint-address true)))
(asserts! (and (is-none the-mint)
(map-insert mint-address true tx-sender))
ERR-MINT-ALREADY-SET)
(ok tx-sender)))
;; Mint new NFT (called from mint contract)
(define-public (mint (new-owner principal))
(let ((next-id (+ u1 (var-get last-id))))
(asserts! (called-from-mint) ERR-NOT-AUTHORIZED)
(asserts! (< (var-get last-id) (var-get mint-limit)) ERR-SOLD-OUT)
(match (nft-mint? ticket-90stx-raffle-1 next-id new-owner)
success
(let
((current-balance (get-balance new-owner)))
(begin
(try! (stx-transfer? u67500000 tx-sender WALLET_1))
(try! (stx-transfer? u22500000 tx-sender WALLET_2))
(var-set last-id next-id)
(map-set token-count
new-owner
(+ current-balance u1)
)
(ok true)))
error (err (* error u10002)))))
;; Burn NFT (called from mint contract)
(define-public (burn (id uint) (owner principal))
(let
((owner-balance (get-balance owner)))
(asserts! (called-from-mint) ERR-NOT-AUTHORIZED)
(try! (nft-burn? ticket-90stx-raffle-1 id owner))
(map-set token-count
owner
(- owner-balance u1))
(ok true)))
;; Non-custodial marketplace
(define-private (trnsfr (id uint) (sender principal) (recipient principal))
(match (nft-transfer? ticket-90stx-raffle-1 id sender recipient)
success
(let
((sender-balance (get-balance sender))
(recipient-balance (get-balance recipient)))
(map-set token-count
sender
(- sender-balance u1))
(map-set token-count
recipient
(+ recipient-balance u1))
(ok success))
error (err error)))
(define-private (is-sender-owner (id uint))
(let ((owner (unwrap! (nft-get-owner? ticket-90stx-raffle-1 id) false)))
(or (is-eq tx-sender owner) (is-eq contract-caller owner))))
(define-read-only (get-listing-in-ustx (id uint))
(map-get? market id))
(define-public (list-in-ustx (id uint) (price uint) (comm <commission-trait>))
(let ((listing {price: price, commission: (contract-of comm)}))
(asserts! (is-sender-owner id) ERR-NOT-AUTHORIZED)
(map-set market id listing)
(print (merge listing {a: "list-in-ustx", id: id}))
(ok true)))
(define-public (unlist-in-ustx (id uint))
(begin
(asserts! (is-sender-owner id) ERR-NOT-AUTHORIZED)
(map-delete market id)
(print {a: "unlist-in-ustx", id: id})
(ok true)))
(define-public (buy-in-ustx (id uint) (comm <commission-trait>))
(let ((owner (unwrap! (nft-get-owner? ticket-90stx-raffle-1 id) ERR-NOT-FOUND))
(listing (unwrap! (map-get? market id) ERR-LISTING))
(price (get price listing)))
(asserts! (is-eq (contract-of comm) (get commission listing)) ERR-WRONG-COMMISSION)
(try! (stx-transfer? price tx-sender owner))
(try! (contract-call? comm pay id price))
(try! (trnsfr id owner tx-sender))
(map-delete market id)
(print {a: "buy-in-ustx", id: id})
(ok true)))