github.com/status-im/status-go@v1.1.0/services/wallet/router/routes/route.go (about)

     1  package routes
     2  
     3  import (
     4  	"math"
     5  	"math/big"
     6  
     7  	"github.com/status-im/status-go/services/wallet/common"
     8  	"github.com/status-im/status-go/services/wallet/router/pathprocessor"
     9  )
    10  
    11  type Route []*Path
    12  
    13  func FindBestRoute(routes []Route, tokenPrice float64, nativeTokenPrice float64) Route {
    14  	var best Route
    15  	bestCost := big.NewFloat(math.Inf(1))
    16  	for _, route := range routes {
    17  		currentCost := big.NewFloat(0)
    18  		for _, path := range route {
    19  			tokenDenominator := big.NewFloat(math.Pow(10, float64(path.FromToken.Decimals)))
    20  
    21  			// calculate the cost of the path
    22  			nativeTokenPrice := new(big.Float).SetFloat64(nativeTokenPrice)
    23  
    24  			// tx fee
    25  			txFeeInEth := common.GweiToEth(common.WeiToGwei(path.TxFee.ToInt()))
    26  			pathCost := new(big.Float).Mul(txFeeInEth, nativeTokenPrice)
    27  
    28  			if path.TxL1Fee.ToInt().Cmp(pathprocessor.ZeroBigIntValue) > 0 {
    29  				txL1FeeInEth := common.GweiToEth(common.WeiToGwei(path.TxL1Fee.ToInt()))
    30  				pathCost.Add(pathCost, new(big.Float).Mul(txL1FeeInEth, nativeTokenPrice))
    31  			}
    32  
    33  			if path.TxBonderFees != nil && path.TxBonderFees.ToInt().Cmp(pathprocessor.ZeroBigIntValue) > 0 {
    34  				pathCost.Add(pathCost, new(big.Float).Mul(
    35  					new(big.Float).Quo(new(big.Float).SetInt(path.TxBonderFees.ToInt()), tokenDenominator),
    36  					new(big.Float).SetFloat64(tokenPrice)))
    37  
    38  			}
    39  
    40  			if path.TxTokenFees != nil && path.TxTokenFees.ToInt().Cmp(pathprocessor.ZeroBigIntValue) > 0 && path.FromToken != nil {
    41  				pathCost.Add(pathCost, new(big.Float).Mul(
    42  					new(big.Float).Quo(new(big.Float).SetInt(path.TxTokenFees.ToInt()), tokenDenominator),
    43  					new(big.Float).SetFloat64(tokenPrice)))
    44  			}
    45  
    46  			if path.ApprovalRequired {
    47  				// tx approval fee
    48  				approvalFeeInEth := common.GweiToEth(common.WeiToGwei(path.ApprovalFee.ToInt()))
    49  				pathCost.Add(pathCost, new(big.Float).Mul(approvalFeeInEth, nativeTokenPrice))
    50  
    51  				if path.ApprovalL1Fee.ToInt().Cmp(pathprocessor.ZeroBigIntValue) > 0 {
    52  					approvalL1FeeInEth := common.GweiToEth(common.WeiToGwei(path.ApprovalL1Fee.ToInt()))
    53  					pathCost.Add(pathCost, new(big.Float).Mul(approvalL1FeeInEth, nativeTokenPrice))
    54  				}
    55  			}
    56  
    57  			currentCost = new(big.Float).Add(currentCost, pathCost)
    58  		}
    59  
    60  		if currentCost.Cmp(bestCost) == -1 {
    61  			best = route
    62  			bestCost = currentCost
    63  		}
    64  	}
    65  
    66  	return best
    67  }