Source Code

;;; UniswapV2Library.sol

(define-constant err-library-preconditions (err u300))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; quote
(define-read-only
  (quote
    (amt-in      uint)
    (reserve-in  uint)
    (reserve-out uint))

  (begin

    (asserts!
      (and (> amt-in      u0)
           (> reserve-in  u0)
           (> reserve-out u0))
      err-library-preconditions)

     (ok (/ (* amt-in reserve-out)
            reserve-in) )))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; get-amount-out
(define-read-only
   (get-amount-out
     (amt-in       uint)
     (reserve-in   uint)
     (reserve-out  uint)
     (swap-fee     (tuple (num uint) (den uint)))
     )

    (let ((dummy-fee       {num: u500, den: u1000})
          (amts            (contract-call? .univ2-core calc-swap
                             amt-in swap-fee dummy-fee dummy-fee))
          (amt-in-adjusted (get amt-in-adjusted amts)) )

    (asserts!
        (and (> amt-in          u0)
             (> amt-in-adjusted u0)
             (> reserve-in      u0)
             (> reserve-out     u0))
        err-library-preconditions)

    (ok (/ (* amt-in-adjusted reserve-out)
           (+ reserve-in amt-in-adjusted)) )))

;; (reserve-out - amt-out)*(reserve-in + amt-in-adjusted) >= reserve-in*reserve-out
;;
;; reserve-out*reserve-in + reserve-out*amt-in-adjusted
;; - amt-out*(reserve-in + amt-in-adjusted) >= reserve-in*reserve-out
;;
;; reserve-out*reserve-in + reserve-out*amt-in-adjusted
;; - reserve-in*reserve-out >= amt-out * (reserve-in + amt-in-adjusted)
;;
;; (reserve-out * amt-in-adjusted) / (reserve-in + amt-in-adjusted) >= amt-out

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; get-amount-in
(define-read-only
   (get-amount-in
     (amt-out     uint)
     (reserve-in  uint)
     (reserve-out uint)
     (swap-fee    (tuple (num uint) (den uint))) )

  (begin
    (asserts!
        (and (> amt-out     u0)
             (> reserve-in  u0)
             (> reserve-out u0))
        err-library-preconditions)

    (let ((x (+ (/ (* reserve-in amt-out)
                   (- reserve-out amt-out)) u1))
          (y (/ (* x (get den swap-fee)) (get num swap-fee))) )
        (ok (+ y u1) ))))

;; amt-in = (reserve-in * amt-out) / (reserve-out - amt-out) * 1/fee
;; <-->
;; amt-out = amt-in*fee*reserve-out / (reserve-in + amt-in*fee)
;;
;; reserve-in*amt-out + amt-in*fee*amt-out = amt-in*fee*reserve-out
;; reserve-in*amt-out/amt-in*fee + amt-out = reserve-out
;; reserve-in*amt-out/amt-in*fee = reserve-out - amt-out
;; amt-in*fee = (reserve-in*amt-out)/(reserve-out - amt-out)
;; amt-in = (reserve-in * amt-out) / (reserve-out - amt-out) * 1/fee

;;; eof

Functions (3)

FunctionAccessArgs
quoteread-onlyamt-in: uint, reserve-in: uint, reserve-out: uint
get-amount-outread-onlyamt-in: uint, reserve-in: uint, reserve-out: uint, swap-fee: (tuple (num uint, den: uint
get-amount-inread-onlyamt-out: uint, reserve-in: uint, reserve-out: uint, swap-fee: (tuple (num uint, den: uint