Source Code

;; TODO Add different error for different pairs
(define-constant ERR-GET-PAIR-BALANCE (err u109))


(define-constant ONE_8 u100000000)
(define-constant FIXED_POOL_WEIGHT u50000000)

;; ============================================================================================================
;;                                              STX-DIKO SWAPS
;; ============================================================================================================

(define-public (arkadiko-get-stx-diko-swap-result (stx-amount uint))
  (let 
    (
      (stx-diko-pair (unwrap! (contract-call? 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1 get-balances 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.wrapped-stx-token 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token) ERR-GET-PAIR-BALANCE))
      (stx-pool-balance (unwrap! (element-at? stx-diko-pair u0) ERR-GET-PAIR-BALANCE))
      (diko-pool-balance (unwrap! (element-at? stx-diko-pair u1) ERR-GET-PAIR-BALANCE))
      (stx-with-fees (/ (* u997 stx-amount) u1000))
    )
    (ok (/ (* stx-with-fees diko-pool-balance) (+ stx-with-fees stx-pool-balance)))
  )
)

(define-public (arkadiko-get-diko-stx-swap-result (diko-amount uint))
  (let 
    (
      (stx-diko-pair (unwrap! (contract-call? 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1 get-balances 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.wrapped-stx-token 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token) ERR-GET-PAIR-BALANCE))
      (stx-pool-balance (unwrap! (element-at? stx-diko-pair u0) ERR-GET-PAIR-BALANCE))
      (diko-pool-balance (unwrap! (element-at? stx-diko-pair u1) ERR-GET-PAIR-BALANCE))
      (diko-with-fees (/ (* u997 diko-amount) u1000))
    )
    (ok (/ (* diko-with-fees stx-pool-balance) (+ diko-with-fees diko-pool-balance)))
  )
)

(define-public (alexlab-get-stx-diko-swap-result (amount uint)) 
  (let 
    (
      (stx-amount (* amount u100))
      ;; GET STX-ALEX SWAP RESULT
      (stx-alex-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token ONE_8)))
      (stx-alex-fee (mul-up stx-amount (get fee-rate-x stx-alex-pool)))
      (stx-net-fees (if (<= stx-amount stx-alex-fee) u0 (- stx-amount stx-alex-fee)))
      (alex-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-y-given-x 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token ONE_8 stx-net-fees)))
      ;; GET ALEX-DIKO SWAP RESULT
      (alex-diko-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wdiko ONE_8)))
      (alex-diko-fee (mul-up alex-amount (get fee-rate-x alex-diko-pool)))
      (alex-net-fees (if (<= alex-amount alex-diko-fee) u0 (- alex-amount alex-diko-fee)))
      (diko-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-y-given-x 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wdiko ONE_8 alex-net-fees)))
    ) 
    (ok (/ diko-amount u100))
  )
)

(define-public (alexlab-get-diko-stx-swap-result (amount uint)) 
  (let 
    (
      (diko-amount (* amount u100))
      ;; GET DIKO-ALEX SWAP RESULT
      (alex-diko-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wdiko ONE_8)))
      (alex-diko-fee (mul-up diko-amount (get fee-rate-y alex-diko-pool)))
      (diko-net-fees (if (<= diko-amount alex-diko-fee) u0 (- diko-amount alex-diko-fee)))
      (alex-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-x-given-y 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wdiko ONE_8 diko-net-fees))) 
      ;; GET STX-ALEX SWAP RESULT
      (stx-alex-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token ONE_8)))
      (stx-alex-fee (mul-up alex-amount (get fee-rate-y stx-alex-pool)))
      (alex-net-fees (if (<= alex-amount stx-alex-fee) u0 (- alex-amount stx-alex-fee)))
      (stx-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-x-given-y 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token ONE_8 alex-net-fees)))
    ) 
    (ok (/ stx-amount u100))
  )
)

(define-public (get-expected-diko-amount-with-best-ratio-swap (stx-amount uint))
  (let 
    (
      (alex-expected-swap-amount (try! (alexlab-get-stx-diko-swap-result stx-amount)))
      (arkadiko-expected-swap-amount (try! (arkadiko-get-stx-diko-swap-result stx-amount)))
    )
    (if (> alex-expected-swap-amount arkadiko-expected-swap-amount) 
      (ok alex-expected-swap-amount)
      (ok arkadiko-expected-swap-amount)
    )
  )
)

;; ============================================================================================================
;;                                              STX-USDA SWAPS
;; ============================================================================================================

