Source Code

;; Avatar Marketplace
;; Trade avatar items and accessories

(define-data-var next-item-id uint u1)

(define-map items
  uint
  {
    owner: principal,
    item-type: (string-ascii 32),
    rarity: (string-ascii 16),
    price: uint
  }
)

(define-read-only (get-item (item-id uint))
  (map-get? items item-id)
)

(define-public (mint-item (item-type (string-ascii 32)) (rarity (string-ascii 16)))
  (let ((item-id (var-get next-item-id)))
    (map-set items item-id {
      owner: tx-sender,
      item-type: item-type,
      rarity: rarity,
      price: u0
    })
    (var-set next-item-id (+ item-id u1))
    (ok item-id)
  )
)

(define-public (sell-item (item-id uint) (price uint))
  (let ((item (unwrap! (map-get? items item-id) (err u100))))
    (asserts! (is-eq tx-sender (get owner item)) (err u101))
    (map-set items item-id (merge item { price: price }))
    (ok true)
  )
)

(define-public (buy-item (item-id uint))
  (let ((item (unwrap! (map-get? items item-id) (err u100))))
    (asserts! (> (get price item) u0) (err u102))
    (try! (stx-transfer? (get price item) tx-sender (get owner item)))
    (map-set items item-id (merge item { owner: tx-sender, price: u0 }))
    (ok true)
  )
)

Functions (4)

FunctionAccessArgs
get-itemread-onlyitem-id: uint
mint-itempublicitem-type: (string-ascii 32
sell-itempublicitem-id: uint, price: uint
buy-itempublicitem-id: uint