Source Code

;; arties

(impl-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait)
;; (impl-trait .nft-trait.nft-trait)

;; Non Fungible Token, using sip-009
(define-non-fungible-token arties uint)

;; Constants
(define-constant err-no-more-nfts u300)
(define-constant err-invalid-user u500)

(define-constant mint-limit u11111)
(define-constant commission-address tx-sender)

;; Internal variables
(define-map discounts {user: principal} {discount: uint})
(define-data-var last-id uint u0)
(define-data-var commission uint u500)
(define-data-var total-price uint u98000000)

(define-data-var second-artist-address principal 'SP2966ET85MQR187H8EA4S4YMVCFR2MKZ2F40JQ5) ;; ST (2.5%)
(define-data-var third-artist-address principal 'SP352D2TJFYYMGAZ234D7ETHR4WVH0H9D54348TQY) ;; SV (10%)
(define-data-var artist-address principal 'SPPB55WCQ53904NCG71XF8YNG8D86JAJJEF6B1BV) ;; OAS (rest)

(define-data-var ipfs-root (string-ascii 80) "ipfs://ipfs/QmWhLJ7D3xEGKUpDymxCWZRUj2VCZxaBC8Yfx6kZ5hLjBL/")

;; private functions
(define-private (mint (new-owner principal))
  (let ((next-id (+ u1 (var-get last-id)))  
        (count (var-get last-id)))
      (asserts! (< count mint-limit) (err err-no-more-nfts))
    (let
       ((discounted-price (match (map-get? discounts {user: new-owner})
                            discount-data 
                            (/ (* (var-get total-price) (get discount discount-data)) u10000)
                            (var-get total-price))) 
        (total-commission (/ (* discounted-price (var-get commission)) u10000))
        (total-second-artist (/ (* discounted-price u250) u10000))
        (total-third-artist (/ (* discounted-price u1000) u10000))
        (total-artist (- discounted-price (+ total-commission total-second-artist total-third-artist))))
      (if (is-eq tx-sender (var-get artist-address))
        (mint-helper new-owner next-id)
        (if (is-eq tx-sender commission-address)
          (begin
            (mint-helper new-owner next-id))
          (begin
            (try! (stx-transfer? total-commission tx-sender commission-address))
            (try! (stx-transfer? total-artist tx-sender (var-get artist-address)))
            (try! (stx-transfer? total-second-artist tx-sender (var-get second-artist-address)))
            (try! (stx-transfer? total-third-artist tx-sender (var-get third-artist-address)))
            (mint-helper new-owner next-id))))
    )
  )
)

(define-private (mint-helper (new-owner principal) (next-id uint))
    (match (nft-mint? arties next-id new-owner)
            success
              (begin
                (var-set last-id next-id)
                (ok true))
            error (err error)))

;; public functions
(define-public (claim)
  (mint tx-sender))

(define-public (claim-five)
 (begin 
  (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender))
  (ok true)
 )
)

(define-public (claim-ten)
 (begin 
  (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (try! (mint tx-sender)) (ok true)
 )
)

(define-public (claim-for (user principal))
  (if (is-eq tx-sender commission-address)
    (mint user)
    (err err-invalid-user))
)

(define-public (claim-five-for (user principal))
  (if (is-eq tx-sender commission-address)
    (begin 
      (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user))
      (ok true)
    )
    (err err-invalid-user))
)

(define-public (claim-ten-for (user principal))
  (if (is-eq tx-sender commission-address)
    (begin 
      (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user)) (try! (mint user))
      (ok true)
    )
    (err err-invalid-user))
)

(define-public (set-artist-address (address principal))
  (if (is-eq tx-sender commission-address)
    (begin 
      (var-set artist-address address)
      (ok true)
    )
    (err err-invalid-user)))

(define-public (set-second-artist-address (address principal))
  (if (is-eq tx-sender commission-address)
    (begin 
      (var-set second-artist-address address)
      (ok true)
    )
    (err err-invalid-user)))

(define-public (set-third-artist-address (address principal))
  (if (is-eq tx-sender commission-address)
    (begin 
      (var-set third-artist-address address)
      (ok true)
    )
    (err err-invalid-user)))

(define-public (set-price (price uint))
  (if (is-eq tx-sender commission-address)
    (begin 
      (var-set total-price price)
      (ok true)
    )
    (err err-invalid-user)))

(define-public (set-discount (user principal) (basis uint))
  (if (is-eq tx-sender commission-address)
    (ok (map-set discounts {user: user} {discount: basis}))
    (err err-invalid-user)))

(define-public (set-ipfs-root (new-ipfs-root (string-ascii 80)))
  (if (is-eq tx-sender commission-address)
    (begin 
      (var-set ipfs-root new-ipfs-root)
      (ok true)
    )
    (err err-invalid-user)))

(define-public (transfer (token-id uint) (sender principal) (recipient principal))
  (if (and
        (is-eq tx-sender sender))
      (match (nft-transfer? arties token-id sender recipient)
        success (ok success)
        error (err error))
      (err err-invalid-user)))

;; read-only functions
(define-read-only (get-owner (token-id uint))
  (ok (nft-get-owner? arties token-id)))

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

(define-read-only (get-token-uri (token-id uint))
    (ok (some (concat (concat (var-get ipfs-root) "$TOKEN_ID") ".json"))))

Functions (18)

FunctionAccessArgs
mintprivatenew-owner: principal
mint-helperprivatenew-owner: principal, next-id: uint
claimpublic
claim-fivepublic
claim-tenpublic
claim-forpublicuser: principal
claim-five-forpublicuser: principal
claim-ten-forpublicuser: principal
set-artist-addresspublicaddress: principal
set-second-artist-addresspublicaddress: principal
set-third-artist-addresspublicaddress: principal
set-pricepublicprice: uint
set-discountpublicuser: principal, basis: uint
set-ipfs-rootpublicnew-ipfs-root: (string-ascii 80
transferpublictoken-id: uint, sender: principal, recipient: principal
get-ownerread-onlytoken-id: uint
get-last-token-idread-only
get-token-uriread-onlytoken-id: uint