Source Code

;; .derupt-profile Contract
(impl-trait 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-profile-trait.derupt-profile-trait)
;; Using sip-010-trait for dynamically transfering CityCoins and derupt-core-trait for validation purposes
(use-trait sip-010-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
(use-trait derupt-core-trait 'SP2BZ2YP68CABE7D32HE6308P6C7GMYN2ECJM8A7P.derupt-core-trait.derupt-core-trait)
(use-trait derupt-profile-trait 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-profile-trait.derupt-profile-trait)

;; User Principal
(define-constant APP_USER tx-sender)

;; Error constants
(define-constant unauthorized-user (err 100))
(define-constant notfound (err 101))
(define-constant validation-failed (err 102))
(define-constant unauthorized-contract (err 103))
(define-constant insufficient-balance (err 104))
(define-constant failed-request (err 105))

;; Member activation map
(define-map member-status principal bool)

;; Get Derupt-core contract
(define-private (get-derupt-core-contract)
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-feed get-derupt-core-contract) 
)

(define-private (get-chime-amount)
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-feed get-chime-amount)  
)

(define-private (get-mine-amount)
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-feed get-mine-amount)
)

(define-private (get-like-amount)
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-feed get-like-amount)
)

(define-private (get-dislike-amount)
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-feed get-dislike-amount)
)
;; validatation of core contract
(define-private (validate-core-contract (contract principal))
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-feed validate-core-contract contract)
)

;; Member activation
(define-public (registration-activation (member principal))
  (let 
    (
      (caller (unwrap! (get name (unwrap! (principal-destruct? contract-caller) notfound)) notfound))
    ) 
      (asserts! (is-eq tx-sender member) unauthorized-user)
      (asserts! (is-eq caller "derupt-profiles") unauthorized-user)
      (map-set member-status APP_USER true)
      (ok true)
  )
)

;; Get status via chain change
(define-public (get-activation-status (member principal))
  (begin
    (asserts! (is-eq tx-sender member) unauthorized-user)
    (ok (unwrap! (map-get? member-status APP_USER) notfound))
  )
)

;; Get status via api
(define-read-only (activation-status)
  (ok (unwrap! (map-get? member-status APP_USER) notfound))
)

(define-public (activate-member (contract-address <derupt-profile-trait>)) 
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-profiles activate-member contract-address)
)

;; User Operation Gifting
(define-public (gifting-message (chime-author principal) (amount uint) (via-id (string-utf8 256)) (is-stx bool) (contractId <sip-010-trait>))
  (let 
    (
      (profile-balance-ft (unwrap! (contract-call? contractId get-balance tx-sender) failed-request))
      (profile-balance-stx (stx-get-balance tx-sender))
    ) 
      (if is-stx
        (begin 
          (asserts! (>= profile-balance-stx amount) insufficient-balance)
          (is-ok (stx-transfer? amount tx-sender chime-author))
          (print {event: "gifting-message", chime-author: chime-author, amount: amount, via-id: via-id, is-stx: true, contractId: ""})
          (ok true)
        )
        (begin 
          (asserts! (>= profile-balance-ft amount) insufficient-balance)
          (is-ok (contract-call? contractId transfer amount tx-sender chime-author none))
          (print {event: "gifting-message", chime-author: chime-author, amount: amount, via-id: via-id, is-stx: false, contractId: contractId})
          (ok true)
        )
      )
    )
)

