Files
mev-beta/pkg/arbitrage/decimal_helpers.go
Krypto Kajun 850223a953 fix(multicall): resolve critical multicall parsing corruption issues
- Added comprehensive bounds checking to prevent buffer overruns in multicall parsing
- Implemented graduated validation system (Strict/Moderate/Permissive) to reduce false positives
- Added LRU caching system for address validation with 10-minute TTL
- Enhanced ABI decoder with missing Universal Router and Arbitrum-specific DEX signatures
- Fixed duplicate function declarations and import conflicts across multiple files
- Added error recovery mechanisms with multiple fallback strategies
- Updated tests to handle new validation behavior for suspicious addresses
- Fixed parser test expectations for improved validation system
- Applied gofmt formatting fixes to ensure code style compliance
- Fixed mutex copying issues in monitoring package by introducing MetricsSnapshot
- Resolved critical security vulnerabilities in heuristic address extraction
- Progress: Updated TODO audit from 10% to 35% complete

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 00:12:55 -05:00

101 lines
2.5 KiB
Go

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)
}
func formatEther(wei *big.Int) string {
return ethAmountString(sharedDecimalConverter, nil, wei)
}
func formatEtherFromWei(wei *big.Int) string {
return formatEther(wei)
}
func formatGweiFromWei(wei *big.Int) string {
return gweiAmountString(sharedDecimalConverter, nil, wei)
}