Files
mev-beta/orig/pkg/arbitrage/decimal_helpers.go
Administrator 803de231ba feat: create v2-prep branch with comprehensive planning
Restructured project for V2 refactor:

**Structure Changes:**
- Moved all V1 code to orig/ folder (preserved with git mv)
- Created docs/planning/ directory
- Added orig/README_V1.md explaining V1 preservation

**Planning Documents:**
- 00_V2_MASTER_PLAN.md: Complete architecture overview
  - Executive summary of critical V1 issues
  - High-level component architecture diagrams
  - 5-phase implementation roadmap
  - Success metrics and risk mitigation

- 07_TASK_BREAKDOWN.md: Atomic task breakdown
  - 99+ hours of detailed tasks
  - Every task < 2 hours (atomic)
  - Clear dependencies and success criteria
  - Organized by implementation phase

**V2 Key Improvements:**
- Per-exchange parsers (factory pattern)
- Multi-layer strict validation
- Multi-index pool cache
- Background validation pipeline
- Comprehensive observability

**Critical Issues Addressed:**
- Zero address tokens (strict validation + cache enrichment)
- Parsing accuracy (protocol-specific parsers)
- No audit trail (background validation channel)
- Inefficient lookups (multi-index cache)
- Stats disconnection (event-driven metrics)

Next Steps:
1. Review planning documents
2. Begin Phase 1: Foundation (P1-001 through P1-010)
3. Implement parsers in Phase 2
4. Build cache system in Phase 3
5. Add validation pipeline in Phase 4
6. Migrate and test in Phase 5

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 10:14:26 +01:00

91 lines
2.3 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)
}
// Removed unused format functions - moved to examples/profitability_demo.go if needed