Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 61 additions & 3 deletions contracts/stacksusu-nft-v7.clar
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
;; StackSusu NFT v7
;; Membership badges and achievements
;; StackSusu NFT v7.1
;; Membership badges and achievements with batch mint, burn, metadata update, and events

(define-constant CONTRACT-OWNER tx-sender)

Expand Down Expand Up @@ -43,6 +43,20 @@
bool
)

;; ============================================
;; Events
;; ============================================
(define-public (emit-mint-event (owner principal) (token-id uint))
(print {event: "mint", owner: owner, token-id: token-id})
)

(define-public (emit-transfer-event (from principal) (to principal) (token-id uint))
(print {event: "transfer", from: from, to: to, token-id: token-id})
)

(define-public (emit-burn-event (owner principal) (token-id uint))
(print {event: "burn", owner: owner, token-id: token-id})
)

;; ============================================
;; Mint Functions
Expand Down Expand Up @@ -73,10 +87,26 @@
(map-set minted-badges { owner: member, nft-type: TYPE-MEMBER-BADGE } true)

(var-set nft-counter token-id)
(emit-mint-event member token-id)
(ok token-id)
)
)

;; Batch minting for multiple members
(define-public (mint-member-badges-batch (members (list 10 principal)))
(begin
(fold
(lambda (member _)
(try! (mint-member-badge member))
u0
)
u0
members
)
(ok true)
)
)

(define-public (mint-circle-completion (member principal) (circle-id uint))
(let
(
Expand All @@ -96,6 +126,7 @@
(unwrap! (as-max-len? (append (default-to (list) (map-get? owner-nfts member)) token-id) u50) ERR-NOT-AUTHORIZED))

(var-set nft-counter token-id)
(emit-mint-event member token-id)
(ok token-id)
)
)
Expand Down Expand Up @@ -123,10 +154,37 @@
(unwrap! (as-max-len? (append (default-to (list) (map-get? owner-nfts member)) token-id) u50) ERR-NOT-AUTHORIZED))

(var-set nft-counter token-id)
(emit-mint-event member token-id)
(ok token-id)
)
)

;; ============================================
;; Metadata Update (Admin Only)
;; ============================================
(define-public (update-nft-metadata (token-id uint) (metadata (string-ascii 200)))
(let ((nft (unwrap! (map-get? nfts token-id) ERR-NOT-FOUND)))
(asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
(map-set nfts token-id (merge nft { metadata: metadata }))
(ok true)
)
)

;; ============================================
;; Burn NFT
;; ============================================
(define-public (burn-nft (token-id uint))
(let ((nft (unwrap! (map-get? nfts token-id) ERR-NOT-FOUND)))
(asserts! (is-eq tx-sender (get owner nft)) ERR-NOT-AUTHORIZED)
;; Remove from owner-nfts
(map-set owner-nfts (get owner nft)
(unwrap! (as-max-len? (filter (lambda (id) (not (is-eq id token-id))) (default-to (list) (map-get? owner-nfts (get owner nft)))) u50) ERR-NOT-AUTHORIZED))
;; Remove from nfts map
(map-delete nfts token-id)
(emit-burn-event (get owner nft) token-id)
(ok true)
)
)

;; ============================================
;; Transfer
Expand All @@ -146,11 +204,11 @@
(map-set owner-nfts recipient
(unwrap! (as-max-len? (append (default-to (list) (map-get? owner-nfts recipient)) token-id) u50) ERR-NOT-AUTHORIZED))

(emit-transfer-event tx-sender recipient token-id)
(ok true)
)
)


;; ============================================
;; Read Functions
;; ============================================
Expand Down