(define-public (arkadiko-get-stx-usda-swap-result (stx-amount uint))
  (let 
    (
      (stx-usda-pair (unwrap! (contract-call? 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1 get-balances 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.wrapped-stx-token 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token) ERR-GET-PAIR-BALANCE))
      (stx-pool-balance (unwrap! (element-at? stx-usda-pair u0) ERR-GET-PAIR-BALANCE))
      (usda-pool-balance (unwrap! (element-at? stx-usda-pair u1) ERR-GET-PAIR-BALANCE))
      (stx-with-fees (/ (* u997 stx-amount) u1000))
    )
    (ok (/ (* stx-with-fees usda-pool-balance) (+ stx-with-fees stx-pool-balance)))
  )
)

(define-public (arkadiko-get-usda-stx-swap-result (usda-amount uint))
  (let 
    (
      (stx-usda-pair (unwrap! (contract-call? 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1 get-balances 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.wrapped-stx-token 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token) ERR-GET-PAIR-BALANCE))
      (stx-pool-balance (unwrap! (element-at? stx-usda-pair u0) ERR-GET-PAIR-BALANCE))
      (usda-pool-balance (unwrap! (element-at? stx-usda-pair u1) ERR-GET-PAIR-BALANCE))
      (usda-with-fees (/ (* u997 usda-amount) u1000))
    )
    (ok (/ (* usda-with-fees stx-pool-balance) (+ usda-with-fees usda-pool-balance)))
  )
)

(define-public (alexlab-get-stx-usda-swap-result (amount uint)) 
  (let 
    (
      (stx-amount (* amount u100))
      ;; GET STX-ALEX SWAP RESULT
      (stx-alex-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.fixed-weight-pool-v1-01 get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token FIXED_POOL_WEIGHT FIXED_POOL_WEIGHT)))
      (stx-alex-fee (mul-up stx-amount (get fee-rate-x stx-alex-pool)))
      (stx-net-fees (if (<= stx-amount stx-alex-fee) u0 (- stx-amount stx-alex-fee)))
      (alex-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.fixed-weight-pool-v1-01 get-y-given-wstx 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token FIXED_POOL_WEIGHT stx-net-fees)))
      ;; GET ALEX-USDA SWAP RESULT
      (alex-usda-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.simple-weight-pool-alex get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wusda)))
      (alex-usda-fee (mul-up alex-amount (get fee-rate-x alex-usda-pool)))
      (alex-net-fees (if (<= alex-amount alex-usda-fee) u0 (- alex-amount alex-usda-fee)))
      (usda-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.simple-weight-pool-alex get-y-given-alex 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wusda alex-net-fees)))
    ) 
    (ok (/ usda-amount u100))
  )
)

(define-public (alexlab-get-usda-stx-swap-result (amount uint)) 
  (let 
    (
      (usda-amount (* amount u100))
      ;; GET DIKO-ALEX SWAP RESULT
      (alex-usda-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.simple-weight-pool-alex get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wusda)))
      (alex-usda-fee (mul-up usda-amount (get fee-rate-y alex-usda-pool)))
      (usda-net-fees (if (<= usda-amount alex-usda-fee) u0 (- usda-amount alex-usda-fee)))
      (alex-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.simple-weight-pool-alex get-alex-given-y 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wusda usda-net-fees))) 
      ;; GET STX-ALEX SWAP RESULT
      (stx-alex-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.fixed-weight-pool-v1-01 get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token FIXED_POOL_WEIGHT FIXED_POOL_WEIGHT)))
      (stx-alex-fee (mul-up alex-amount (get fee-rate-y stx-alex-pool)))
      (alex-net-fees (if (<= alex-amount stx-alex-fee) u0 (- alex-amount stx-alex-fee)))
      ;; (dx (try! (get-wstx-given-y token-y weight-y dy-net-fees)))
      (stx-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.fixed-weight-pool-v1-01 get-wstx-given-y 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token FIXED_POOL_WEIGHT alex-net-fees)))
    ) 
    (ok (/ stx-amount u100))
  )
)

(define-public (get-expected-usda-amount-with-best-ratio-swap (stx-amount uint))
  (let 
    (
      (alex-expected-swap-amount (try! (alexlab-get-stx-usda-swap-result stx-amount)))
      (arkadiko-expected-swap-amount (try! (arkadiko-get-stx-usda-swap-result stx-amount)))
    )
    (if (> alex-expected-swap-amount arkadiko-expected-swap-amount) 
      (ok alex-expected-swap-amount)
      (ok arkadiko-expected-swap-amount)
    )
  )
)


;; ============================================================================================================
;;                                              STX-USDA SWAPS
;; ============================================================================================================

