Source Code

;; omega-nft - SIP-009 Non-Fungible Token
;; A standard NFT collection on the Stacks blockchain


(define-non-fungible-token omega_nft 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/omega-nft/")
(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? omega_nft 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? omega_nft token-id)) ERR-INVALID-TOKEN)
    (try! (nft-transfer? omega_nft 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? omega_nft 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? omega_nft token-id)) ERR-NOT-TOKEN-OWNER)
    (nft-burn? omega_nft 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? omega_nft token-id)))
(define-read-only (get-collection-info)
  (ok { name: "omega-nft", symbol: "ON", max-supply: MAX-SUPPLY, minted: (var-get last-token-id) }))

Functions (8)

FunctionAccessArgs
mintpublicrecipient: principal
transferpublictoken-id: uint, sender: principal, recipient: principal
admin-mintpublicrecipient: principal
burnpublictoken-id: uint
get-last-token-idread-only
get-token-uriread-onlytoken-id: uint
get-ownerread-onlytoken-id: uint
get-collection-inforead-only