creator-led-events-marketplaces

SP1V95DB4JK47QVPJBXCEN6MT35JK84CQ4CWS15DQ

Source Code

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-not-found (err u101))
(define-constant err-sold-out (err u102))
(define-constant err-not-verified (err u103))

(define-map creator-led-events
  uint
  {
    creator: principal,
    event-title: (string-ascii 128),
    event-format: (string-ascii 64),
    content-category: (string-ascii 64),
    date: uint,
    total-slots: uint,
    sold: uint,
    tier-prices: (list 5 uint),
    revenue: uint
  })

(define-map verified-creators
  principal
  {
    creator-name: (string-ascii 128),
    platform: (string-ascii 64),
    verified-followers: uint,
    events-hosted: uint
  })

(define-map event-passes
  {event-id: uint, pass-id: uint}
  {holder: principal, tier: uint, purchased-at: uint, redeemed: bool})

(define-data-var next-event-id uint u0)

(define-read-only (get-event (event-id uint))
  (ok (map-get? creator-led-events event-id)))

(define-read-only (get-creator (creator principal))
  (ok (map-get? verified-creators creator)))

(define-public (register-as-creator (name (string-ascii 128)) (platform (string-ascii 64)) (followers uint))
  (begin
    (map-set verified-creators tx-sender
      {creator-name: name, platform: platform, verified-followers: followers, events-hosted: u0})
    (ok true)))

(define-public (create-event (title (string-ascii 128)) (format (string-ascii 64)) (category (string-ascii 64)) (date uint) (slots uint) (prices (list 5 uint)))
  (let ((event-id (var-get next-event-id))
        (creator-info (unwrap! (map-get? verified-creators tx-sender) err-not-verified)))
    (map-set creator-led-events event-id
      {creator: tx-sender, event-title: title, event-format: format, content-category: category,
       date: date, total-slots: slots, sold: u0, tier-prices: prices, revenue: u0})
    (map-set verified-creators tx-sender
      (merge creator-info {events-hosted: (+ (get events-hosted creator-info) u1)}))
    (var-set next-event-id (+ event-id u1))
    (ok event-id)))

(define-public (purchase-pass (event-id uint) (tier uint))
  (let ((event (unwrap! (map-get? creator-led-events event-id) err-not-found))
        (pass-id (get sold event))
        (price (unwrap! (element-at (get tier-prices event) tier) err-not-found)))
    (asserts! (< (get sold event) (get total-slots event)) err-sold-out)
    (try! (stx-transfer? price tx-sender (get creator event)))
    (map-set event-passes {event-id: event-id, pass-id: pass-id}
      {holder: tx-sender, tier: tier, purchased-at: stacks-block-height, redeemed: false})
    (ok (map-set creator-led-events event-id
      (merge event {sold: (+ (get sold event) u1), revenue: (+ (get revenue event) price)})))))

(define-public (redeem-pass (event-id uint) (pass-id uint))
  (let ((pass (unwrap! (map-get? event-passes {event-id: event-id, pass-id: pass-id}) err-not-found)))
    (asserts! (is-eq tx-sender (get holder pass)) err-owner-only)
    (ok (map-set event-passes {event-id: event-id, pass-id: pass-id}
      (merge pass {redeemed: true})))))

Functions (6)

FunctionAccessArgs
get-eventread-onlyevent-id: uint
get-creatorread-onlycreator: principal
register-as-creatorpublicname: (string-ascii 128
create-eventpublictitle: (string-ascii 128
purchase-passpublicevent-id: uint, tier: uint
redeem-passpublicevent-id: uint, pass-id: uint