(define-public (arkadiko-get-diko-usda-swap-result (diko-amount uint))
  (let 
    (
      (diko-usda-pair (unwrap! (contract-call? 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1 get-balances 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token) ERR-GET-PAIR-BALANCE))
      (diko-pool-balance (unwrap! (element-at? diko-usda-pair u0) ERR-GET-PAIR-BALANCE))
      (usda-pool-balance (unwrap! (element-at? diko-usda-pair u1) ERR-GET-PAIR-BALANCE))
      (diko-with-fees (/ (* u997 diko-amount) u1000))
    )
    (ok (/ (* diko-with-fees usda-pool-balance) (+ diko-with-fees diko-pool-balance)))
  )
)

(define-public (arkadiko-get-usda-diko-swap-result (usda-amount uint))
  (let 
    (
      (diko-usda-pair (unwrap! (contract-call? 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1 get-balances 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token) ERR-GET-PAIR-BALANCE))
      (diko-pool-balance (unwrap! (element-at? diko-usda-pair u0) ERR-GET-PAIR-BALANCE))
      (usda-pool-balance (unwrap! (element-at? diko-usda-pair u1) ERR-GET-PAIR-BALANCE))
      (usda-with-fees (/ (* u997 usda-amount) u1000))
    )
    (ok (/ (* usda-with-fees diko-pool-balance) (+ usda-with-fees usda-pool-balance)))
  )
)

(define-public (alexlab-get-diko-usda-swap-result (amount uint)) 
  (let 
    (
      (diko-amount (* amount u100))
      ;; GET DIKO-ALEX SWAP RESULT
      (alex-diko-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wdiko ONE_8)))
      (alex-diko-fee (mul-up diko-amount (get fee-rate-y alex-diko-pool)))
      (diko-net-fees (if (<= diko-amount alex-diko-fee) u0 (- diko-amount alex-diko-fee)))
      (alex-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-x-given-y 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wdiko ONE_8 diko-net-fees))) 
      ;; GET ALEX-USDA SWAP RESULT
      (alex-usda-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.simple-weight-pool-alex get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wusda)))
      (alex-usda-fee (mul-up alex-amount (get fee-rate-x alex-usda-pool)))
      (alex-net-fees (if (<= alex-amount alex-usda-fee) u0 (- alex-amount alex-usda-fee)))
      (usda-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.simple-weight-pool-alex get-y-given-alex 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wusda alex-net-fees)))
    ) 
    (ok (/ usda-amount u100))
  )
)

(define-public (alexlab-get-usda-diko-swap-result (amount uint)) 
  (let 
    (
      (usda-amount (* amount u100))
      ;; GET USDA-ALEX SWAP RESULT
      (alex-usda-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.simple-weight-pool-alex get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wusda)))
      (alex-usda-fee (mul-up usda-amount (get fee-rate-y alex-usda-pool)))
      (usda-net-fees (if (<= usda-amount alex-usda-fee) u0 (- usda-amount alex-usda-fee)))
      (alex-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.simple-weight-pool-alex get-alex-given-y 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wusda usda-net-fees)))
      ;; GET ALEX-DIKO SWAP RESULT
      (alex-diko-pool (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-pool-details 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wdiko ONE_8)))
      (alex-diko-fee (mul-up alex-amount (get fee-rate-x alex-diko-pool)))
      (alex-net-fees (if (<= alex-amount alex-diko-fee) u0 (- alex-amount alex-diko-fee)))
      (diko-amount (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1 get-x-given-y 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wdiko ONE_8 alex-net-fees))) 
    ) 
    (ok (/ usda-amount u100))
  )
)


(define-private (mul-up (a uint) (b uint))
  (let ((product (* a b)))
    (if (is-eq product u0)
      u0
      (+ u1 (/ (- product u1) ONE_8))
    )
  )
)

Functions (15)

FunctionAccessArgs
arkadiko-get-stx-diko-swap-resultpublicstx-amount: uint
arkadiko-get-diko-stx-swap-resultpublicdiko-amount: uint
alexlab-get-stx-diko-swap-resultpublicamount: uint
alexlab-get-diko-stx-swap-resultpublicamount: uint
get-expected-diko-amount-with-best-ratio-swappublicstx-amount: uint
arkadiko-get-stx-usda-swap-resultpublicstx-amount: uint
arkadiko-get-usda-stx-swap-resultpublicusda-amount: uint
alexlab-get-stx-usda-swap-resultpublicamount: uint
alexlab-get-usda-stx-swap-resultpublicamount: uint
get-expected-usda-amount-with-best-ratio-swappublicstx-amount: uint
arkadiko-get-diko-usda-swap-resultpublicdiko-amount: uint
arkadiko-get-usda-diko-swap-resultpublicusda-amount: uint
alexlab-get-diko-usda-swap-resultpublicamount: uint
alexlab-get-usda-diko-swap-resultpublicamount: uint
mul-upprivatea: uint, b: uint