Source Code

;; Aegis Token V2 (AGS)
;; SIP-010 Compliant Fungible Token
;; Reward token for the Aegis Vault staking platform

(impl-trait .aegis-sip010-trait.sip-010-trait)

;; ============================================
;; CONSTANTS
;; ============================================

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-AUTHORIZED (err u1001))
(define-constant ERR-NOT-TOKEN-OWNER (err u1002))
(define-constant ERR-INSUFFICIENT-BALANCE (err u1003))
(define-constant ERR-INVALID-AMOUNT (err u1004))
(define-constant ERR-MINTER-ONLY (err u1005))

;; Token metadata
(define-constant TOKEN-NAME "Aegis Token")
(define-constant TOKEN-SYMBOL "AGS")
(define-constant TOKEN-DECIMALS u6)
(define-constant TOKEN-URI (some u"https://aegis.finance/token-metadata.json"))

;; ============================================
;; DATA VARIABLES
;; ============================================

(define-data-var total-supply uint u0)
(define-data-var contract-paused bool false)

;; ============================================
;; DATA MAPS
;; ============================================

;; Token balances
(define-map balances principal uint)

;; Authorized minters (staking vault contract)
(define-map authorized-minters principal bool)

;; ============================================
;; PRIVATE FUNCTIONS
;; ============================================

(define-private (is-authorized-minter (account principal))
  (default-to false (map-get? authorized-minters account))
)

;; ============================================
;; SIP-010 IMPLEMENTATION
;; ============================================

;; Transfer tokens
(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34))))
  (begin
    ;; Validate sender is tx-sender or contract-caller
    (asserts! (or (is-eq tx-sender sender) (is-eq contract-caller sender)) ERR-NOT-TOKEN-OWNER)
    ;; Validate amount
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    ;; Check balance
    (asserts! (>= (get-balance-of sender) amount) ERR-INSUFFICIENT-BALANCE)
    
    ;; Update balances
    (map-set balances sender (- (get-balance-of sender) amount))
    (map-set balances recipient (+ (get-balance-of recipient) amount))
    
    ;; Print memo if provided
    (match memo
      memo-value (begin (print memo-value) true)
      true
    )
    
    (ok true)
  )
)

;; Get token name
(define-read-only (get-name)
  (ok TOKEN-NAME)
)

;; Get token symbol
(define-read-only (get-symbol)
  (ok TOKEN-SYMBOL)
)

;; Get decimals
(define-read-only (get-decimals)
  (ok TOKEN-DECIMALS)
)

;; Get balance of principal
(define-read-only (get-balance (account principal))
  (ok (get-balance-of account))
)

;; Get total supply
(define-read-only (get-total-supply)
  (ok (var-get total-supply))
)

;; Get token URI
(define-read-only (get-token-uri)
  (ok TOKEN-URI)
)

;; ============================================
;; HELPER READ-ONLY FUNCTIONS
;; ============================================

(define-read-only (get-balance-of (account principal))
  (default-to u0 (map-get? balances account))
)

(define-read-only (is-minter (account principal))
  (is-authorized-minter account)
)

(define-read-only (get-contract-owner)
  CONTRACT-OWNER
)

(define-read-only (is-paused)
  (var-get contract-paused)
)

;; ============================================
;; MINTING FUNCTIONS (Restricted to authorized minters)
;; ============================================

;; Mint tokens - only callable by authorized minters (staking vault)
(define-public (mint (amount uint) (recipient principal))
  (begin
    ;; Check if caller is authorized minter
    (asserts! (is-authorized-minter contract-caller) ERR-MINTER-ONLY)
    ;; Validate amount
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    
    ;; Update balance and supply
    (map-set balances recipient (+ (get-balance-of recipient) amount))
    (var-set total-supply (+ (var-get total-supply) amount))
    
    (print { event: "mint", amount: amount, recipient: recipient })
    (ok true)
  )
)

;; ============================================
;; ADMIN FUNCTIONS
;; ============================================

;; Add authorized minter (only contract owner)
(define-public (add-minter (minter principal))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (map-set authorized-minters minter true)
    (print { event: "minter-added", minter: minter })
    (ok true)
  )
)

;; Remove authorized minter (only contract owner)
(define-public (remove-minter (minter principal))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (map-delete authorized-minters minter)
    (print { event: "minter-removed", minter: minter })
    (ok true)
  )
)

;; Pause contract (only contract owner)
(define-public (pause-contract)
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (var-set contract-paused true)
    (print { event: "contract-paused" })
    (ok true)
  )
)

;; Unpause contract (only contract owner)
(define-public (unpause-contract)
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (var-set contract-paused false)
    (print { event: "contract-unpaused" })
    (ok true)
  )
)

;; ============================================
;; BURN FUNCTION (Optional - for future use)
;; ============================================

;; Burn tokens from own balance
(define-public (burn (amount uint))
  (let
    (
      (sender tx-sender)
      (sender-balance (get-balance-of sender))
    )
    ;; Validate amount
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    ;; Check balance
    (asserts! (>= sender-balance amount) ERR-INSUFFICIENT-BALANCE)
    
    ;; Update balance and supply
    (map-set balances sender (- sender-balance amount))
    (var-set total-supply (- (var-get total-supply) amount))
    
    (print { event: "burn", amount: amount, burner: sender })
    (ok true)
  )
)

Functions (18)

FunctionAccessArgs
is-authorized-minterprivateaccount: principal
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
get-balance-ofread-onlyaccount: principal
is-minterread-onlyaccount: principal
get-contract-ownerread-only
is-pausedread-only
mintpublicamount: uint, recipient: principal
add-minterpublicminter: principal
remove-minterpublicminter: principal
pause-contractpublic
unpause-contractpublic
burnpublicamount: uint