Source Code

;; ;; we implement the sip-010 + a mint function liquidity-token-soft-trait
(impl-trait 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.liquidity-token-trait-v2a.liquidity-token-trait)
(impl-trait 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.initializable-trait-v1a.initializable-liquidity-token-trait)
(use-trait sip-010-token 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.sip-010-v1a.sip-010-trait)

;; ;; we can use an ft-token here, so use it!
(define-fungible-token liquidity-token)

(define-constant no-acccess-err u4204)

;; Error returned for permission denied - stolen from http 403
(define-constant ERR_UNAUTHORIZED u4205)
(define-constant PERMISSION_DENIED_ERROR u4206)
(define-constant TOKEN_TRANSFER_ERR u4207)
(define-constant ALREADY_INITIALIZED u4208)
(define-constant NOT_INITIALIZED u4209)
(define-constant INVALID_LP_TOKEN_ERR u4210)
(define-constant INVALID_TOKEN_ERR u4211)
(define-constant ALREADY_IN_SWAP u4211)


(define-constant NULL_PRINCIPAL tx-sender)

;; Track who deployed the token and whether it has been initialized
(define-data-var deployer-principal principal tx-sender)

(define-data-var is-initialized bool false)
(define-data-var is-in-swap bool false)


(define-data-var token-name (string-ascii 32) "")
(define-data-var token-symbol (string-ascii 32) "")
(define-data-var token-decimals uint u0)


;; DATA for LP
(define-data-var token-x principal NULL_PRINCIPAL)
(define-data-var token-y principal NULL_PRINCIPAL)

(define-data-var shares-total uint u0)
(define-data-var balance-x uint u0)
(define-data-var balance-y uint u0)
(define-data-var fee-balance-x uint u0)
(define-data-var fee-balance-y uint u0)
(define-data-var fee-to-address principal tx-sender)


;; implement all functions required by sip-010

(define-public (transfer (amount uint) (from principal) (to principal) (memo (optional (buff 34))))
  (begin
    (asserts! (is-eq from tx-sender) (err ERR_UNAUTHORIZED))
    (if (is-some memo)
      (print memo)
      none
    )
    (ft-transfer? liquidity-token amount from to)
  )
)

;; Returns the token name
(define-read-only (get-name)
  (ok (var-get token-name)))

;; Returns the symbol or "ticker" for this token
(define-read-only (get-symbol)
  (ok (var-get token-symbol)))

;; Returns the number of decimals used
(define-read-only (get-decimals)
  (ok (var-get token-decimals)))

(define-read-only (get-balance (owner principal))
  (ok (ft-get-balance liquidity-token owner))
)

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

;; Variable for URI storage
(define-data-var uri (string-utf8 256) u"")

;; Public getter for the URI
(define-read-only (get-token-uri)
  (ok (some (var-get uri))))


;; one stop function to gather all the data relevant to the liquidity token in one call
(define-read-only (get-data (owner principal))
  (ok {
    name: (unwrap-panic (get-name)),
    symbol: (unwrap-panic (get-symbol)),
    decimals: (unwrap-panic (get-decimals)),
    uri: (unwrap-panic (get-token-uri)),
    supply: (unwrap-panic (get-total-supply)),
    balance: (unwrap-panic (get-balance owner))
  })
)

;; the extra mint method used by stackswap when adding liquidity
;; can only be used by STACKSWAP main contract
(define-public (mint (recipient principal) (amount uint))
  (begin
    (print "token-liquidity.mint")
    (print (some contract-caller))
    ;; (print (contract-call? 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-dao-v4a get-qualified-name-by-name "swap"))
    (print amount)
    (asserts! (is-eq contract-caller (unwrap-panic (contract-call? 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-dao-v4a get-qualified-name-by-name "swap"))) (err no-acccess-err))
    (ft-mint? liquidity-token amount recipient)
  )
)

;; the extra burn method used by STACKSWAP when removing liquidity
;; can only be used by STACKSWAP main contract
(define-public (burn (recipient principal) (amount uint))
  (begin
    (print "token-liquidity.burn")
    (print contract-caller)
    (print amount)
    (asserts! (is-eq contract-caller (unwrap-panic (contract-call? 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-dao-v4a get-qualified-name-by-name "swap"))) (err no-acccess-err))
    (ft-burn? liquidity-token amount recipient)
  )
)

