Source Code

;; Membership management contract
(define-map members {user: principal, tier: (string-ascii 32)} {active: bool, joined: uint})
(define-data-var total-members uint u0)
(define-map tier-requirements (string-ascii 32) uint)

(define-read-only (is-member (user principal) (tier (string-ascii 32)))
  (match (map-get? members {user: user, tier: tier})
    m (get active m)
    false
  )
)

(define-public (join-tier (tier (string-ascii 32)))
  (begin
    (asserts! (not (is-member tx-sender tier)) (err u1))
    (map-set members {user: tx-sender, tier: tier} {
      active: true,
      joined: burn-block-height
    })
    (ok (var-set total-members (+ (var-get total-members) u1)))
  )
)

(define-public (leave-tier (tier (string-ascii 32)))
  (begin
    (asserts! (is-member tx-sender tier) (err u2))
    (map-delete members {user: tx-sender, tier: tier})
    (ok (var-set total-members (- (var-get total-members) u1)))
  )
)

Functions (3)

FunctionAccessArgs
is-memberread-onlyuser: principal, tier: (string-ascii 32
join-tierpublictier: (string-ascii 32
leave-tierpublictier: (string-ascii 32