;; Traits
(use-trait keeper-ft-trait 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.sip-010-trait-ft-standard.sip-010-trait)
(use-trait xyk-pool-trait 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-trait-v-1-2.xyk-pool-trait)
;; Helper functions for legacy pool swaps
(define-public (swap-legacy-x-to-y (amount uint) (min-out uint))
(contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2 swap-x-for-y
'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token
'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stx-ststx-lp-token-v-1-2
amount
min-out))
(define-public (swap-legacy-y-to-x (amount uint) (min-out uint))
(contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2 swap-y-for-x
'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token
'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stx-ststx-lp-token-v-1-2
amount
min-out))
;; Helper functions for legacy pool quotes
(define-public (quote-legacy-x-to-y (amount uint))
(let (
(y-token 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token)
(lp-token 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stx-ststx-lp-token-v-1-2)
(quote-result (unwrap-panic (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2 get-dy y-token lp-token amount))))
(ok quote-result)))
(define-public (quote-legacy-y-to-x (amount uint))
(let (
(y-token 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token)
(lp-token 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stx-ststx-lp-token-v-1-2)
(quote-result (unwrap-panic (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2 get-dx y-token lp-token amount))))
(ok quote-result)))
;; Check if input and output tokens are swapped relative to the pool's x and y tokens
(define-private (is-xyk-path-reversed
(token-in <keeper-ft-trait>)
(token-out <keeper-ft-trait>)
(pool-contract <xyk-pool-trait>)
)
(let (
(pool-data (unwrap-panic (contract-call? pool-contract get-pool)))
)
(not
(and
(is-eq (contract-of token-in) (get x-token pool-data))
(is-eq (contract-of token-out) (get y-token pool-data))
)
)
)
)
;; Perform XYK swap using swap-x-for-y or swap-y-for-x based on token path
(define-public (xyk-sa
(amount uint)
(token-in <keeper-ft-trait>)
(token-out <keeper-ft-trait>)
(pool <xyk-pool-trait>)
)
(let (
;; Determine if the token path is reversed
(is-reversed (is-xyk-path-reversed token-in token-out pool))
;; Perform swap based on path
(swap-a (if (is-eq is-reversed false)
(try! (contract-call?
'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-core-v-1-2 swap-x-for-y
pool
token-in token-out
amount u1))
(try! (contract-call?
'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-core-v-1-2 swap-y-for-x
pool
token-out token-in
amount u1))))
)
(ok swap-a)
)
)
;; Get XYK quote using get-dy or get-dx based on token path
(define-public (xyk-qa
(amount uint)
(token-in <keeper-ft-trait>)
(token-out <keeper-ft-trait>)
(pool <xyk-pool-trait>)
)
(let (
;; Determine if the token path is reversed
(is-reversed (is-xyk-path-reversed token-in token-out pool))
;; Get quote based on path
(quote-a (if (is-eq is-reversed false)
(try! (contract-call?
'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-core-v-1-2 get-dy
pool
token-in token-out
amount))
(try! (contract-call?
'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-core-v-1-2 get-dx
pool
token-out token-in
amount))))
)
(ok quote-a)
)
)