Source Code

;; genomic-token - Clarity 4
;; Fungible token for genomic data platform economy

;; (impl-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait) ;; Commented for local testing

(define-constant ERR-NOT-AUTHORIZED (err u100))
(define-constant ERR-INSUFFICIENT-BALANCE (err u101))
(define-constant ERR-INVALID-AMOUNT (err u102))

(define-fungible-token genomic-token)
(define-data-var token-name (string-ascii 32) "Genomic Data Token")
(define-data-var token-symbol (string-ascii 10) "GENE")
(define-data-var token-decimals uint u6)
(define-data-var token-uri (optional (string-utf8 256)) none)

(define-constant TOTAL-SUPPLY u1000000000000000) ;; 1 billion tokens with 6 decimals

(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34))))
  (begin
    (asserts! (is-eq tx-sender sender) ERR-NOT-AUTHORIZED)
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    (try! (ft-transfer? genomic-token amount sender recipient))
    (match memo to-print (print to-print) 0x)
    (ok true)))

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

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

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

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

(define-read-only (get-total-supply)
  (ok (ft-get-supply genomic-token)))

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

(define-public (set-token-uri (new-uri (string-utf8 256)))
  (begin
    (var-set token-uri (some new-uri))
    (ok true)))

(define-public (mint (amount uint) (recipient principal))
  (begin
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    (asserts! (<= (+ (ft-get-supply genomic-token) amount) TOTAL-SUPPLY) (err u103))
    (ft-mint? genomic-token amount recipient)))

(define-public (burn (amount uint))
  (begin
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    (ft-burn? genomic-token amount tx-sender)))

;; Clarity 4: principal-destruct?
(define-read-only (validate-holder (holder principal))
  (principal-destruct? holder))

;; Clarity 4: int-to-ascii
(define-read-only (format-amount (amount uint))
  (ok (int-to-ascii amount)))

;; Clarity 4: string-to-uint?
(define-read-only (parse-amount (amount-str (string-ascii 20)))
  (string-to-uint? amount-str))

;; Clarity 4: burn-block-height
(define-read-only (get-bitcoin-block)
  (ok burn-block-height))

Functions (14)

FunctionAccessArgs
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
set-token-uripublicnew-uri: (string-utf8 256
mintpublicamount: uint, recipient: principal
burnpublicamount: uint
validate-holderread-onlyholder: principal
format-amountread-onlyamount: uint
parse-amountread-onlyamount-str: (string-ascii 20
get-bitcoin-blockread-only