.cryptocash-token contract documentation

;; CryptoCash Protocol Version 1.0.1


(define-constant CONTRACT_OWNER tx-sender)


(impl-trait 'ST1SEDHP0BHAMH6KSBM672S5CE0DJ2R6ZF22NSYXE.cryptocash-token-trait.cryptocash-token)


(define-constant ERR_UNAUTHORIZED u2000)
(define-constant ERR_TOKEN_NOT_ACTIVATED u2001)
(define-constant ERR_TOKEN_ALREADY_ACTIVATED u2002)

(define-constant cryptocash-core 'ST1SEDHP0BHAMH6KSBM672S5CE0DJ2R6ZF22NSYXE.cryptocash-core)


(impl-trait 'ST3D8PX7ABNZ1DPP9MRRCYQKVTAC16WXJ7VCN3Z97.sip-010-trait-ft-standard.sip-010-trait)

(define-fungible-token cryptocash)


(define-public (transfer (amount uint) (from principal) (to principal) (memo (optional (buff 34))))
    (asserts! (is-eq from tx-sender) (err ERR_UNAUTHORIZED))
    (if (is-some memo)
      (print memo)
    (ft-transfer? cryptocash amount from to)

(define-read-only (get-name)
  (ok "cryptocash")

(define-read-only (get-symbol)
  (ok "CC")

(define-read-only (get-decimals)
  (ok u0)

(define-read-only (get-balance (user principal))
  (ok (ft-get-balance cryptocash user))

(define-read-only (get-total-supply)
  (ok (ft-get-supply cryptocash))

(define-read-only (get-token-uri)
  (ok (var-get tokenUri))


;; how many blocks until the next halving occurs
(define-constant TOKEN_HALVING_BLOCKS u210000)

;; store block height at each halving, set by register-user in core contract 
(define-data-var coinbaseThreshold1 uint u0)
(define-data-var coinbaseThreshold2 uint u0)
(define-data-var coinbaseThreshold3 uint u0)
(define-data-var coinbaseThreshold4 uint u0)
(define-data-var coinbaseThreshold5 uint u0)

;; once activated, thresholds cannot be updated again
(define-data-var tokenActivated bool false)

;; core contract states
(define-constant STATE_DEPLOYED u0)
(define-constant STATE_ACTIVE u1)
(define-constant STATE_INACTIVE u2)

;; one-time function to activate the token
(define-public (activate-token (stacksHeight uint))
    (asserts! (is-eq CONTRACT_OWNER tx-sender) (err ERR_UNAUTHORIZED))
    (asserts! (not (var-get tokenActivated)) (err ERR_TOKEN_ALREADY_ACTIVATED))
    (var-set tokenActivated true)
    (var-set coinbaseThreshold1 (+ stacksHeight TOKEN_HALVING_BLOCKS))
    (var-set coinbaseThreshold2 (+ stacksHeight (* u2 TOKEN_HALVING_BLOCKS)))
    (var-set coinbaseThreshold3 (+ stacksHeight (* u3 TOKEN_HALVING_BLOCKS)))
    (var-set coinbaseThreshold4 (+ stacksHeight (* u4 TOKEN_HALVING_BLOCKS)))
    (var-set coinbaseThreshold5 (+ stacksHeight (* u5 TOKEN_HALVING_BLOCKS)))
    (ok true)

;; return coinbase thresholds if token activated
(define-read-only (get-coinbase-thresholds)
      (activated (var-get tokenActivated))
    (asserts! activated (err ERR_TOKEN_NOT_ACTIVATED))
    (ok {
      coinbaseThreshold1: (var-get coinbaseThreshold1),
      coinbaseThreshold2: (var-get coinbaseThreshold2),
      coinbaseThreshold3: (var-get coinbaseThreshold3),
      coinbaseThreshold4: (var-get coinbaseThreshold4),
      coinbaseThreshold5: (var-get coinbaseThreshold5)


(define-data-var tokenUri (optional (string-utf8 256)) (some u"https://stackers.cc/cryptocash.json"))

;; set token URI to new value, only accessible by Auth
(define-public (set-token-uri (newUri (optional (string-utf8 256))))
    (asserts! (is-authorized-auth) (err ERR_UNAUTHORIZED))
    (ok (var-set tokenUri newUri))

;; mint new tokens, only accessible by a Core contract
(define-public (mint (amount uint) (recipient principal))
      (check (is-eq contract-caller cryptocash-core))    
    (if check 
      (ft-mint? cryptocash amount recipient)
      (ok false)

(define-public (burn (amount uint) (owner principal))
    (asserts! (is-eq tx-sender owner) (err ERR_UNAUTHORIZED))
    (ft-burn? cryptocash amount owner)

;; checks if caller is Auth contract
(define-private (is-authorized-auth)
  (is-eq tx-sender CONTRACT_OWNER)


(define-public (send-many (recipients (list 200 { to: principal, amount: uint, memo: (optional (buff 34)) })))
  (fold check-err
    (map send-token recipients)
    (ok true)

(define-private (check-err (result (response bool uint)) (prior (response bool uint)))
  (match prior ok-value result
               err-value (err err-value)

(define-private (send-token (recipient { to: principal, amount: uint, memo: (optional (buff 34)) }))
  (send-token-with-memo (get amount recipient) (get to recipient) (get memo recipient))

(define-private (send-token-with-memo (amount uint) (to principal) (memo (optional (buff 34))))
      (transferOk (try! (transfer amount tx-sender to memo)))
    (ok transferOk)

The CryptoCash token contract defines a fungible token protocol following SIP-010 standards. Here's a summary of its key components and functionalities:

  1. Contract Owner: The owner of the contract is defined as the transaction sender (tx-sender).

  2. Traits: The contract implements traits for CryptoCash token and core functionalities.

  3. Error Codes: Error codes are defined for unauthorized access and token activation status.

  4. SIP-010 Definition: The contract implements SIP-010 standards for fungible tokens.

  5. SIP-010 Functions:

    • transfer: Transfers tokens from one account to another with an optional memo.

    • get-name: Returns the name of the token (cryptocash).

    • get-symbol: Returns the symbol of the token (CC).

    • get-decimals: Returns the number of decimals for the token (0).

    • get-balance: Returns the balance of a specified user.

    • get-total-supply: Returns the total token supply.

    • get-token-uri: Returns the token URI.

  6. Token Configuration:

    • Defines the number of blocks until the next halving occurs.

    • Stores block height at each halving.

    • Tracks token activation status and thresholds.

  7. Token Activation: Function to activate the token, setting thresholds based on block height.

  8. Coinbase Thresholds: Returns coinbase thresholds if the token is activated.

  9. Utilities:

    • Allows setting a token URI.

    • Provides functions to mint and burn tokens.

    • Checks if the caller is the Auth contract.

  10. Send-Many: Allows sending tokens to multiple recipients in a single transaction.

Overall, the contract provides standard token functionalities along with specific features such as activation, threshold setting, and multi-recipient token transfers.

Last updated