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 }