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 }