.derupt-ext
Developers can extend the functionality of Derupt by creating Extensions for user to use.
;; title: derupt-ext
;; version: 1.3.1
;; summary: Derupt Extension Contract (sample extension for reference)
;; Derupt Extension Example - Send passed amount of CC to passed principal
(impl-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)
(use-trait sip-009-trait-ft-standard 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.sip-009-trait-nft-standard.sip-009-trait)
(use-trait sip-010-trait-ft-standard 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.sip-010-trait-ft-standard.sip-010-trait)
(use-trait sip-013-trait-ft-standard 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.sip-013-trait-sft-standard.sip-013-trait)
;; Errors
(define-constant ERR-UNAUTHORIZED (err u100))
(define-constant ERR-NOTFOUND (err u101))
(define-constant ERR-WRONG-CC-TOKEN-VERSION (err u102))
(define-data-var ext-owner principal tx-sender)
(define-map ext-meta principal
{
name: (string-ascii 24),
description: (string-ascii 256),
image: (string-ascii 256)
}
)
(define-read-only (get-ext-metadata)
(ok (unwrap! (map-get? ext-meta (var-get ext-owner)) ERR-NOTFOUND))
)
(define-public (update-ext-owner (new-ext-owner principal))
(begin
(asserts! (is-eq tx-sender (var-get ext-owner)) ERR-UNAUTHORIZED)
(asserts! (is-standard new-ext-owner) ERR-UNAUTHORIZED)
(var-set ext-owner new-ext-owner)
(print {prev-owner: tx-sender, new-owner: new-ext-owner})
(ok true)
)
)
(define-read-only (get-ext-owner)
(ok (var-get ext-owner))
)
(define-public (update-ext-metadata (name (optional (string-ascii 24))) (description (optional (string-ascii 256))) (image (optional (string-ascii 256))))
(let
(
(meta (map-get? ext-meta (var-get ext-owner)))
(prev-name (unwrap! (get name meta) ERR-NOTFOUND))
(prev-description (unwrap! description ERR-NOTFOUND))
(prev-image (unwrap! image ERR-NOTFOUND))
)
(asserts! (is-eq tx-sender (var-get ext-owner)) ERR-UNAUTHORIZED)
(match name value (map-set ext-meta (var-get ext-owner) {name: value, description: prev-description, image: prev-image}) false)
(match description value (map-set ext-meta (var-get ext-owner) {name: prev-name, description: value, image: prev-image}) false)
(match image value (map-set ext-meta (var-get ext-owner) {name: prev-name, description: prev-description, image: value}) false)
(print { prev-name: prev-name, new-name: (unwrap! name ERR-NOTFOUND), prev-description: prev-description, description: (unwrap! description ERR-NOTFOUND), prev-image: prev-image, image: (unwrap! image ERR-NOTFOUND)})
(ok true)
)
)
;; Get derupt-core-contract - used to verify call origin
(define-private (get-derupt-core-contract)
(contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-feed get-derupt-core-contract)
)
;; Get cc-token-contract - used to get active cc token contract
(define-private (get-cc-token-contract)
(contract-call? 'ST1ZK4MRVTQQJMVAAJQWBV2WPQ87QV2851YCTHD7X.derupt-feed get-cc-token-contract)
)
;; Transfer CryptoCash
(define-public (cryptocash-transfer (cc-token-contract <cryptocash-token-trait>) (amount uint) (recipient principal))
(contract-call? cc-token-contract transfer amount tx-sender recipient none)
)
;; Execute Extension Function
(define-public (exec-ext-func
(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
;;get and verify call is coming from current core.
(
(derupt-core-contract (unwrap! (get-derupt-core-contract) ERR-NOTFOUND))
(cc-token-address (unwrap! (get-cc-token-contract) ERR-WRONG-CC-TOKEN-VERSION))
(cc-token-contract (unwrap! (get cryptocash-token-contract (element-at? (unwrap! extras ERR-NOTFOUND) u0)) ERR-NOTFOUND))
;; Amount extraction from position x of expected tuple arguments
(amount (unwrap! (unwrap! (get uint (element-at? (unwrap! extras ERR-NOTFOUND) u0)) ERR-NOTFOUND) ERR-NOTFOUND))
(recipient (unwrap! (unwrap! (get principal (element-at? (unwrap! extras ERR-NOTFOUND) u0)) ERR-NOTFOUND) ERR-NOTFOUND))
)
(asserts! (is-eq contract-caller derupt-core-contract) ERR-UNAUTHORIZED)
(asserts! (is-eq (contract-of cc-token-contract) cc-token-address) ERR-NOTFOUND)
;; perform cc transfer?
(try! (cryptocash-transfer cc-token-contract amount recipient))
;; Print logging
(print
{
event: "derupt-ext-message: Transfer CC Too",
tx-sender: tx-sender,
recipient: recipient,
extras: extras,
amount:amount
}
)
(ok true)
)
)
(map-insert ext-meta (var-get ext-owner) {name: "Transfer CC too", description: "Extension to Transfer an AMOUNT of CC to defined PRINCIPAL", image: "https://stackers.cc/cryptocash.png"})Extension Contract Metadata
Extension Description Metadata
Last updated