;; User Operation Send Message
(define-public (send-message 
  (content (string-utf8 256)) (attachment-uri (optional (string-utf8 256))) 
  (thumbnail-uri (optional (string-utf8 256))) (reply-to (optional (string-utf8 256))) 
  (cityName (string-ascii 10)) (alt-origin (optional (string-utf8 256)))
  (extras 
    (optional 
      { 
        arg0: (optional (string-utf8 256)),
        arg1: (optional (string-utf8 256)),
        arg2: (optional (string-utf8 256)),
        arg3: (optional (string-utf8 256)),
        arg4: (optional (string-utf8 256)),
        arg5: (optional (string-utf8 256)),
        arg6: (optional (string-utf8 256)),
        arg7: (optional (string-utf8 256)),
        arg8: (optional (string-utf8 256)),
        arg9: (optional (string-utf8 256))
      }
    )
  )
  (core-contract <derupt-core-trait>)
)           
  (let 
    (
      (derupt-core-contract (unwrap! (get-derupt-core-contract) notfound))
      (chime-amount (unwrap! (get-chime-amount) notfound))
      (mine-amount (unwrap! (get-mine-amount) notfound))
      (inputed-core-contract (contract-of core-contract))
      (user-balance (stx-get-balance tx-sender))
    )            
    (asserts! (is-eq tx-sender APP_USER) unauthorized-user)
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)     
    (asserts! (> user-balance (+ chime-amount mine-amount)) insufficient-balance)
    (is-ok (contract-call? core-contract send-message content attachment-uri thumbnail-uri reply-to cityName alt-origin extras))   
    (print { event: "send-message", content: content, attachment-uri: attachment-uri, thumbnail-uri: thumbnail-uri, reply-to: reply-to, cityName: cityName, alt-origin: alt-origin, extras: extras, chime-amount: chime-amount, mine-amount: mine-amount})
    (ok true)
  )
)


;; User Operation Like Message
(define-public (like-message 
  (author-principal principal) (liked-txid (string-utf8 256)) 
  (contractId <sip-010-trait>) (core-contract <derupt-core-trait>))    
  (let 
    (
      (derupt-core-contract (unwrap! (get-derupt-core-contract) notfound))
      (like-amount (unwrap! (get-like-amount) notfound))
      (inputed-core-contract (contract-of core-contract))
      (user-balance (unwrap! (contract-call? contractId get-balance tx-sender) notfound))
    )      
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)
    (asserts! (> user-balance like-amount) insufficient-balance)
    (is-ok (contract-call? core-contract like-message author-principal liked-txid contractId))
    (print { event: "like-message", author-principal: author-principal, liked-txid: liked-txid, like-amount: like-amount })
    (ok true)
  )
)

;; User Operation Dislike Message
(define-public (dislike-message 
  (author-principal principal) (disliked-txid (string-utf8 256)) 
  (cityName (string-ascii 10)) (contractId <sip-010-trait>) (core-contract <derupt-core-trait>)) 
  (let 
    (
      (derupt-core-contract (unwrap! (get-derupt-core-contract) notfound))
      (dislike-amount (unwrap! (get-dislike-amount) notfound))
      (inputed-core-contract (contract-of core-contract))
      (user-balance (unwrap! (contract-call? contractId get-balance tx-sender) notfound))
    )
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)
    (asserts! (> user-balance dislike-amount) insufficient-balance)  
    (is-ok (contract-call? core-contract dislike-message author-principal disliked-txid cityName contractId))
    (print { event: "dislike-message", author-principal: author-principal, disliked-txid: disliked-txid, dislike-amount: dislike-amount })
    (ok true)  
  )           
)

;; User Operation Favorable Reply Message
(define-public (favorable-reply-message 
  (content (string-utf8 256)) (attachment-uri (optional (string-utf8 256))) 
  (thumbnail-uri (optional (string-utf8 256))) (reply-to (optional (string-utf8 256))) 
  (author-principal principal) (liked-txid (string-utf8 256)) 
  (cityName (string-ascii 10)) (alt-origin (optional (string-utf8 256))) 
  (extras 
    (optional 
      { 
        arg0: (optional (string-utf8 256)),
        arg1: (optional (string-utf8 256)),
        arg2: (optional (string-utf8 256)),
        arg3: (optional (string-utf8 256)),
        arg4: (optional (string-utf8 256)),
        arg5: (optional (string-utf8 256)),
        arg6: (optional (string-utf8 256)),
        arg7: (optional (string-utf8 256)),
        arg8: (optional (string-utf8 256)),
        arg9: (optional (string-utf8 256))
      }
    )
  )
  (contractId <sip-010-trait>) 
  (core-contract <derupt-core-trait>))
  (let 
    (
      (derupt-core-contract (unwrap! (get-derupt-core-contract) notfound)) 
      (like-amount (unwrap! (get-like-amount) notfound))
      (chime-amount (unwrap! (get-chime-amount) notfound))
      (mine-amount (unwrap! (get-mine-amount) notfound))
      (inputed-core-contract (contract-of core-contract))
      (user-balance-stx (stx-get-balance tx-sender))
      (user-balance-token (unwrap! (contract-call? contractId get-balance tx-sender) notfound))
    )
      (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)
      (asserts! (> user-balance-stx (+ chime-amount mine-amount)) insufficient-balance)   
      (asserts! (> user-balance-token like-amount) insufficient-balance)  
      (is-ok (contract-call? core-contract favorable-reply-message content tx-sender  attachment-uri thumbnail-uri reply-to liked-txid cityName alt-origin contractId extras))
      (print { event: "favorable-reply-message", content: content, publisher: tx-sender, attachment-uri: attachment-uri, thumbnail-uri: thumbnail-uri, reply-to: reply-to, cityName: cityName, alt-origin: alt-origin, contractId: contractId, extras: extras })
      (ok true)
  )
)

