Source Code

(define-non-fungible-token sb-badge uint)

(define-data-var badge-id-nonce uint u0)

(define-map badge-soul {badge-id: uint} {nft-contract: principal, nft-token-id: uint})
(define-map badge-uri uint (string-ascii 256))

(define-constant contract-owner tx-sender)
(define-constant collection-uri "ipfs://collection-metadata")
(define-constant err-not-owner (err u100))
(define-constant err-non-transferable (err u101))
(define-constant err-already-bound (err u102))

(define-read-only (get-last-badge-id)
  (ok (var-get badge-id-nonce)))

(define-read-only (get-owner-of (badge-id uint))
  (ok (unwrap! (map-get? badge-soul {badge-id: badge-id}) err-not-owner)))

(define-read-only (get-collection-uri)
  collection-uri)

(define-read-only (get-badge-uri (badge-id uint))
  (ok (unwrap! (map-get? badge-uri badge-id) err-not-owner)))

(define-public (mint (nft-contract principal) (nft-token-id uint) (uri (string-ascii 256)))
  (let ((new-id (+ (var-get badge-id-nonce) u1)))
    (try! (nft-mint? sb-badge new-id tx-sender))
    (map-set badge-soul {badge-id: new-id} {nft-contract: nft-contract, nft-token-id: nft-token-id})
    (map-set badge-uri new-id uri)
    (var-set badge-id-nonce new-id)
    (ok new-id)))

(define-public (transfer (badge-id uint) (sender principal) (recipient principal))
  err-non-transferable)

(define-read-only (get-contract-hash)
  (contract-hash? .sb-badge))

(define-read-only (get-block-time)
  stacks-block-time)

Functions (8)

FunctionAccessArgs
get-last-badge-idread-only
get-owner-ofread-onlybadge-id: uint
get-collection-uriread-only
get-badge-uriread-onlybadge-id: uint
mintpublicnft-contract: principal, nft-token-id: uint, uri: (string-ascii 256
transferpublicbadge-id: uint, sender: principal, recipient: principal
get-contract-hashread-only
get-block-timeread-only