Source Code

(define-constant ERR_NO_AUTHORITY u1001)
(define-constant ERR_TOKEN_NOT_EXIST u1002)
(define-constant ERR_CANNOT_LIKE_SELF u1003)
(define-constant ERR_ALREADY_LIKED u1004)
(define-constant ERR_INVALID_PRICE u1005)

(define-constant LIKE_AWARD_PERCENT u20)
(define-constant LIKE_PRICE u1000000)

(define-map map_like_cnt
  uint
  uint
)

(define-map map_like
  { tid: uint, index: uint }
  uint
)

(define-map map_liked_cnt
  uint
  uint
)

(define-map map_liked
  { tid: uint, index: uint }
  uint
)

(define-map map_note
  { tid: uint, liked_tid: uint }
  bool
)

(define-public (like (tid uint))
  (let
    (
      (sender_tid (unwrap! (contract-call? .laser-eyes-v5 get_id_by_player tx-sender) (err ERR_NO_AUTHORITY)))
      (liked_owner (unwrap! (contract-call? .laser-eyes-v5 get_player_by_id tid) (err ERR_TOKEN_NOT_EXIST)))
      (like_cnt (+ (default-to u0 (map-get? map_like_cnt sender_tid)) u1))
      (liked_cnt (+ (default-to u0 (map-get? map_liked_cnt tid)) u1))
      (liked_award (/ (* LIKE_PRICE LIKE_AWARD_PERCENT) u100))
    )
    (asserts! (is-none (map-get? map_note { tid: sender_tid, liked_tid: tid })) (err ERR_ALREADY_LIKED))
    (asserts! (not (is-eq liked_owner tx-sender)) (err ERR_CANNOT_LIKE_SELF))
    (try! (stx-transfer? liked_award tx-sender liked_owner))
    (try! (contract-call? .laser-eyes-v5 deduct (- LIKE_PRICE liked_award)))
    (map-set map_like_cnt sender_tid like_cnt)
    (map-set map_like { tid: sender_tid, index: like_cnt} (+ tid (* u10000 block-height)))
    (map-set map_liked_cnt tid liked_cnt)
    (map-set map_liked { tid: tid, index: liked_cnt } (+ sender_tid (* u10000 block-height)))
    (map-set map_note { tid: sender_tid, liked_tid: tid } true)
    (contract-call? .laser-eyes-v5 set_ud tid u8 u5 liked_cnt)
  )
)

(define-read-only (has_like (tid uint) (liked_tid uint))
  (default-to false (map-get? map_note { tid: tid, liked_tid: liked_tid }))
)

(define-read-only (get_like_count (tid uint))
  (default-to u0 (map-get? map_like_cnt tid))
)

(define-read-only (get_like_list (tid uint) (index_list (list 25 uint)))
  (get r (fold loop_l index_list { tid: tid , r: (list) }))
)

(define-read-only (get_like_data (tid uint) (index_list (list 25 uint)))
  {
    total: (default-to u0 (map-get? map_like_cnt tid)),
    likes: (get r (fold loop_l index_list { tid: tid , r: (list) }))
  }
)

(define-private (loop_l (i uint) (ud { tid: uint, r: (list 25 uint) }))
  (match (map-get? map_like { tid: (get tid ud), index: i}) val
    (merge ud {
      r: (unwrap-panic (as-max-len? (append (get r ud) val) u25))
    })
    ud
  )
)

(define-read-only (get_liked_count (tid uint))
  (default-to u0 (map-get? map_liked_cnt tid))
)

(define-read-only (get_liked_list (tid uint) (index_list (list 25 uint)))
  (get r (fold loop_ld index_list { tid: tid , r: (list) }))
)

(define-read-only (get_liked_data (tid uint) (index_list (list 25 uint)))
  {
    total: (default-to u0 (map-get? map_liked_cnt tid)),
    likes: (get r (fold loop_ld index_list { tid: tid , r: (list) }))
  }
)

(define-private (loop_ld (i uint) (ud { tid: uint, r: (list 25 uint) }))
  (match (map-get? map_liked { tid: (get tid ud), index: i}) val
    (merge ud {
      r: (unwrap-panic (as-max-len? (append (get r ud) val) u25))
    })
    ud
  )
)

Functions (8)

FunctionAccessArgs
likepublictid: uint
has_likeread-onlytid: uint, liked_tid: uint
get_like_countread-onlytid: uint
get_like_listread-onlytid: uint, index_list: (list 25 uint
get_like_dataread-onlytid: uint, index_list: (list 25 uint
get_liked_countread-onlytid: uint
get_liked_listread-onlytid: uint, index_list: (list 25 uint
get_liked_dataread-onlytid: uint, index_list: (list 25 uint