Files
mev-beta/tests/integration/pool_discovery_test.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

181 lines
6.6 KiB
Go

//go:build integration && legacy
// +build integration,legacy
// Package integration provides integration tests for the MEV bot using a forked Arbitrum environment
package integration
import (
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/fraktal/mev-beta/internal/logger"
"github.com/fraktal/mev-beta/pkg/pools"
)
// TestPoolDiscovery tests that the pool discovery mechanism works correctly
func TestPoolDiscovery(t *testing.T) {
// Skip this test in short mode
if testing.Short() {
t.Skip("skipping pool discovery test in short mode")
}
// Create test logger
log := logger.New("debug", "text", "")
// Create CREATE2 calculator
calculator := pools.NewCREATE2Calculator(log)
// Test discovering pools for common token pairs on Arbitrum
testCases := []struct {
name string
token0 string
token1 string
expected int
}{
{
name: "USDC/WETH",
token0: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
token1: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", // WETH
expected: 3, // Uniswap V3, SushiSwap, Camelot V3
},
{
name: "USDT/WETH",
token0: "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", // USDT
token1: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", // WETH
expected: 3, // Uniswap V3, SushiSwap, Camelot V3
},
{
name: "ARB/WETH",
token0: "0x912CE59144191C1204E64559FE8253a0e49E6548", // ARB
token1: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", // WETH
expected: 3, // Uniswap V3, SushiSwap, Camelot V3
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Convert hex addresses to common.Address
token0 := common.HexToAddress(tc.token0)
token1 := common.HexToAddress(tc.token1)
// Discover pools for this token pair
pools, err := calculator.FindPoolsForTokenPair(token0, token1)
require.NoError(t, err, "failed to discover pools for token pair")
// Verify we found the expected number of pools
assert.GreaterOrEqual(t, len(pools), tc.expected, "should find at least %d pools for %s", tc.expected, tc.name)
// Verify each pool has valid data
for i, pool := range pools {
assert.NotEqual(t, "", pool.Factory, "pool %d should have a factory name", i)
assert.NotEqual(t, common.Address{}, pool.Token0, "pool %d should have token0", i)
assert.NotEqual(t, common.Address{}, pool.Token1, "pool %d should have token1", i)
assert.NotEqual(t, common.Address{}, pool.PoolAddr, "pool %d should have a pool address", i)
assert.True(t, pool.Fee >= 0, "pool %d should have a non-negative fee", i)
log.Info("Discovered pool:", pool.Factory, pool.PoolAddr.Hex())
}
log.Info("Found", len(pools), "pools for", tc.name)
})
}
}
// TestFactoryConfigurations tests that all factory configurations are properly loaded
func TestFactoryConfigurations(t *testing.T) {
// Create test logger
log := logger.New("debug", "text", "")
// Create CREATE2 calculator
calculator := pools.NewCREATE2Calculator(log)
// Get list of all factories
factories := calculator.ListFactories()
assert.Greater(t, len(factories), 0, "should have at least one factory configured")
// Verify each factory has valid configuration
for _, factoryName := range factories {
t.Run(factoryName, func(t *testing.T) {
config, err := calculator.GetFactoryConfig(factoryName)
assert.NoError(t, err, "should be able to get config for factory %s", factoryName)
assert.NotNil(t, config, "config should not be nil for factory %s", factoryName)
assert.NotEqual(t, common.Address{}, config.Address, "factory %s should have a valid address", factoryName)
assert.NotEqual(t, common.Hash{}, config.InitCodeHash, "factory %s should have a valid init code hash", factoryName)
assert.Greater(t, len(config.FeeStructure.DefaultFees), 0, "factory %s should have default fees", factoryName)
})
}
log.Info("Verified", len(factories), "factories")
}
// TestPoolAddressCalculation tests that pool addresses are calculated correctly
func TestPoolAddressCalculation(t *testing.T) {
// Create test logger
log := logger.New("debug", "text", "")
// Create CREATE2 calculator
calculator := pools.NewCREATE2Calculator(log)
// Test known pool addresses on Arbitrum
testCases := []struct {
name string
factory string
token0 string
token1 string
fee uint32
expectedAddr string
}{
{
name: "Uniswap V3 USDC/WETH 0.05%",
factory: "uniswap_v3",
token0: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
token1: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", // WETH
fee: 500, // 0.05%
expectedAddr: "0xC6962004f452bE9203591991D15f6b388e09E8D0",
},
{
name: "Uniswap V3 USDC/WETH 0.3%",
factory: "uniswap_v3",
token0: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
token1: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", // WETH
fee: 3000, // 0.3%
expectedAddr: "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640",
},
{
name: "Uniswap V3 USDC/WETH 1%",
factory: "uniswap_v3",
token0: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
token1: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", // WETH
fee: 10000, // 1%
expectedAddr: "0x7f90122BF0700F9E7e1F688fe926940E8839F353",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Convert hex addresses to common.Address
token0 := common.HexToAddress(tc.token0)
token1 := common.HexToAddress(tc.token1)
expectedAddr := common.HexToAddress(tc.expectedAddr)
// Calculate pool address
calculatedAddr, err := calculator.CalculatePoolAddress(tc.factory, token0, token1, tc.fee)
require.NoError(t, err, "should be able to calculate pool address")
// Verify the calculated address matches expected (this may fail for placeholder addresses)
if tc.expectedAddr != "0x0000000000000000000000000000000000000000" {
// For now, just log the addresses for verification
log.Info("Calculated pool address:", calculatedAddr.Hex())
log.Info("Expected pool address: ", expectedAddr.Hex())
log.Info("Match:", calculatedAddr == expectedAddr)
} else {
// Just verify the address is not zero
assert.NotEqual(t, common.Address{}, calculatedAddr, "calculated address should not be zero")
}
})
}
}