package main import ( "fmt" "math/big" "github.com/fraktal/mev-beta/pkg/math" ) func main() { dc := math.NewDecimalConverter() // Test case: "1000000000000000000" (1 ETH in wei) original := "1000000000000000000" decimals := uint8(18) symbol := "ETH" fmt.Printf("=== Debugging Precision Loss ===\n") fmt.Printf("Original string: %s\n", original) fmt.Printf("Decimals: %d\n", decimals) fmt.Printf("Symbol: %s\n", symbol) // Step 1: FromString decimal, err := dc.FromString(original, decimals, symbol) if err != nil { fmt.Printf("ERROR in FromString: %v\n", err) return } fmt.Printf("\nAfter FromString:\n") fmt.Printf(" Value: %s\n", decimal.Value.String()) fmt.Printf(" Decimals: %d\n", decimal.Decimals) fmt.Printf(" Symbol: %s\n", decimal.Symbol) // Step 2: ToHumanReadable humanReadable := dc.ToHumanReadable(decimal) fmt.Printf("\nAfter ToHumanReadable: '%s'\n", humanReadable) // Step 3: FromString again backToDecimal, err := dc.FromString(humanReadable, decimals, symbol) if err != nil { fmt.Printf("ERROR in second FromString: %v\n", err) return } fmt.Printf("\nAfter round-trip FromString:\n") fmt.Printf(" Value: %s\n", backToDecimal.Value.String()) fmt.Printf(" Decimals: %d\n", backToDecimal.Decimals) fmt.Printf(" Symbol: %s\n", backToDecimal.Symbol) // Step 4: Compare fmt.Printf("\n=== Comparison ===\n") fmt.Printf("Original value: %s\n", decimal.Value.String()) fmt.Printf("Round-trip value: %s\n", backToDecimal.Value.String()) fmt.Printf("Match: %t\n", decimal.Value.Cmp(backToDecimal.Value) == 0) // Let's also test what 1 ETH should look like fmt.Printf("\n=== Testing 1 ETH ===\n") oneETH := new(big.Int) oneETH.Exp(big.NewInt(10), big.NewInt(18), nil) // 10^18 fmt.Printf("1 ETH in wei: %s\n", oneETH.String()) fmt.Printf("Our value: %s\n", decimal.Value.String()) fmt.Printf("Equal: %t\n", oneETH.Cmp(decimal.Value) == 0) }