Source Code

;; This contract implements the SIP-010 community-standard Fungible Token trait.
(impl-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)

;; Define the FT  internal name bradley-token
(define-fungible-token bradley-token u1000000000000000)  ;; max supply = 1,000,000 tokens times 10^6 units


;; Errors

(define-constant ERR_OWNER_ONLY          (err u100))
(define-constant ERR_NOT_TOKEN_OWNER     (err u101))
(define-constant ERR_INVALID_AMOUNT      (err u102))
(define-constant ERR_MAX_SUPPLY_REACHED  (err u103))
(define-constant ERR_PAYMENT_FAILED      (err u104))


;; Constants

(define-constant CONTRACT_OWNER   'STGDS0Y17973EN5TCHNHGJJ9B31XWQ5YXBQ0KQ2Y)
(define-constant TOKEN_URI        u"https://blue-lazy-bat-855.mypinata.cloud/ipfs/bafkreiheh6kb7jneke34ytqluttdzsfmoadgyjs6bc74aofxcbtel3isp4")   ;;  hosted metadata URL
(define-constant TOKEN_NAME       "Bradley Token")
(define-constant TOKEN_SYMBOL     "sBC")
(define-constant TOKEN_DECIMALS   u6)

(define-constant MINT_PRICE_PER_UNIT   u1)         ;; 1 microSTX per token unit  1 STX for 1 full token (1,000,000 units)
(define-constant MAX_SUPPLY_UNITS      u1000000000000000) ;; 1,000,000 tokens times 10^6 units

;; Read-only SIP-010 functions


(define-read-only (get-balance (who principal))
  (ok (ft-get-balance bradley-token who)))

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

(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-token-uri)
  (ok (some TOKEN_URI)))


;; Public functions


;; Anyone can mint  but must pay 1 STX per full token (pro rated by amount)
(define-public (mint (amount uint) (recipient principal))
  (let
    (
      (cost (* amount MINT_PRICE_PER_UNIT))
      (current-supply (ft-get-supply bradley-token))
      (new-supply (+ current-supply amount))
    )

    ;; Basic validations
    (asserts! (> amount u0) ERR_INVALID_AMOUNT)
    (asserts! (<= new-supply MAX_SUPPLY_UNITS) ERR_MAX_SUPPLY_REACHED)

    ;; Pay the deployer in STX
    (try! (stx-transfer? cost tx-sender CONTRACT_OWNER))

    ;; Mint the tokens to the recipient
    (ft-mint? bradley-token amount recipient)
  )
)

;; Standard SIP-010 transfer
(define-public (transfer
    (amount uint)
    (sender principal)
    (recipient principal)
    (memo (optional (buff 34))))
  (begin
    (asserts! (or (is-eq tx-sender sender) (is-eq contract-caller sender))
      ERR_NOT_TOKEN_OWNER)
    (try! (ft-transfer? bradley-token amount sender recipient))
    (match memo
      to-print (print to-print)
      0x)
    (ok true)))

Functions (8)

FunctionAccessArgs
get-balanceread-onlywho: principal
get-total-supplyread-only
get-nameread-only
get-symbolread-only
get-decimalsread-only
get-token-uriread-only
mintpublicamount: uint, recipient: principal
transferpublicamount: uint, sender: principal, recipient: principal, memo: (optional (buff 34