Source Code

;; .derupt-user Contract
(impl-trait 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-user-trait.derupt-user-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 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-core-trait.derupt-core-trait)
(use-trait derupt-user-trait 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-user-trait.derupt-user-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))

;; 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-members") 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-user-trait>)) 
  (contract-call? 'SP3T3JC6V4S94PPB7WFEK17863HPG3EYP6CJ65E7M.derupt-members activate-member contract-address)
)

;; 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))
    )            
    (asserts! (is-eq tx-sender APP_USER) unauthorized-user)
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)     
    (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))
    )      
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)                
    (is-ok (contract-call? core-contract like-message author-principal liked-txid contractId))
    (print { 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)) (core-contract <derupt-core-trait>)) 
  (let 
    (
      (derupt-core-contract (unwrap! (get-derupt-core-contract) notfound))
      (inputed-core-contract (contract-of core-contract))
      (dislike-amount (unwrap! (get-dislike-amount) notfound))
    )
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)      
    (is-ok (contract-call? core-contract dislike-message author-principal disliked-txid cityName))
    (print { 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)) 
      (inputed-core-contract (contract-of core-contract))
    )
      (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)     
      (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 { 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 })
      (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)) 
      (inputed-core-contract (contract-of core-contract))
    )
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) validation-failed) unauthorized-contract)      
    (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 { content: content, publisher: tx-sender, attachment-uri: attachment-uri, thumbnail-uri: thumbnail-uri, reply-to: reply-to, cityName: cityName, alt-origin: alt-origin})
    (ok true)
  )
)

(map-insert member-status APP_USER false)

Functions (15)

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-user-trait>
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