Source Code

;; Follower List

(define-map followers
  { creator: principal, follower: principal }
  { following: bool }
)

(define-map follower-counts
  principal
  { count: uint }
)

(define-public (follow (creator principal))
  (begin
    (asserts! (is-none (map-get? followers { creator: creator, follower: tx-sender })) (err u409))
    (map-set followers { creator: creator, follower: tx-sender } { following: true })
    (let ((current (default-to { count: u0 } (map-get? follower-counts creator))))
      (map-set follower-counts creator { count: (+ (get count current) u1) })
    )
    (ok true)
  )
)

(define-public (unfollow (creator principal))
  (begin
    (asserts! (is-some (map-get? followers { creator: creator, follower: tx-sender })) (err u404))
    (map-delete followers { creator: creator, follower: tx-sender })
    (let ((current (default-to { count: u1 } (map-get? follower-counts creator))))
      (map-set follower-counts creator { count: (- (get count current) u1) })
    )
    (ok true)
  )
)

(define-read-only (is-following (creator principal) (follower principal))
  (is-some (map-get? followers { creator: creator, follower: follower }))
)

(define-read-only (get-follower-count (creator principal))
  (default-to { count: u0 } (map-get? follower-counts creator))
)

Functions (4)

FunctionAccessArgs
followpubliccreator: principal
unfollowpubliccreator: principal
is-followingread-onlycreator: principal, follower: principal
get-follower-countread-onlycreator: principal