From 1364260c6eaa1f1249be3df684c909e4fcb51500 Mon Sep 17 00:00:00 2001 From: Syed Ghufran Hassan Date: Wed, 25 Feb 2026 19:48:28 +0500 Subject: [PATCH] feat: StackSusu NFT v7.1 - Batch mint, metadata update, burn, and events - Introduced batch minting functionality for efficiently distributing membership badges to multiple members in a single transaction (`mint-member-badges-batch`). - Added admin-only NFT metadata update function (`update-nft-metadata`) to allow corrections or updates to NFT metadata without transferring ownership. - Implemented NFT burn functionality (`burn-nft`) to allow owners to destroy their NFTs or revoke outdated achievements. - Added event emission for key actions: mint, transfer, and burn, enabling easier front-end tracking and analytics. - Maintained backward compatibility with single NFT minting, transfers, and reputation badge minting. - Updated NFT counter tracking and owner mappings to support new batch and burn operations. --- contracts/stacksusu-nft-v7.clar | 64 +++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/contracts/stacksusu-nft-v7.clar b/contracts/stacksusu-nft-v7.clar index 898b696..384fb3f 100644 --- a/contracts/stacksusu-nft-v7.clar +++ b/contracts/stacksusu-nft-v7.clar @@ -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) @@ -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 @@ -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 ( @@ -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) ) ) @@ -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 @@ -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 ;; ============================================