;; 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))
)
)
)