Source Code

;; Loiters Token (LOIT)
;; SIP-010 Fungible Token for platform rewards

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

;; Constants
(define-constant CONTRACT-OWNER tx-sender)
(define-constant TOKEN-NAME "Loiters Token")
(define-constant TOKEN-SYMBOL "LOIT")
(define-constant TOKEN-DECIMALS u6)
(define-constant TOKEN-TOTAL-SUPPLY u1000000000000000) ;; 1 billion tokens with 6 decimals

;; Error codes
(define-constant ERR-NOT-AUTHORIZED (err u2000))
(define-constant ERR-INSUFFICIENT-BALANCE (err u2001))
(define-constant ERR-INVALID-AMOUNT (err u2002))

;; Data Variables
(define-data-var token-uri (optional (string-utf8 256)) none)
(define-data-var contract-paused bool false)

;; Data Maps
(define-map balances principal uint)
(define-map allowances {owner: principal, spender: principal} uint)
(define-map authorized-minters principal bool)

;; Initialize contract owner balance
(map-set balances CONTRACT-OWNER TOKEN-TOTAL-SUPPLY)

;; SIP-010 Functions

(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 (default-to u0 (map-get? balances account)))
)

(define-read-only (get-total-supply)
  (ok TOKEN-TOTAL-SUPPLY)
)

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

(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34))))
  (begin
    (asserts! (not (var-get contract-paused)) ERR-NOT-AUTHORIZED)
    (asserts! (is-eq tx-sender sender) ERR-NOT-AUTHORIZED)
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    (try! (transfer-internal sender recipient amount))
    (match memo to-print (print to-print) 0x)
    (ok true)
  )
)

;; Internal transfer function
(define-private (transfer-internal (sender principal) (recipient principal) (amount uint))
  (let
    (
      (sender-balance (default-to u0 (map-get? balances sender)))
      (recipient-balance (default-to u0 (map-get? balances recipient)))
    )
    (asserts! (>= sender-balance amount) ERR-INSUFFICIENT-BALANCE)
    (map-set balances sender (- sender-balance amount))
    (map-set balances recipient (+ recipient-balance amount))
    (print {type: "transfer", sender: sender, recipient: recipient, amount: amount})
    (ok true)
  )
)

;; Minting function (only authorized contracts)
(define-public (mint (amount uint) (recipient principal))
  (begin
    (asserts! (is-authorized-minter tx-sender) ERR-NOT-AUTHORIZED)
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    (let
      (
        (recipient-balance (default-to u0 (map-get? balances recipient)))
      )
      (map-set balances recipient (+ recipient-balance amount))
      (print {type: "mint", recipient: recipient, amount: amount})
      (ok true)
    )
  )
)

;; Authorization functions
(define-public (authorize-minter (minter principal))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (ok (map-set authorized-minters minter true))
  )
)

(define-public (revoke-minter (minter principal))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (ok (map-delete authorized-minters minter))
  )
)

(define-read-only (is-authorized-minter (minter principal))
  (default-to false (map-get? authorized-minters minter))
)

;; Admin functions
(define-public (set-token-uri (new-uri (string-utf8 256)))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (ok (var-set token-uri (some new-uri)))
  )
)

(define-public (pause-contract)
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (ok (var-set contract-paused true))
  )
)

(define-public (unpause-contract)
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (ok (var-set contract-paused false))
  )
)

Functions (15)

FunctionAccessArgs
get-nameread-only
get-symbolread-only
get-decimalsread-only
get-balanceread-onlyaccount: principal
get-total-supplyread-only
get-token-uriread-only
transferpublicamount: uint, sender: principal, recipient: principal, memo: (optional (buff 34
transfer-internalprivatesender: principal, recipient: principal, amount: uint
mintpublicamount: uint, recipient: principal
authorize-minterpublicminter: principal
revoke-minterpublicminter: principal
is-authorized-minterread-onlyminter: principal
set-token-uripublicnew-uri: (string-utf8 256
pause-contractpublic
unpause-contractpublic