package arbitrage import ( "fmt" "math/big" "github.com/fraktal/mev-beta/pkg/math" ) var sharedDecimalConverter = math.NewDecimalConverter() // universalFromWei converts a wei-denominated big.Int into a UniversalDecimal with 18 decimals. // It gracefully handles nil values by returning a zero amount. func universalFromWei(dec *math.DecimalConverter, value *big.Int, symbol string) *math.UniversalDecimal { if dec == nil { dec = sharedDecimalConverter } if value == nil { zero, _ := math.NewUniversalDecimal(big.NewInt(0), 18, symbol) return zero } return dec.FromWei(value, 18, symbol) } func universalOrFromWei(dec *math.DecimalConverter, decimal *math.UniversalDecimal, fallback *big.Int, decimals uint8, symbol string) *math.UniversalDecimal { if decimal != nil { return decimal } if fallback == nil { zero, _ := math.NewUniversalDecimal(big.NewInt(0), decimals, symbol) return zero } if dec == nil { dc := sharedDecimalConverter return dc.FromWei(fallback, decimals, symbol) } return dec.FromWei(fallback, decimals, symbol) } func floatStringFromDecimal(ud *math.UniversalDecimal, precision int) string { if precision < 0 { precision = int(ud.Decimals) } if ud == nil { if precision <= 0 { return "0" } return fmt.Sprintf("0.%0*d", precision, 0) } if ud.Decimals == 0 { return ud.Value.String() } numerator := new(big.Int).Set(ud.Value) denominator := new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(ud.Decimals)), nil) rat := new(big.Rat).SetFrac(numerator, denominator) return rat.FloatString(precision) } func ethAmountString(dec *math.DecimalConverter, decimal *math.UniversalDecimal, wei *big.Int) string { if dec == nil { dec = sharedDecimalConverter } ud := universalOrFromWei(dec, decimal, wei, 18, "ETH") return floatStringFromDecimal(ud, 6) } func gweiAmountString(dec *math.DecimalConverter, decimal *math.UniversalDecimal, wei *big.Int) string { if dec == nil { dec = sharedDecimalConverter } if decimal != nil { return floatStringFromDecimal(decimal, 2) } if wei == nil { return "0.00" } numerator := new(big.Rat).SetInt(wei) denominator := new(big.Rat).SetInt(big.NewInt(1_000_000_000)) return new(big.Rat).Quo(numerator, denominator).FloatString(2) } // Removed unused format functions - moved to examples/profitability_demo.go if needed