;; User Operation Favorable Reply Message
(define-public (unfavorable-reply-message 
  (content (string-utf8 256)) (attachment-uri (optional (string-utf8 256))) 
  (thumbnail-uri (optional (string-utf8 256))) (reply-to (optional (string-utf8 256))) 
  (author-principal principal) (liked-txid (string-utf8 256)) 
  (cityName (string-ascii 10)) (alt-origin (optional (string-utf8 256))) 
  (extras 
    (optional 
      { 
        arg0: (optional (string-utf8 256)),
        arg1: (optional (string-utf8 256)),
        arg2: (optional (string-utf8 256)),
        arg3: (optional (string-utf8 256)),
        arg4: (optional (string-utf8 256)),
        arg5: (optional (string-utf8 256)),
        arg6: (optional (string-utf8 256)),
        arg7: (optional (string-utf8 256)),
        arg8: (optional (string-utf8 256)),
        arg9: (optional (string-utf8 256))
      }
    )
  )
  (contractId <sip-010-trait>) 
  (core-contract <derupt-core-trait>))
  (let 
    (
      (derupt-core-contract (unwrap! (get-derupt-core-contract) notfound)) 
      (dislike-amount (unwrap! (get-dislike-amount) notfound))
      (chime-amount (unwrap! (get-chime-amount) notfound))
      (mine-amount (unwrap! (get-mine-amount) notfound))
      (inputed-core-contract (contract-of core-contract))
      (user-balance-stx (stx-get-balance tx-sender))
      (user-balance-token (unwrap! (contract-call? contractId get-balance tx-sender) notfound))
    )
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)
    (asserts! (> user-balance-stx (+ chime-amount mine-amount)) insufficient-balance)   
    (asserts! (> user-balance-token dislike-amount) insufficient-balance)      
    (is-ok (contract-call? core-contract unfavorable-reply-message content tx-sender  attachment-uri thumbnail-uri reply-to liked-txid cityName alt-origin contractId extras))
    (print { event: "unfavorable-reply-message", content: content, publisher: tx-sender, attachment-uri: attachment-uri, thumbnail-uri: thumbnail-uri, reply-to: reply-to, cityName: cityName, alt-origin: alt-origin, contractId: contractId, extras: extras })
    (ok true)
  )
)

(map-insert member-status APP_USER false)

Functions (16)

FunctionAccessArgs
get-derupt-core-contractprivate
get-chime-amountprivate
get-mine-amountprivate
get-like-amountprivate
get-dislike-amountprivate
validate-core-contractprivatecontract: principal
registration-activationpublicmember: principal
get-activation-statuspublicmember: principal
activation-statusread-only
activate-memberpubliccontract-address: <derupt-profile-trait>
gifting-messagepublicchime-author: principal, amount: uint, via-id: (string-utf8 256
send-messagepubliccontent: (string-utf8 256
like-messagepublicauthor-principal: principal, liked-txid: (string-utf8 256
dislike-messagepublicauthor-principal: principal, disliked-txid: (string-utf8 256
favorable-reply-messagepubliccontent: (string-utf8 256
unfavorable-reply-messagepubliccontent: (string-utf8 256