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-not-patron (err u102))
(define-constant err-tier-required (err u103))

(define-map patron-events
  uint
  {
    creator: principal,
    event-name: (string-ascii 128),
    event-format: (string-ascii 64),
    scheduled-block: uint,
    min-tier-required: uint,
    max-attendees: uint,
    registered: uint,
    exclusive-content: bool
  })

(define-map patron-tiers
  {creator: principal, patron: principal}
  {tier-level: uint, monthly-pledge: uint, joined-at: uint, active: bool})

(define-map event-registrations
  {event-id: uint, patron: principal}
  {registered-at: uint, attended: bool})

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

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

(define-read-only (get-patron-tier (creator principal) (patron principal))
  (ok (map-get? patron-tiers {creator: creator, patron: patron})))

(define-public (become-patron (creator principal) (tier uint) (pledge uint))
  (begin
    (try! (stx-transfer? pledge tx-sender creator))
    (map-set patron-tiers {creator: creator, patron: tx-sender}
      {tier-level: tier, monthly-pledge: pledge, joined-at: stacks-block-height, active: true})
    (ok true)))

(define-public (create-patron-event (name (string-ascii 128)) (format (string-ascii 64)) (scheduled uint) (min-tier uint) (max uint) (exclusive bool))
  (let ((event-id (var-get next-event-id)))
    (map-set patron-events event-id
      {creator: tx-sender, event-name: name, event-format: format,
       scheduled-block: scheduled, min-tier-required: min-tier, max-attendees: max,
       registered: u0, exclusive-content: exclusive})
    (var-set next-event-id (+ event-id u1))
    (ok event-id)))

(define-public (register-for-event (event-id uint))
  (let ((event (unwrap! (map-get? patron-events event-id) err-not-found))
        (patron-info (unwrap! (map-get? patron-tiers {creator: (get creator event), patron: tx-sender}) err-not-patron)))
    (asserts! (get active patron-info) err-not-patron)
    (asserts! (>= (get tier-level patron-info) (get min-tier-required event)) err-tier-required)
    (asserts! (< (get registered event) (get max-attendees event)) err-not-found)
    (map-set event-registrations {event-id: event-id, patron: tx-sender}
      {registered-at: stacks-block-height, attended: false})
    (ok (map-set patron-events event-id
      (merge event {registered: (+ (get registered event) u1)})))))

(define-public (mark-attendance (event-id uint) (patron principal))
  (let ((event (unwrap! (map-get? patron-events event-id) err-not-found))
        (registration (unwrap! (map-get? event-registrations {event-id: event-id, patron: patron}) err-not-found)))
    (asserts! (is-eq tx-sender (get creator event)) err-owner-only)
    (ok (map-set event-registrations {event-id: event-id, patron: patron}
      (merge registration {attended: true})))))

(define-public (cancel-patronage (creator principal))
  (let ((patron-info (unwrap! (map-get? patron-tiers {creator: creator, patron: tx-sender}) err-not-patron)))
    (ok (map-set patron-tiers {creator: creator, patron: tx-sender}
      (merge patron-info {active: false})))))

Functions (7)

FunctionAccessArgs
get-eventread-onlyevent-id: uint
get-patron-tierread-onlycreator: principal, patron: principal
become-patronpubliccreator: principal, tier: uint, pledge: uint
create-patron-eventpublicname: (string-ascii 128
register-for-eventpublicevent-id: uint
mark-attendancepublicevent-id: uint, patron: principal
cancel-patronagepubliccreator: principal