github.com/diadata-org/diadata@v1.4.593/pkg/utils/liquidity.go (about)

     1  package utils
     2  
     3  import "errors"
     4  
     5  const (
     6  	UNIV2_FEE_FACTOR = 997
     7  	UNIV2_FACTOR     = 1000
     8  )
     9  
    10  func UniV2AmountOut(amountIn float64, reserveIn float64, reserveOut float64) (float64, error) {
    11  	amountInWithFee := amountIn * UNIV2_FEE_FACTOR
    12  	if reserveIn <= 0 || amountInWithFee <= 0 {
    13  		return 0, errors.New("reserve in and amount in are not positive numbers.")
    14  	}
    15  	return amountInWithFee * reserveOut / ((reserveIn * UNIV2_FACTOR) + amountInWithFee), nil
    16  }
    17  
    18  func UniV2PriceReserveIn(reserveIn float64, reserveOut float64) (float64, error) {
    19  	if reserveIn == 0 {
    20  		return 0, errors.New("reserveIn is not positive number.")
    21  	}
    22  	return reserveOut / reserveIn, nil
    23  }
    24  
    25  func UniV2PriceAfterTrade(amountIn float64, reserveIn float64, reserveOut float64) (price float64, err error) {
    26  	if reserveIn == 0 {
    27  		return 0, errors.New("reserveIn is not positive number.")
    28  	}
    29  	amountOut, err := UniV2AmountOut(amountIn, reserveIn, reserveOut)
    30  	if err != nil {
    31  		return 0, err
    32  	}
    33  	newReserveOut := reserveOut - amountOut
    34  	return newReserveOut / (amountIn + reserveIn), nil
    35  }