Source Code

;; StackFlow FLOW Token
;; SIP-010 Compliant Fungible Token
;; The native token of the StackFlow ecosystem

;; Trait implementation
(impl-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)

;; Constants
(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-not-token-owner (err u101))
(define-constant err-insufficient-balance (err u102))
(define-constant err-unauthorized (err u103))
(define-constant err-paused (err u104))
(define-constant err-invalid-amount (err u105))
(define-constant err-already-minted (err u106))

;; Token configuration
(define-fungible-token flow u100000000000000) ;; 100M FLOW with 6 decimals = 100,000,000.000000
(define-constant token-decimals u6)
(define-constant token-name "stackflow")
(define-constant token-symbol "FLOW")
(define-constant total-supply u100000000000000) ;; 100M FLOW

;; State
(define-data-var token-uri (optional (string-utf8 256)) none)
(define-data-var paused bool false)
(define-data-var initial-mint-complete bool false)

;; Distribution wallets (to be set before minting)
(define-data-var community-rewards-wallet principal tx-sender)
(define-data-var ecosystem-wallet principal tx-sender)
(define-data-var team-wallet principal tx-sender)
(define-data-var liquidity-wallet principal tx-sender)
(define-data-var public-distribution-wallet principal tx-sender)

;; Token amounts (with 6 decimals)
(define-constant community-rewards-amount u40000000000000) ;; 40M
(define-constant ecosystem-amount u25000000000000) ;; 25M
(define-constant team-amount u20000000000000) ;; 20M
(define-constant liquidity-amount u10000000000000) ;; 10M
(define-constant public-amount u5000000000000) ;; 5M

;; SIP-010 Functions

(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34))))
  (begin
    (asserts! (not (var-get paused)) err-paused)
    (asserts! (or (is-eq tx-sender sender) (is-eq contract-owner tx-sender)) err-not-token-owner)
    (asserts! (> amount u0) err-invalid-amount)
    (try! (ft-transfer? flow amount sender recipient))
    (match memo to-print (print to-print) 0x)
    (print {
      event: "transfer",
      sender: sender,
      recipient: recipient,
      amount: amount
    })
    (ok true)))

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

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

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

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

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

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

;; Custom Functions

(define-public (set-token-uri (uri (string-utf8 256)))
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (var-set token-uri (some uri))
    (ok true)))

(define-public (pause-token)
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (var-set paused true)
    (print {event: "token-paused"})
    (ok true)))

(define-public (unpause-token)
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (var-set paused false)
    (print {event: "token-unpaused"})
    (ok true)))

;; Wallet configuration (must be called before initial mint)
(define-public (configure-distribution-wallets 
    (community principal)
    (ecosystem principal)
    (team principal)
    (liquidity principal)
    (public principal))
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (asserts! (not (var-get initial-mint-complete)) err-already-minted)
    (var-set community-rewards-wallet community)
    (var-set ecosystem-wallet ecosystem)
    (var-set team-wallet team)
    (var-set liquidity-wallet liquidity)
    (var-set public-distribution-wallet public)
    (print {event: "wallets-configured"})
    (ok true)))

;; Initial token distribution
(define-public (mint-initial-distribution)
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (asserts! (not (var-get initial-mint-complete)) err-already-minted)
    
    ;; Mint to distribution wallets
    (try! (ft-mint? flow community-rewards-amount (var-get community-rewards-wallet)))
    (try! (ft-mint? flow ecosystem-amount (var-get ecosystem-wallet)))
    (try! (ft-mint? flow team-amount (var-get team-wallet)))
    (try! (ft-mint? flow liquidity-amount (var-get liquidity-wallet)))
    (try! (ft-mint? flow public-amount (var-get public-distribution-wallet)))
    
    (var-set initial-mint-complete true)
    
    (print {
      event: "initial-mint-complete",
      total-minted: total-supply,
      community: community-rewards-amount,
      ecosystem: ecosystem-amount,
      team: team-amount,
      liquidity: liquidity-amount,
      public: public-amount
    })
    
    (ok true)))

;; Burn function (for future deflationary mechanisms)
(define-public (burn (amount uint) (owner principal))
  (begin
    (asserts! (not (var-get paused)) err-paused)
    (asserts! (or (is-eq tx-sender owner) (is-eq tx-sender contract-owner)) err-not-token-owner)
    (asserts! (> amount u0) err-invalid-amount)
    (try! (ft-burn? flow amount owner))
    (print {
      event: "burn",
      owner: owner,
      amount: amount
    })
    (ok true)))

;; Read-only utilities
(define-read-only (get-contract-info)
  (ok {
    name: token-name,
    symbol: token-symbol,
    decimals: token-decimals,
    total-supply: total-supply,
    current-supply: (ft-get-supply flow),
    paused: (var-get paused),
    initial-mint-complete: (var-get initial-mint-complete)
  }))

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

;; Helper for formatting amounts (convert to human-readable)
(define-read-only (format-amount (amount uint))
  (ok (/ amount u1000000))) ;; Divide by 10^6 to get whole tokens

Functions (16)

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-uripublicuri: (string-utf8 256
pause-tokenpublic
unpause-tokenpublic
configure-distribution-walletspubliccommunity: principal, ecosystem: principal, team: principal, liquidity: principal, public: principal
mint-initial-distributionpublic
burnpublicamount: uint, owner: principal
get-contract-inforead-only
is-pausedread-only
format-amountread-onlyamount: uint