Source Code

(impl-trait .dex-aggregator-trait.dex-aggregator-trait)
(use-trait ft-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
(use-trait ft-trait-ext 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.trait-sip-010.sip-010-trait)


(define-constant ERR-INVALID-ROUTE (err u100))
(define-constant ERR-ALEX-ROUTES-NOT-SET (err u101))


(define-read-only (get-quote (amt-in uint) (route1 (optional (list 5 <ft-trait>))) (route2 (optional (list 5 <ft-trait-ext>))) (factors (optional (list 4 uint))))
  (let
    (
      (route (unwrap! route2 ERR-ALEX-ROUTES-NOT-SET))
      (n (len route))
      (unwrapped-factors (unwrap! factors ERR-INVALID-ROUTE))
      (m (len unwrapped-factors))
      (t1 (element-at? route u0))
      (t2 (element-at? route u1))
      (t3 (element-at? route u2))
      (t4 (element-at? route u3))
      (t5 (element-at? route u4))
      (f1 (default-to u0 (element-at? unwrapped-factors u0)))
      (f2 (default-to u0 (element-at? unwrapped-factors u1)))
      (f3 (default-to u0 (element-at? unwrapped-factors u2)))
      (f4 (default-to u0 (element-at? unwrapped-factors u3)))
    )

    ;; check that route is valid
    ;; (asserts! (> n u1) ERR-INVALID-ROUTE)

    (if (and (is-eq n u2) (is-eq m u1))
      (let (
        (t1a (unwrap-panic t1))
        (t2a (unwrap-panic t2))
        (t2-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t1a) (contract-of t2a) f1 amt-in)))
        )
        (ok {
          t2-out: t2-out,
          t3-out: u0,
          t4-out: u0,
          t5-out: u0,
        })
      )
      (if (and (is-eq n u3) (is-eq m u2))
        (let (
          (t1a (unwrap-panic t1))
          (t2a (unwrap-panic t2))
          (t3a (unwrap-panic t3))
          (t2-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t1a) (contract-of t2a) f1 amt-in)))
          (t3-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t2a) (contract-of t3a) f2 t2-out)))
          )
          (ok {
            t2-out: t2-out,
            t3-out: t3-out,
            t4-out: u0,
            t5-out: u0,
          })
        )
        (if (and (is-eq n u4) (is-eq m u3))
          (let (
            (t1a (unwrap-panic t1))
            (t2a (unwrap-panic t2))
            (t3a (unwrap-panic t3))
            (t4a (unwrap-panic t4))
            (t2-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t1a) (contract-of t2a) f1 amt-in)))
            (t3-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t2a) (contract-of t3a) f2 t2-out)))
            (t4-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t3a) (contract-of t4a) f3 t3-out)))
            )
            (ok {
              t2-out: t2-out,
              t3-out: t3-out,
              t4-out: t4-out,
              t5-out: u0,
            })
          )
          (let (
            (t1a (unwrap-panic t1))
            (t2a (unwrap-panic t2))
            (t3a (unwrap-panic t3))
            (t4a (unwrap-panic t4))
            (t5a (unwrap-panic t5))
            (t2-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t1a) (contract-of t2a) f1 amt-in)))
            (t3-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t2a) (contract-of t3a) f2 t2-out)))
            (t4-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t3a) (contract-of t4a) f3 t3-out)))
            (t5-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 get-helper (contract-of t4a) (contract-of t5a) f4 t4-out)))
            )
            (ok {
              t2-out: t2-out,
              t3-out: t3-out,
              t4-out: t4-out,
              t5-out: t5-out,
            })
          )
        )
      )
    )
  )
)



(define-public (swap (amt-in uint) (amt-out-min uint) (route1 (optional (list 5 <ft-trait>))) (route2 (optional (list 5 <ft-trait-ext>))) (factors (optional (list 4 uint))))
  (let
    (
      (route (unwrap! route2 ERR-ALEX-ROUTES-NOT-SET))
      (n (len route))
      (unwrapped-factors (unwrap! factors ERR-INVALID-ROUTE))
      (m (len unwrapped-factors))
      (t1 (element-at? route u0))
      (t2 (element-at? route u1))
      (t3 (element-at? route u2))
      (t4 (element-at? route u3))
      (t5 (element-at? route u4))
      (f1 (default-to u0 (element-at? unwrapped-factors u0)))
      (f2 (default-to u0 (element-at? unwrapped-factors u1)))
      (f3 (default-to u0 (element-at? unwrapped-factors u2)))
      (f4 (default-to u0 (element-at? unwrapped-factors u3)))
    )
    
    ;; ensure correct number of tokens in route
    (asserts! (> n u1) ERR-INVALID-ROUTE)

    (if (is-eq n u2)
      (let (
        (t1a (unwrap-panic t1))
        (t2a (unwrap-panic t2))
        (t2-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t1a t2a f1 amt-in (some amt-out-min))))
        )
        (ok {
            t2-out: t2-out,
            t3-out: u0,
            t4-out: u0,
            t5-out: u0,
          })
      )
      (if (is-eq n u3)
        (let (
          (t1a (unwrap-panic t1))
          (t2a (unwrap-panic t2))
          (t3a (unwrap-panic t3))
          (t2-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t1a t2a f1 amt-in none))) 
          (t3-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t2a t3a f2 t2-out (some amt-out-min)))) 
          )
          (ok {
            t2-out: t2-out,
            t3-out: t3-out,
            t4-out: u0,
            t5-out: u0,
          })
        )
        (if (is-eq n u4)
          (let (
            (t1a (unwrap-panic t1))
            (t2a (unwrap-panic t2))
            (t3a (unwrap-panic t3))
            (t4a (unwrap-panic t4))
            (t2-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t1a t2a f1 amt-in none))) 
            (t3-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t2a t3a f2 t2-out none))) 
            (t4-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t3a t4a f3 t3-out (some amt-out-min)))) 
            )
            (ok {
              t2-out: t2-out,
              t3-out: t3-out,
              t4-out: t4-out,
              t5-out: u0,
            })
          )
          (let (
            (t1a (unwrap-panic t1))
            (t2a (unwrap-panic t2))
            (t3a (unwrap-panic t3))
            (t4a (unwrap-panic t4))
            (t5a (unwrap-panic t5))
            (t2-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t1a t2a f1 amt-in none))) 
            (t3-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t2a t3a f2 t2-out none))) 
            (t4-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t3a t4a f3 t3-out none))) 
            (t5-out (try! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper t4a t5a f4 t4-out (some amt-out-min)))) 
            )
            (ok {
              t2-out: t2-out,
              t3-out: t3-out,
              t4-out: t4-out,
              t5-out: t5-out,
            })
          )
        )
      )
    )
  )
)

Functions (2)

FunctionAccessArgs
get-quoteread-onlyamt-in: uint, route1: (optional (list 5 <ft-trait>
swappublicamt-in: uint, amt-out-min: uint, route1: (optional (list 5 <ft-trait>