# .derupt-profile

{% hint style="info" %}
**General:**

* A distinct **.derupt-profile** contract should be deployed and activated per user.&#x20;
* **.derupt-profile** contract calls the **.derupt-core-yyyymmdd** contract for application logic purposes
  {% endhint %}

{% hint style="warning" %}
**Warning:**

* **users should deploy a** `.derupt-profile`contract in app to interact with core features.
* **users should call**`.derupt-profile`
* **users should not call**`.derupt-core-yyyymmdd` *(nor logging contracts)*
  {% endhint %}

{% hint style="info" %}
**Key Functions Process Transactions Overview:**

What happens in a process depends on the function the user is calling.&#x20;

* **gift-message:** `transfer` of a variable sip-010 token is called during this process.
* **send-message**: `mine` cryptocash is called during this process.&#x20;
* **like-message**: `transfer` cryptocash is called during this process.
* **dislike-message**: `stack` cryptocash is called during this process.
* **favorable-reply-message**: `mine` & `transfer` cryptocash is called during this process.
* **unfavorable-reply-message**: `mine` & `stack` cryptocash is called during this process. &#x20;
  {% endhint %}

The 6 key functions and arguments in a users  `.derupt-profile` contract:

<details>

<summary><mark style="color:orange;">gift-message</mark></summary>

<mark style="color:orange;">Broadcast Send Message to the Stacks Blockchain</mark>

**Data Flow of the Function:**\
1\)`.derupt-profile`\
2\)`.derupt-core-yyyymmdd (&.derupt-ext if defined)` \
3\)`.derupt-gifts`

**Arguments:**

* ...

**Responses:**

* Successful Stacks Transaction
* Unsuccessful Stacks Transaction

</details>

<details>

<summary><mark style="color:orange;">send-message</mark> </summary>

<mark style="color:orange;">Broadcast Send Message to the Stacks Blockchain</mark>

**Data Flow of the Function:**\
1\)`.derupt-profile`\
2\)`.derupt-core-yyyymmdd (&.derupt-ext if defined)` \
3\)`.derupt-feed (&.derupt-miners)`

**Arguments:**

* ...

**Responses:**

* Successful Stacks Transaction
* Unsuccessful Stacks Transaction

</details>

<details>

<summary><mark style="color:orange;">like-message</mark></summary>

<mark style="color:orange;">Broadcast Like Message to Stacks Blockchain</mark>

**Data Flow of the Function:**\
1\) `.derupt-profile`\
2\) `.derupt-core-yyyymmdd (&.derupt-ext if defined)` \
3\) `.derupt-sentiments`

**Arguments:**

* ...

**Responses:**

* Successful Stacks Transaction
* Unsuccessful Stacks Transaction

</details>

<details>

<summary><mark style="color:orange;">dislike-message</mark></summary>

<mark style="color:orange;">Broadcast Dislike Message to Stacks Blockchain</mark>

**Data Flow of the Function:**\
1\) `.derupt-profile`\
2\) `.derupt-core-yyyymmdd (&.derupt-ext if defined)` \
3\) `.derupt-sentiments (&.derupt-stackers)`

**Arguments:**

* ...

**Responses:**

* Successful Stacks Transaction
* Unsuccessful Stacks Transaction

</details>

<details>

<summary><mark style="color:orange;">favorable-reply-message</mark></summary>

<mark style="color:orange;">Broadcast Favorable Reply Message to Stacks Blockchain</mark>

**Data Flow of the Function:**\
1\) `.derupt-profile`\
2\) `.derupt-core-yyyymmdd (&.derupt-ext if defined)` \
3\) `.derupt-feed (&.derupt-sentiments &.derupt-miners)`

**Arguments:**

* ...

**Responses:**

* Successful Stacks Transaction
* Unsuccessful Stacks Transaction

</details>

<details>

<summary><mark style="color:orange;">unfavorable-reply-message</mark></summary>

<mark style="color:orange;">Broadcast Unfavorable Reply Message to Stacks Blockchain</mark>

**Data Flow of the Function:**\
1\) `.derupt-profile`\
2\) `.derupt-core-yyyymmdd (&.derupt-ext if defined)` \
3\) `.derupt-feed (&.derupt-sentiments &.derupt-miners &.derupt-stackers)`

