package arbitrum import ( "crypto/rand" "encoding/hex" "testing" "github.com/fraktal/mev-beta/pkg/calldata" ) // FuzzABIDecoder ensures the swap decoder tolerates arbitrary calldata without panicking. func FuzzABIDecoder(f *testing.F) { decoder, err := NewABIDecoder() if err != nil { f.Fatalf("failed to create ABI decoder: %v", err) } // Seed with known selectors (Uniswap V2/V3 multicall patterns) f.Add([]byte{0xa9, 0x05, 0x9c, 0xbb}) f.Add([]byte{0x41, 0x4b, 0xf3, 0x89}) f.Add([]byte{0x18, 0xcb, 0xaf, 0xe5}) // Seed with random data of reasonable length random := make([]byte, 64) _, _ = rand.Read(random) f.Add(random) f.Fuzz(func(t *testing.T, data []byte) { defer func() { if r := recover(); r != nil { t.Fatalf("DecodeSwapTransaction panicked for %x: %v", data, r) } }() if len(data) == 0 { data = []byte{0x00} } hexPayload := "0x" + hex.EncodeToString(data) if _, err := decoder.DecodeSwapTransaction("generic", hexPayload); err != nil { t.Logf("decoder returned expected error: %v", err) } }) } // FuzzMulticallExtractor validates robustness of multicall token extraction. func FuzzMulticallExtractor(f *testing.F) { seed := make([]byte, 96) copy(seed[:4], []byte{0xac, 0x96, 0x50, 0xd8}) f.Add(seed) random := make([]byte, 128) _, _ = rand.Read(random) f.Add(random) f.Fuzz(func(t *testing.T, params []byte) { defer func() { if r := recover(); r != nil { t.Fatalf("ExtractTokensFromMulticall panicked for %x: %v", params, r) } }() if _, err := calldata.ExtractTokensFromMulticall(params); err != nil { t.Logf("multicall extraction reported error: %v", err) } }) }