;; hydra-collective - SIP-009 Non-Fungible Token
;; A standard NFT collection on the Stacks blockchain
(define-non-fungible-token hydra_collective uint)
(define-constant CONTRACT-OWNER tx-sender)
(define-constant MAX-SUPPLY u10000)
(define-constant MINT-PRICE u10000000)
(define-constant ERR-OWNER-ONLY (err u100))
(define-constant ERR-NOT-TOKEN-OWNER (err u101))
(define-constant ERR-SOLD-OUT (err u102))
(define-constant ERR-INVALID-TOKEN (err u103))
(define-constant ERR-WRONG-PRICE (err u104))
(define-data-var last-token-id uint u0)
(define-data-var collection-uri (string-utf8 256) u"ipfs://placeholder/hydra-collective/")
(define-data-var minting-paused bool false)
(define-map token-metadata uint (string-utf8 256))
(define-map token-royalties uint uint)
(define-public (mint (recipient principal))
(let ((token-id (+ (var-get last-token-id) u1)))
(asserts! (not (var-get minting-paused)) (err u105))
(asserts! (<= token-id MAX-SUPPLY) ERR-SOLD-OUT)
(asserts! (is-eq (stx-get-balance tx-sender) MINT-PRICE) ERR-WRONG-PRICE)
(try! (stx-transfer? MINT-PRICE tx-sender CONTRACT-OWNER))
(try! (nft-mint? hydra_collective token-id recipient))
(var-set last-token-id token-id)
(ok token-id)))
(define-public (transfer (token-id uint) (sender principal) (recipient principal))
(begin
(asserts! (is-eq tx-sender sender) ERR-NOT-TOKEN-OWNER)
(asserts! (is-some (nft-get-owner? hydra_collective token-id)) ERR-INVALID-TOKEN)
(try! (nft-transfer? hydra_collective token-id sender recipient))
(ok true)))
(define-public (admin-mint (recipient principal))
(let ((token-id (+ (var-get last-token-id) u1)))
(asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-OWNER-ONLY)
(asserts! (<= token-id MAX-SUPPLY) ERR-SOLD-OUT)
(try! (nft-mint? hydra_collective token-id recipient))
(var-set last-token-id token-id)
(ok token-id)))
(define-public (burn (token-id uint))
(begin
(asserts! (is-eq (some tx-sender) (nft-get-owner? hydra_collective token-id)) ERR-NOT-TOKEN-OWNER)
(nft-burn? hydra_collective token-id tx-sender)))
(define-read-only (get-last-token-id) (ok (var-get last-token-id)))
(define-read-only (get-token-uri (token-id uint)) (ok (some (var-get collection-uri))))
(define-read-only (get-owner (token-id uint)) (ok (nft-get-owner? hydra_collective token-id)))
(define-read-only (get-collection-info)
(ok { name: "hydra-collective", symbol: "HC", max-supply: MAX-SUPPLY, minted: (var-get last-token-id) }))