Source Code

;; DUV is the LUV Placeholder Test Token
;; For Derupt Alpha Testing on Mainnet

(define-constant contract-creator tx-sender)

(define-constant ERR_INVALID_CONTENT u0)
(define-constant ERR_CANNOT_LIKE_NON_EXISTENT_CONTENT u1)

(define-constant DUV_TREASURY 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M)

;; Data maps and vars
(define-data-var content-index uint u0)

(define-read-only (get-content-index)
  (ok (var-get content-index))
)

(define-map like-state
  { content-index: uint }
  { likes: uint }
)

(define-map publisher-state
  { content-index: uint }
  { publisher: principal }
)

(define-read-only (get-like-count (id uint))
  (ok (default-to { likes: u0 } (map-get? like-state { content-index: id })))
)

(define-read-only (get-message-publisher (id uint))
  (ok (unwrap-panic (get publisher (map-get? publisher-state { content-index: id }))))
)

;; Private functions
(define-private (increment-content-index)
  (begin
    (var-set content-index (+ (var-get content-index) u1))
    (ok (var-get content-index))
  )
)

(define-private (get-balance (recipient principal))
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.duv get-balance recipient)
)

;; Public functions
(define-public (send-message (content (string-utf8 140) ) (attachment-uri (optional (string-utf8 256))))
  (let ((id (unwrap! (increment-content-index) (err u0))))
    (print { content: content, publisher: tx-sender, index: id, attachment-uri: attachment-uri })
    (map-set like-state
      { content-index: id }
      { likes: u0 }
    )
    (map-set publisher-state
      { content-index: id }
      { publisher: tx-sender }
    )
    (transfer-duv u1 DUV_TREASURY)
  )
)

(define-public (like-message (id uint))
  (begin
    (asserts! (>= (var-get content-index) id) (err ERR_CANNOT_LIKE_NON_EXISTENT_CONTENT))
    (map-set like-state
      { content-index: id }
      { likes: (+ u1 (get likes (unwrap! (get-like-count id) (err u0)))) }
    )
    (transfer-duv u1 (unwrap-panic (get-message-publisher id)))
  )
)

;; Token contract interactions
(define-public (transfer-duv (amount uint) (recipient principal))
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.duv transfer amount tx-sender recipient none)
)

Functions (7)

FunctionAccessArgs
get-content-indexread-only
get-like-countread-onlyid: uint
get-message-publisherread-onlyid: uint
increment-content-indexprivate
get-balanceprivaterecipient: principal
like-messagepublicid: uint
transfer-duvpublicamount: uint, recipient: principal