Source Code

;;
;; ======
;; TRAITS
;; ======
;;
(impl-trait .sip-010-trait-approve.sip-010-trait-approve)

;;
;; =================
;; TOKEN DEFINITIONS  
;; =================
;; 
(define-fungible-token greenso)

;;
;; =========
;; CONSTANTS
;; =========
;;
(define-constant token-name "Greenso")
(define-constant token-symbol "GRNS")

(define-constant err-invalid-number (err u9000))

;;
;; =========
;; DATA VARS
;; =========
;;
(define-data-var token-uri (optional (string-utf8 256)) none)

(define-map allowances { owner: principal, spender: principal } uint)

;;
;; ================
;; PUBLIC FUNCTIONS
;; ================
;;

(define-public (mint (recipient principal) (amount uint))
    (let (
          (is-internal (contract-call? .sys-investor is-active recipient))
          )
      (try! (contract-call? .sys-admin assert-invoked-by-operator))
      (asserts! (> amount u0) err-invalid-number)
      (try! (ft-mint? greenso amount recipient))
      (ok amount)
      )
  )

(define-public (set-token-uri (uri (optional (string-utf8 256))))
    (begin
     (try! (contract-call? .sys-admin assert-invoked-by-operator))
     (ok (var-set token-uri uri))))


(define-public (burn (amount uint))
    (ft-burn? greenso amount tx-sender)
  )



;; sip10 trait
;; -----------

(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34))))
  (begin
    (if (is-eq tx-sender sender)
      (try! (ft-transfer? greenso amount sender recipient))
      (begin
        (try! (spend-allowance sender tx-sender amount))
        (try! (ft-transfer? greenso amount sender recipient))
      )
    )
    (print memo)
    (ok true)
  )
  
)

(define-read-only (get-name)
    (ok token-name))

(define-read-only (get-symbol)
    (ok token-symbol))

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

(define-read-only (get-balance (account principal))
    (ok (ft-get-balance greenso  account)))

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

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


;; approve

(define-private (spend-allowance (owner principal) (spender principal) (amount uint))
  (let ( (amount-allowed (unwrap-panic (allowance tx-sender spender))) )
    (asserts! (>= amount-allowed amount) (err u5))
    (ok (approve_ owner spender (- amount-allowed amount)))
  )
)

(define-private (approve_ (owner principal) (spender principal) (amount uint))
  (map-set allowances { owner: tx-sender, spender: spender } amount)
)

(define-public (increase-allowance (spender principal) (amount uint))
  (let ( (amount-allowed (unwrap-panic (allowance tx-sender spender))) )
    (ok (approve_ tx-sender spender (+ amount-allowed amount)) )
  )
)

(define-public (decrease-allowance (spender principal) (amount uint))
  (let ( (amount-allowed (unwrap-panic (allowance tx-sender spender))) )
    (asserts! (>= amount-allowed amount) (err u3))
    (ok (approve_ tx-sender spender (- amount-allowed amount)) )
  )
)

(define-public (allowance (owner principal) (spender principal))
  (ok (default-to u0 (map-get? allowances { owner: owner, spender: spender })))
)

(define-public (approve (spender principal) (amount uint))
  (ok (approve_ tx-sender spender amount))
)

;; end of sip-10 implementation

Functions (16)

FunctionAccessArgs
mintpublicrecipient: principal, amount: uint
set-token-uripublicuri: (optional (string-utf8 256
burnpublicamount: uint
transferpublicamount: uint, sender: principal, recipient: principal, memo: (optional (buff 34
get-nameread-only
get-symbolread-only
get-decimalsread-only
get-balanceread-onlyaccount: principal
get-total-supplyread-only
get-token-uriread-only
spend-allowanceprivateowner: principal, spender: principal, amount: uint
approve_privateowner: principal, spender: principal, amount: uint
increase-allowancepublicspender: principal, amount: uint
decrease-allowancepublicspender: principal, amount: uint
allowancepublicowner: principal, spender: principal
approvepublicspender: principal, amount: uint