(define-public (initialize (name-to-set (string-ascii 32)) (symbol-to-set (string-ascii 32)) (decimals-to-set uint) (uri-to-set (string-utf8 256)))
  (begin
    (print "token-liquidity.init")
    (print contract-caller)
    (asserts! (is-eq contract-caller (unwrap-panic (contract-call? 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-dao-v4a get-qualified-name-by-name "one-step-mint"))) (err no-acccess-err))
    (asserts! (not (var-get is-initialized)) (err ALREADY_INITIALIZED))
    (var-set is-initialized true) ;; Set to true so that this can't be called again
    (var-set token-name name-to-set)
    (var-set token-symbol symbol-to-set)
    (var-set token-decimals decimals-to-set)
    (var-set uri uri-to-set)
    ;; (map-set roles { role: MINTER_ROLE, account: initial-owner } { allowed: true })
    (ok u0)
  )
)


(define-public (transfer-token (amount uint) (token <sip-010-token>) (to principal) )
  (begin
    (asserts! (is-eq contract-caller (unwrap-panic (contract-call? 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-dao-v4a get-qualified-name-by-name "swap"))) (err no-acccess-err))
    (unwrap! (as-contract (contract-call? token transfer amount tx-sender to none)) (err TOKEN_TRANSFER_ERR))
    (ok true)
  )
)

(define-public (initialize-swap (token-x-input principal) (token-y-input principal))
  (begin
    (print "token-liquidity.init")
    (print contract-caller)
    (asserts! (is-eq contract-caller (unwrap-panic (contract-call? 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-dao-v4a get-qualified-name-by-name "swap"))) (err no-acccess-err))
    (asserts!  (var-get is-initialized) (err NOT_INITIALIZED))
    (asserts! (not (var-get is-in-swap)) (err ALREADY_IN_SWAP))
    (var-set is-in-swap true) ;; Set to true so that this can't be called again
    (var-set token-x token-x-input)
    (var-set token-y token-y-input)
    (ok true)
  )
)

(define-public (set-lp-data ( data {
    shares-total: uint,
    balance-x: uint,
    balance-y: uint,
    fee-balance-x: uint,
    fee-balance-y: uint,
    fee-to-address: principal,
    liquidity-token: principal,
    name: (string-ascii 32),
  }) (token-x-input principal) (token-y-input principal))
  (begin
    (asserts! (is-eq contract-caller (unwrap-panic (contract-call? 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-dao-v4a get-qualified-name-by-name "swap"))) (err no-acccess-err))
    (asserts! (is-eq (as-contract tx-sender) (get liquidity-token data)) (err INVALID_LP_TOKEN_ERR))
    (asserts! (is-eq token-x-input (var-get token-x)) (err INVALID_TOKEN_ERR))
    (asserts! (is-eq token-y-input (var-get token-y)) (err INVALID_TOKEN_ERR))
    (var-set shares-total (get shares-total data))
    (var-set balance-x (get balance-x data))
    (var-set balance-y (get balance-y data))
    (var-set fee-balance-x (get fee-balance-x data))
    (var-set fee-balance-y (get fee-balance-y data))
    (var-set fee-to-address (get fee-to-address data))
    (ok true)
  )
)

(define-read-only (get-lp-data)
  (begin
    (ok {
    shares-total: (var-get shares-total),
    balance-x: (var-get balance-x),
    balance-y: (var-get balance-y),
    fee-balance-x: (var-get fee-balance-x),
    fee-balance-y: (var-get fee-balance-y),
    fee-to-address: (var-get fee-to-address),
    liquidity-token: (as-contract tx-sender),
    name: (var-get token-name),
    })
  )
)


;; Returns the token name
(define-read-only (get-token-x)
  (ok (var-get token-x)))
  
;; Returns the token name
(define-read-only (get-token-y)
  (ok (var-get token-y)))

 (contract-call? 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-one-step-mint-v4a add-liquidity-token (as-contract tx-sender))

Functions (15)

FunctionAccessArgs
transferpublicamount: uint, from: principal, to: principal, memo: (optional (buff 34
get-nameread-only
get-symbolread-only
get-decimalsread-only
get-balanceread-onlyowner: principal
get-total-supplyread-only
get-token-uriread-only
get-dataread-onlyowner: principal
mintpublicrecipient: principal, amount: uint
burnpublicrecipient: principal, amount: uint
initializepublicname-to-set: (string-ascii 32
initialize-swappublictoken-x-input: principal, token-y-input: principal
get-lp-dataread-only
get-token-xread-only
get-token-yread-only