Source Code

;; autoclaw.clar

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Constants
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Asset IDs as used in your TypeScript config
(define-constant STX-ID "STX")
(define-constant STSTX-ID "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token")

;; Bitflow STX/stSTX StableSwap pool (mainnet)
(define-constant STABLESWAP-STX-STSTX
  'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2)

;; stSTX SIP-010 token contract (y-token)
(define-constant STSTX-TOKEN
  'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token)

;; LP token contract for STX/stSTX pool (lp-token)
(define-constant STX-STSTX-LP
  'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stx-ststx-lp-token-v-1-2)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Errors
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define-constant ERR-UNSUPPORTED-PAIR u100)
(define-constant ERR-SWAP-FAILED u101)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Public entrypoint (called from backend)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define-public (swap-exact-in
    (asset-in-id (string-ascii 128))
    (asset-out-id (string-ascii 128))
    (amount-in uint)
    (min-amount-out uint)
  )
  (begin
    ;; Case 1: STX -> stSTX (X -> Y)
    (if (and (is-eq asset-in-id STX-ID) (is-eq asset-out-id STSTX-ID))
        (let ((res (contract-call? STABLESWAP-STX-STSTX
                    swap-x-for-y
                    STSTX-TOKEN      ;; y-token
                    STX-STSTX-LP     ;; lp-token
                    amount-in        ;; x-amount (STX)
                    min-amount-out   ;; min-y-amount (stSTX)
                    )))
          (if (is-ok res)
            (ok (unwrap-panic res))
            (err ERR-SWAP-FAILED)))
        ;; Case 2: stSTX -> STX (Y -> X)
        (if (and (is-eq asset-in-id STSTX-ID) (is-eq asset-out-id STX-ID))
            (let ((res (contract-call? STABLESWAP-STX-STSTX
                        swap-y-for-x
                        STSTX-TOKEN      ;; y-token
                        STX-STSTX-LP     ;; lp-token
                        amount-in        ;; y-amount (stSTX)
                        min-amount-out   ;; min-x-amount (STX)
                        )))
              (if (is-ok res)
                (ok (unwrap-panic res))
                (err ERR-SWAP-FAILED)))
            ;; Anything else is unsupported
            (err ERR-UNSUPPORTED-PAIR))
    )
  )
)

Functions (1)

FunctionAccessArgs
swap-exact-inpublicasset-in-id: (string-ascii 128