Source Code

;; token.clar
;; Enhanced SIP-010 token with vesting and fees

(define-fungible-token enhanced-token)

;; Constants
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-OWNER (err u100))
(define-constant ERR-NOT-MINTER (err u101))
(define-constant ERR-TRANSFERS-DISABLED (err u102))

(define-constant TRANSFERS-ENABLED true)
(define-constant TRANSFER-FEE u0) ;; Basis points

;; Maps
(define-map minters principal bool)
(define-map vesting-schedules principal 
  {
    total: uint,
    released: uint,
    start: uint,
    duration: uint
  }
)

;; Public Functions
(define-public (set-minter (minter principal) (allowed bool))
  (begin
    (asserts! (not (is-eq minter tx-sender)) (err u406))
    (ok (map-set minters minter allowed))
  )
)

(define-public (transfer (amount uint) (from principal) (to principal) (memo (optional (buff 34))))
  (begin
    (asserts! TRANSFERS-ENABLED ERR-TRANSFERS-DISABLED)
    (asserts! (is-eq from tx-sender) (err u401))
    (asserts! (not (is-eq to tx-sender)) (err u407))
    (asserts! (> amount u0) (err u402))
    
    (match memo
      memo-val (begin (print memo-val) true)
      true
    )
    
    (let ((fee (/ (* amount TRANSFER-FEE) u10000)))
      (begin
        (if (> fee u0)
          (begin
            (unwrap! (ft-transfer? enhanced-token fee from CONTRACT-OWNER) (err u500))
            (ft-transfer? enhanced-token (- amount fee) from to))
          (ft-transfer? enhanced-token amount from to)
        )
      )
    )
  )
)

(define-public (mint (amount uint) (recipient principal))
  (begin
    (asserts! (> amount u0) (err u403))
    (asserts! (not (is-eq recipient tx-sender)) (err u408))
    (ft-mint? enhanced-token amount recipient)
  )
)

(define-public (create-vesting (beneficiary principal) (amount uint) (duration-days uint))
  (begin
    (asserts! (not (is-eq beneficiary tx-sender)) (err u409))
    (asserts! (> amount u0) (err u404))
    (asserts! (> duration-days u0) (err u405))
    (ok (map-set vesting-schedules beneficiary {
      total: amount,
      released: u0,
      start: stacks-block-time,
      duration: (* duration-days u86400)
    }))
  )
)

;; Read-only
(define-read-only (get-vesting (user principal))
  (map-get? vesting-schedules user)
)

;; Read-only
(define-read-only (get-name) (ok "Enhanced Token"))
(define-read-only (get-symbol) (ok "ETOKEN"))
(define-read-only (get-decimals) (ok u18))
(define-read-only (get-balance (user principal)) (ok (ft-get-balance enhanced-token user)))

Functions (9)

FunctionAccessArgs
set-minterpublicminter: principal, allowed: bool
transferpublicamount: uint, from: principal, to: principal, memo: (optional (buff 34
mintpublicamount: uint, recipient: principal
create-vestingpublicbeneficiary: principal, amount: uint, duration-days: uint
get-vestingread-onlyuser: principal
get-nameread-only
get-symbolread-only
get-decimalsread-only
get-balanceread-onlyuser: principal