**Arguments:**

* ...

**Responses:**

* Successful Stacks Transaction
* Unsuccessful Stacks Transaction

</details>

{% hint style="info" %}
Work In Progress
{% endhint %}

```
;; title: derupt-profile
;; version: 1.3.1
;; summary: Profile Contract
;; description: Each user should deploy one of these contracts, and call these functions to interface with the Derupt protocol.

(impl-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-profile-trait.derupt-profile-trait)

(use-trait sip-009-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.sip-009-trait-nft-standard.sip-009-trait)
(use-trait sip-010-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.sip-010-trait-ft-standard.sip-010-trait)
(use-trait sip-013-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.sip-013-trait-sft-standard.sip-013-trait)

(use-trait derupt-core-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-core-trait.derupt-core-trait)
(use-trait derupt-profile-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-profile-trait.derupt-profile-trait)
(use-trait derupt-ext-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-ext-trait.derupt-ext)

(use-trait cryptocash-token-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.cryptocash-token-trait.cryptocash-token)
(use-trait cryptocash-core-trait 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.cryptocash-core-trait.cryptocash-core)

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

;; Error constants
(define-constant ERR-UNAUTHORIZED (err u100))
(define-constant ERR-NOTFOUND (err u101))
(define-constant ERR-VALIDATION-FAILED (err u102))
(define-constant ERR-INSUFFICIENT-BALANCE (err u104))
(define-constant ERR-UNAUTHORIZED-CONTRACT (err u105))
(define-constant ERR-INVALID-VALUE (err u106))

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

(define-data-var loadoutUri (optional (string-utf8 256)) (some u"default"))

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

(define-private (get-chime-stx-amount)
  (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-feed get-chime-stx-amount)  
  ;; (contract-call? 'MAINNETADDRESS.derupt-feed get-chime-stx-amount)  
)

(define-private (get-chime-ft-amount)
  (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-feed get-chime-ft-amount)  
  ;; (contract-call? 'MAINNETADDRESS.derupt-feed get-chime-ft-amount)  
)

(define-read-only (get-loadout-uri)
  (ok (var-get loadoutUri))
)

;; User Operation Loadout - set URI to new value
(define-public (set-loadout-uri (newUri (optional (string-utf8 256))))
  (begin
    (asserts! (is-eq tx-sender APP_USER) ERR-UNAUTHORIZED)
    (asserts! (is-some newUri) ERR-INVALID-VALUE)
    (ok (var-set loadoutUri newUri))
  )
)

;; validatation of core contract (Derupt Core)
(define-private (validate-core-contract (contract principal))
  (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-feed validate-core-contract contract)
  ;; (contract-call? 'MAINNETADDRESS.derupt-feed validate-core-contract contract)
)

;; Member activation
(define-public (registration-activation (member principal))
  (let 
    (
      (caller (unwrap! (get name (unwrap! (principal-destruct? contract-caller) ERR-NOTFOUND)) ERR-NOTFOUND))
    ) 
      (asserts! (is-eq tx-sender member) ERR-UNAUTHORIZED)
      (asserts! (is-eq caller "derupt-profiles") ERR-UNAUTHORIZED)
      (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) ERR-UNAUTHORIZED)
    (ok (unwrap! (map-get? member-status APP_USER) ERR-NOTFOUND))
  )
)

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

;; this contract-address should be this users specific .derupt-profile contract address
(define-public (activate-member (contract-address <derupt-profile-trait>)) 
  (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-profiles activate-member contract-address)
  ;; (contract-call? 'MAINNETADDRESS.derupt-profiles activate-member contract-address)
)

;; User Operation Gifting
(define-public (gift-message (chime-author principal) (amount uint) 
  (via-id (string-utf8 256)) (is-stx bool) (contractId <sip-010-trait>)
  (core-contract <derupt-core-trait>) (memo (optional (buff 34)))
  (ext (optional <derupt-ext-trait>))
  (extras (optional (list 10 
    {
      stringutf8: (optional (string-utf8 256)), 
      stringascii: (optional (string-ascii 256)), 
      uint: (optional uint), 
      int: (optional int), 
      principal: (optional principal), 
      bool: (optional bool),
      buff: (optional (buff 34)),
      proxy: (optional (buff 2048)),
      cryptocash-token-contract: (optional <cryptocash-token-trait>),
      cryptocash-core-contract: (optional <cryptocash-core-trait>),
      sip-009-contract: (optional <sip-009-trait>),
      sip-010-contract: (optional <sip-010-trait>),
      sip-013-contract: (optional <sip-013-trait>)
    }))
  )
)
  (let 
    (
      (profile-balance-ft (unwrap! (contract-call? contractId get-balance tx-sender) ERR-INSUFFICIENT-BALANCE))
      (profile-balance-stx (stx-get-balance tx-sender))
      (inputed-core-contract (contract-of core-contract)) 
    ) 
      (if is-stx
        (begin 
          (asserts! (>= profile-balance-stx amount) ERR-INSUFFICIENT-BALANCE)
          (asserts! (unwrap! (validate-core-contract inputed-core-contract) ERR-VALIDATION-FAILED) ERR-UNAUTHORIZED-CONTRACT)
          (if (is-some memo) 
            (try! (stx-transfer-memo? amount tx-sender chime-author (unwrap! memo ERR-NOTFOUND)))
            (try! (stx-transfer? amount tx-sender chime-author))
          )          
          (try! (contract-call? core-contract gift-message tx-sender chime-author is-stx contractId amount memo ext extras))
          (print {event: "gift-message", chime-author: chime-author, amount: amount, via-id: via-id, is-stx: true, memo: memo, ext: ext})
          (ok true)
        )
        (begin 
          (asserts! (>= profile-balance-ft amount) ERR-INSUFFICIENT-BALANCE)
          (asserts! (unwrap! (validate-core-contract inputed-core-contract) ERR-VALIDATION-FAILED) ERR-UNAUTHORIZED-CONTRACT)
          (try! (contract-call? contractId transfer amount tx-sender chime-author memo))
          (try! (contract-call? core-contract gift-message tx-sender chime-author is-stx contractId amount memo ext extras))
          (print {event: "gift-message", chime-author: chime-author, amount: amount, via-id: via-id, is-stx: false, contractId: contractId, memo: memo, ext: ext})
          (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))) 
  (mine-amounts (list 200 uint))
  (alt-origin (string-utf8 256))
  (ext (optional <derupt-ext-trait>))
  (extras (optional (list 10 
    {
      stringutf8: (optional (string-utf8 256)), 
      stringascii: (optional (string-ascii 256)), 
      uint: (optional uint), 
      int: (optional int), 
      principal: (optional principal), 
      bool: (optional bool),
      buff: (optional (buff 34)),
      proxy: (optional (buff 2048)),
      cryptocash-token-contract: (optional <cryptocash-token-trait>),
      cryptocash-core-contract: (optional <cryptocash-core-trait>),
      sip-009-contract: (optional <sip-009-trait>),
      sip-010-contract: (optional <sip-010-trait>),
      sip-013-contract: (optional <sip-013-trait>)
    }))
  )
  (core-contract <derupt-core-trait>)
  (cryptocash-core-contract <cryptocash-core-trait>)
)           
  (let 
    (
      (tpi-values (unwrap! (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      ;;(tpi-values (unwrap! (contract-call? 'MAINNETADDRESS.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      (pay-dev (unwrap! (get pay-dev tpi-values) ERR-NOTFOUND)) 
      (pay-gaia (unwrap! (get pay-gaia tpi-values) ERR-NOTFOUND)) 
      (dev-stx-amount (unwrap! (get dev-stx-amount tpi-values) ERR-NOTFOUND)) 
      (gaia-stx-amount (unwrap! (get gaia-stx-amount tpi-values) ERR-NOTFOUND))      
      (dev-principal  (get dev-principal tpi-values)) 
      (gaia-principal  (unwrap! (get gaia-principal tpi-values) ERR-NOTFOUND))
      (derupt-core-contract (unwrap! (get-derupt-core-contract) ERR-NOTFOUND))
      (chime-stx-total (unwrap! (get-chime-stx-amount) ERR-NOTFOUND))
      (dev-stx-total dev-stx-amount) 
      (gaia-stx-total gaia-stx-amount) 
      (inputed-core-contract (contract-of core-contract))      
    )            
    (asserts! (is-eq tx-sender APP_USER) ERR-UNAUTHORIZED)
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) ERR-VALIDATION-FAILED) ERR-UNAUTHORIZED-CONTRACT)
    (try! (contract-call? core-contract send-message content attachment-uri thumbnail-uri reply-to mine-amounts alt-origin ext extras pay-dev pay-gaia dev-stx-amount gaia-stx-amount dev-principal (some gaia-principal) cryptocash-core-contract))   
    (print 
      { 
        event: "send-message", content: content, attachment-uri: attachment-uri, thumbnail-uri: thumbnail-uri, reply-to: reply-to, 
        alt-origin: alt-origin, ext: ext, 
        mine-total: (fold + mine-amounts u0), mine-amounts: mine-amounts,
        chime-stx-total: chime-stx-total,
        dev-stx-total: dev-stx-total, gaia-stx-total: gaia-stx-total,
        dev-principal: dev-principal, gaia-principal: gaia-principal
      }
    )
    (ok true)
  )
)

;; User Operation Like Message
(define-public (like-message 
    (author-principal principal) 
    (liked-txid (string-utf8 256)) 
    (cryptocash-token-contract <cryptocash-token-trait>)
    (core-contract <derupt-core-trait>)
    (like-ft-amount uint)
    (alt-origin (string-utf8 256))
    (ext (optional <derupt-ext-trait>))
    (extras (optional (list 10 
      {
        stringutf8: (optional (string-utf8 256)), 
        stringascii: (optional (string-ascii 256)), 
        uint: (optional uint), 
        int: (optional int), 
        principal: (optional principal), 
        bool: (optional bool),
        buff: (optional (buff 34)),
        proxy: (optional (buff 2048)),
        cryptocash-token-contract: (optional <cryptocash-token-trait>),
        cryptocash-core-contract: (optional <cryptocash-core-trait>),
        sip-009-contract: (optional <sip-009-trait>),
        sip-010-contract: (optional <sip-010-trait>),
        sip-013-contract: (optional <sip-013-trait>)
      }))
    )
  )    
  (let 
    (
      (tpi-values (unwrap! (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      ;; (tpi-values (unwrap! (contract-call? 'MAINNETADDRESS.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      (pay-dev (unwrap! (get pay-dev tpi-values) ERR-NOTFOUND)) 
      (pay-gaia (unwrap! (get pay-gaia tpi-values) ERR-NOTFOUND))       
      (dev-ft-amount (unwrap! (get dev-ft-amount tpi-values) ERR-NOTFOUND)) 
      (gaia-ft-amount (unwrap! (get gaia-ft-amount tpi-values) ERR-NOTFOUND))
      (dev-principal  (get dev-principal tpi-values)) 
      (gaia-principal  (unwrap! (get gaia-principal tpi-values) ERR-NOTFOUND))
      (derupt-core-contract (unwrap! (get-derupt-core-contract) ERR-NOTFOUND))
      (like-ft-total like-ft-amount)
      (chime-ft-total (unwrap! (get-chime-ft-amount) ERR-NOTFOUND))
      (dev-ft-total dev-ft-amount)
      (gaia-ft-total gaia-ft-amount)
      (inputed-core-contract (contract-of core-contract))
    )
    (asserts! (is-eq tx-sender APP_USER) ERR-UNAUTHORIZED)      
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) ERR-VALIDATION-FAILED) ERR-UNAUTHORIZED-CONTRACT)
    (try! (contract-call? core-contract like-message author-principal liked-txid cryptocash-token-contract like-ft-amount pay-dev pay-gaia dev-ft-amount gaia-ft-amount dev-principal (some gaia-principal) ext extras))
    (print 
      { 
        event: "like-message", author-principal: author-principal, liked-txid: liked-txid, 
        cryptocash-token-contract: cryptocash-token-contract,
        like-ft-total: like-ft-total,
        chime-ft-total: chime-ft-total,
        alt-origin: alt-origin,
        ext: ext,
        pay-dev: pay-dev,
        pay-gaia: pay-gaia,
        dev-ft-total: dev-ft-total, 
        gaia-ft-total: gaia-ft-total,
        dev-principal: dev-principal, 
        gaia-principal: gaia-principal
      }
    )
    (ok true)
  )
)

;; User Operation Dislike Message
(define-public (dislike-message 
    (author-principal principal) 
    (disliked-txid (string-utf8 256)) 
    (cryptocash-token-contract <cryptocash-token-trait>)
    (cryptocash-core-contract <cryptocash-core-trait>)
    (core-contract <derupt-core-trait>)
    (dislike-ft-amount uint)
    (lockPeriod uint)
    (alt-origin (string-utf8 256))
    (ext (optional <derupt-ext-trait>))
    (extras (optional (list 10 
      {
        stringutf8: (optional (string-utf8 256)), 
        stringascii: (optional (string-ascii 256)), 
        uint: (optional uint), 
        int: (optional int), 
        principal: (optional principal), 
        bool: (optional bool),
        buff: (optional (buff 34)),
        proxy: (optional (buff 2048)),
        cryptocash-token-contract: (optional <cryptocash-token-trait>),
        cryptocash-core-contract: (optional <cryptocash-core-trait>),
        sip-009-contract: (optional <sip-009-trait>),
        sip-010-contract: (optional <sip-010-trait>),
        sip-013-contract: (optional <sip-013-trait>)
      }))
    )
  ) 
  (let 
    (
      (tpi-values (unwrap! (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      ;; (tpi-values (unwrap! (contract-call? 'MAINNETADDRESS.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      (pay-dev (unwrap! (get pay-dev tpi-values) ERR-NOTFOUND)) 
      (pay-gaia (unwrap! (get pay-gaia tpi-values) ERR-NOTFOUND))
      (dev-ft-amount (unwrap! (get dev-ft-amount tpi-values) ERR-NOTFOUND)) 
      (gaia-ft-amount (unwrap! (get gaia-ft-amount tpi-values) ERR-NOTFOUND))
      (dev-principal  (get dev-principal tpi-values)) 
      (gaia-principal  (unwrap! (get gaia-principal tpi-values) ERR-NOTFOUND))
      (derupt-core-contract (unwrap! (get-derupt-core-contract) ERR-NOTFOUND))
      (dislike-ft-total dislike-ft-amount)
      (chime-ft-total (unwrap! (get-chime-ft-amount) ERR-NOTFOUND))
      (dev-ft-total dev-ft-amount)
      (gaia-ft-total gaia-ft-amount) 
      (inputed-core-contract (contract-of core-contract))      
    )
    (asserts! (is-eq tx-sender APP_USER) ERR-UNAUTHORIZED)
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) ERR-VALIDATION-FAILED) ERR-UNAUTHORIZED-CONTRACT)
    (try! (contract-call? core-contract dislike-message author-principal disliked-txid cryptocash-token-contract cryptocash-core-contract dislike-ft-amount lockPeriod pay-dev pay-gaia dev-ft-amount gaia-ft-amount dev-principal (some gaia-principal) ext extras))
    (print 
      { 
        event: "dislike-message", author-principal: author-principal, disliked-txid: disliked-txid,
        cryptocash-token-contract: cryptocash-token-contract,
        dislike-ft-total: dislike-ft-total,
        lockPeriod: lockPeriod,
        chime-ft-total: chime-ft-total,
        alt-origin: alt-origin,
        ext: ext,
        pay-dev: pay-dev,
        pay-gaia: pay-gaia,
        dev-ft-total: dev-ft-total, 
        gaia-ft-total: gaia-ft-total,
        dev-principal: dev-principal, 
        gaia-principal: gaia-principal
      }
    )
    (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 (string-utf8 256)) 
    (author-principal principal) 
    (liked-txid (string-utf8 256)) 
    (mine-amounts (list 200 uint)) 
    (alt-origin (string-utf8 256))
    (ext (optional <derupt-ext-trait>)) 
    (extras (optional (list 10 
      {
        stringutf8: (optional (string-utf8 256)), 
        stringascii: (optional (string-ascii 256)), 
        uint: (optional uint), 
        int: (optional int), 
        principal: (optional principal), 
        bool: (optional bool),
        buff: (optional (buff 34)),
        proxy: (optional (buff 2048)),
        cryptocash-token-contract: (optional <cryptocash-token-trait>),
        cryptocash-core-contract: (optional <cryptocash-core-trait>),
        sip-009-contract: (optional <sip-009-trait>),
        sip-010-contract: (optional <sip-010-trait>),
        sip-013-contract: (optional <sip-013-trait>)
      }))
    )
    (cryptocash-token-contract <cryptocash-token-trait>)
    (cryptocash-core-contract <cryptocash-core-trait>)
    (core-contract <derupt-core-trait>)
    (like-ft-amount uint)
  )
  (let 
    (
      (tpi-values (unwrap! (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      ;; (tpi-values (unwrap! (contract-call? 'MAINNETADDRESS.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      (pay-dev (unwrap! (get pay-dev tpi-values) ERR-NOTFOUND)) 
      (pay-gaia (unwrap! (get pay-gaia tpi-values) ERR-NOTFOUND)) 
      (dev-stx-amount (unwrap! (get dev-stx-amount tpi-values) ERR-NOTFOUND)) 
      (gaia-stx-amount (unwrap! (get gaia-stx-amount tpi-values) ERR-NOTFOUND))
      (dev-ft-amount (unwrap! (get dev-ft-amount tpi-values) ERR-NOTFOUND)) 
      (gaia-ft-amount (unwrap! (get gaia-ft-amount tpi-values) ERR-NOTFOUND))
      (dev-principal  (get dev-principal tpi-values)) 
      (gaia-principal  (unwrap! (get gaia-principal tpi-values) ERR-NOTFOUND))
      (derupt-core-contract (unwrap! (get-derupt-core-contract) ERR-NOTFOUND))
      (like-ft-total like-ft-amount)
      (chime-stx-total (unwrap! (get-chime-stx-amount) ERR-NOTFOUND))
      (chime-ft-total (unwrap! (get-chime-ft-amount) ERR-NOTFOUND))
      (dev-stx-total dev-stx-amount)
      (gaia-stx-total gaia-stx-amount)
      (dev-ft-total dev-ft-amount)
      (gaia-ft-total gaia-ft-amount)
      (inputed-core-contract (contract-of core-contract))
    )
      (asserts! (is-eq tx-sender APP_USER) ERR-UNAUTHORIZED)      
      (asserts! (unwrap! (validate-core-contract inputed-core-contract) ERR-VALIDATION-FAILED) ERR-UNAUTHORIZED-CONTRACT)
      (try! (contract-call? core-contract favorable-reply-message content author-principal attachment-uri thumbnail-uri reply-to liked-txid mine-amounts alt-origin ext extras cryptocash-token-contract cryptocash-core-contract like-ft-amount pay-dev pay-gaia dev-stx-amount gaia-stx-amount dev-ft-amount gaia-ft-amount dev-principal (some gaia-principal)))
      (print 
        { 
          event: "favorable-reply-message", content: content, publisher: author-principal, attachment-uri: attachment-uri, thumbnail-uri: thumbnail-uri, reply-to: reply-to, 
          cryptocash-token-contract: cryptocash-token-contract,
          alt-origin: alt-origin, ext: ext,
          mine-total: (fold + mine-amounts u0),
          mine-amounts: mine-amounts,
          like-ft-total: like-ft-total,
          chime-stx-total: chime-stx-total,
          chime-ft-total: chime-ft-total,
          pay-dev: pay-dev,
          pay-gaia: pay-gaia,
          dev-stx-total: dev-stx-total, 
          gaia-stx-total: gaia-stx-total,
          dev-ft-total: dev-ft-total, 
          gaia-ft-total: gaia-ft-total,
          dev-principal: dev-principal, 
          gaia-principal: gaia-principal
        }
      )
      (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 (string-utf8 256)) 
    (author-principal principal) 
    (disliked-txid (string-utf8 256)) 
    (mine-amounts (list 200 uint))
    (alt-origin (string-utf8 256)) 
    (ext (optional <derupt-ext-trait>))
    (extras (optional (list 10 
      {
        stringutf8: (optional (string-utf8 256)), 
        stringascii: (optional (string-ascii 256)), 
        uint: (optional uint), 
        int: (optional int), 
        principal: (optional principal), 
        bool: (optional bool),
        buff: (optional (buff 34)),
        proxy: (optional (buff 2048)),
        cryptocash-token-contract: (optional <cryptocash-token-trait>),
        cryptocash-core-contract: (optional <cryptocash-core-trait>),
        sip-009-contract: (optional <sip-009-trait>),
        sip-010-contract: (optional <sip-010-trait>),
        sip-013-contract: (optional <sip-013-trait>)
      }))
    )
    (cryptocash-token-contract <cryptocash-token-trait>)
    (cryptocash-core-contract <cryptocash-core-trait>) 
    (core-contract <derupt-core-trait>)
    (dislike-ft-amount uint)
    (lockPeriod uint)
  )
  (let 
    (
      (tpi-values (unwrap! (contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      ;; (tpi-values (unwrap! (contract-call? 'MAINNETADDRESS.derupt-interfaces get-token-interface alt-origin) ERR-NOTFOUND))
      (pay-dev (unwrap! (get pay-dev tpi-values) ERR-NOTFOUND)) 
      (pay-gaia (unwrap! (get pay-gaia tpi-values) ERR-NOTFOUND)) 
      (dev-stx-amount (unwrap! (get dev-stx-amount tpi-values) ERR-NOTFOUND)) 
      (gaia-stx-amount (unwrap! (get gaia-stx-amount tpi-values) ERR-NOTFOUND))
      (dev-ft-amount (unwrap! (get dev-ft-amount tpi-values) ERR-NOTFOUND)) 
      (gaia-ft-amount (unwrap! (get gaia-ft-amount tpi-values) ERR-NOTFOUND))
      (dev-principal  (get dev-principal tpi-values)) 
      (gaia-principal  (unwrap! (get gaia-principal tpi-values) ERR-NOTFOUND))
      (derupt-core-contract (unwrap! (get-derupt-core-contract) ERR-NOTFOUND))
      (dislike-ft-total dislike-ft-amount)
      (chime-stx-total (unwrap! (get-chime-stx-amount) ERR-NOTFOUND))
      (chime-ft-total (unwrap! (get-chime-ft-amount) ERR-NOTFOUND))
      (dev-stx-total dev-stx-amount)
      (gaia-stx-total gaia-stx-amount)
      (dev-ft-total dev-ft-amount)
      (gaia-ft-total gaia-ft-amount)
      (inputed-core-contract (contract-of core-contract))
    )
    (asserts! (is-eq tx-sender APP_USER) ERR-UNAUTHORIZED)
    (asserts! (unwrap! (validate-core-contract inputed-core-contract) ERR-VALIDATION-FAILED) ERR-UNAUTHORIZED-CONTRACT)     
    (try! (contract-call? core-contract unfavorable-reply-message content author-principal attachment-uri thumbnail-uri reply-to disliked-txid mine-amounts alt-origin ext extras cryptocash-token-contract cryptocash-core-contract dislike-ft-amount lockPeriod pay-dev pay-gaia dev-stx-amount gaia-stx-amount dev-ft-amount gaia-ft-amount dev-principal (some gaia-principal)))
    (print 
      { 
        event: "unfavorable-reply-message", content: content, publisher: author-principal, attachment-uri: attachment-uri, thumbnail-uri: thumbnail-uri, reply-to: reply-to, 
        cryptocash-token-contract: cryptocash-token-contract, 
        alt-origin: alt-origin, ext: ext,
        mine-total: (fold + mine-amounts u0),
        mine-amounts: mine-amounts,
        dislike-ft-total: dislike-ft-total,
        lockPeriod: lockPeriod,
        chime-stx-total: chime-stx-total,
        chime-ft-total: chime-ft-total,
        pay-dev: pay-dev,
        pay-gaia: pay-gaia,
        dev-stx-total: dev-stx-total, 
        gaia-stx-total: gaia-stx-total,
        dev-ft-total: dev-ft-total, 
        gaia-ft-total: gaia-ft-total,
        dev-principal: dev-principal, 
        gaia-principal: gaia-principal
      }
    )
    (ok true)
  )
)

(map-insert member-status APP_USER false)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.derupt.io/latest/contracts/.derupt-profile.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
