Source Code

(define-non-fungible-token cultural-historical-token uint)

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

(define-map token-attributes uint 
  {catalog-level: (string-ascii 64), 
   creation-date: (string-ascii 64), 
   creator-name: (string-ascii 128), 
   asset-type: (string-ascii 64),
   materials: (string-ascii 256), 
   dimensions: (string-ascii 128), 
   provenance: (string-ascii 512), 
   copyright: (string-ascii 256)})

(define-map token-extended uint 
  {full-text: (string-ascii 1024), 
   exhibitions: (string-ascii 512), 
   documents: (string-ascii 512), 
   urls: (string-ascii 256)})

(define-constant contract-owner tx-sender)
(define-constant err-not-owner (err u100))

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

(define-read-only (get-owner (token-id uint))
  (ok (unwrap! (nft-get-owner? cultural-historical-token token-id) err-not-owner)))

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

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

(define-public (mint 
  (recipient principal)
  (catalog-level (string-ascii 64))
  (creation-date (string-ascii 64))
  (creator-name (string-ascii 128))
  (asset-type (string-ascii 64))
  (materials (string-ascii 256))
  (dimensions (string-ascii 128))
  (provenance (string-ascii 512))
  (copyright (string-ascii 256)))
  (let ((new-id (+ (var-get token-id-nonce) u1)))
    (try! (nft-mint? cultural-historical-token new-id recipient))
    (map-set token-attributes new-id 
      {catalog-level: catalog-level, creation-date: creation-date, creator-name: creator-name, 
       asset-type: asset-type, materials: materials, dimensions: dimensions, 
       provenance: provenance, copyright: copyright})
    (var-set token-id-nonce new-id)
    (ok new-id)))

(define-public (set-extended 
  (token-id uint)
  (full-text (string-ascii 1024))
  (exhibitions (string-ascii 512))
  (documents (string-ascii 512))
  (urls (string-ascii 256)))
  (let ((owner (unwrap! (nft-get-owner? cultural-historical-token token-id) err-not-owner)))
    (asserts! (is-eq tx-sender owner) err-not-owner)
    (map-set token-extended token-id 
      {full-text: full-text, exhibitions: exhibitions, documents: documents, urls: urls})
    (ok true)))

(define-public (transfer (token-id uint) (sender principal) (recipient principal))
  (begin
    (asserts! (is-eq tx-sender sender) err-not-owner)
    (try! (nft-transfer? cultural-historical-token token-id sender recipient))
    (ok true)))

(define-read-only (get-contract-hash)
  (contract-hash? .cultural-historical-token))

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

Functions (9)

FunctionAccessArgs
get-last-token-idread-only
get-ownerread-onlytoken-id: uint
get-attributesread-onlytoken-id: uint
get-extendedread-onlytoken-id: uint
mintpublicrecipient: principal, catalog-level: (string-ascii 64
set-extendedpublictoken-id: uint, full-text: (string-ascii 1024
transferpublictoken-id: uint, sender: principal, recipient: principal
get-contract-hashread-only
get-block-timeread-only