feat(core): implement core MEV bot functionality with market scanning and Uniswap V3 pricing
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
@@ -11,11 +11,11 @@ import (
|
||||
|
||||
// ObjectPool manages reusable objects to reduce garbage collection pressure
|
||||
type ObjectPool struct {
|
||||
bigIntPool sync.Pool
|
||||
uint256Pool sync.Pool
|
||||
eventPool sync.Pool
|
||||
addressPool sync.Pool
|
||||
slicePool sync.Pool
|
||||
bigIntPool sync.Pool
|
||||
uint256Pool sync.Pool
|
||||
eventPool sync.Pool
|
||||
addressPool sync.Pool
|
||||
slicePool sync.Pool
|
||||
}
|
||||
|
||||
// NewObjectPool creates a new object pool for performance optimization
|
||||
@@ -265,7 +265,7 @@ func (c *FastCache) Get(key string) (interface{}, bool) {
|
||||
shard.mu.RLock()
|
||||
item, exists := shard.data[key]
|
||||
shard.mu.RUnlock()
|
||||
|
||||
|
||||
if exists {
|
||||
return item.Value, true
|
||||
}
|
||||
@@ -276,18 +276,18 @@ func (c *FastCache) Get(key string) (interface{}, bool) {
|
||||
func (c *FastCache) Set(key string, value interface{}, cost int) {
|
||||
shard := c.getShard(key)
|
||||
shard.mu.Lock()
|
||||
|
||||
|
||||
// Check if we need to evict items
|
||||
if shard.size >= shard.limit && shard.data[key] == nil {
|
||||
c.evictOldest(shard)
|
||||
}
|
||||
|
||||
|
||||
shard.data[key] = &CacheItem{
|
||||
Value: value,
|
||||
Cost: cost,
|
||||
}
|
||||
shard.size++
|
||||
|
||||
|
||||
shard.mu.Unlock()
|
||||
}
|
||||
|
||||
@@ -295,14 +295,14 @@ func (c *FastCache) Set(key string, value interface{}, cost int) {
|
||||
func (c *FastCache) evictOldest(shard *CacheShard) {
|
||||
var oldestKey string
|
||||
var oldestTime int64 = 1<<63 - 1
|
||||
|
||||
|
||||
for key, item := range shard.data {
|
||||
if item.AccessTime < oldestTime {
|
||||
oldestTime = item.AccessTime
|
||||
oldestKey = key
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if oldestKey != "" {
|
||||
delete(shard.data, oldestKey)
|
||||
shard.size--
|
||||
@@ -332,13 +332,13 @@ func NewBatchProcessor(batchSize int, flushTimeoutNs int64, processor func([]int
|
||||
func (bp *BatchProcessor) Add(item interface{}) error {
|
||||
bp.mu.Lock()
|
||||
defer bp.mu.Unlock()
|
||||
|
||||
|
||||
bp.buffer = append(bp.buffer, item)
|
||||
|
||||
|
||||
if len(bp.buffer) >= bp.batchSize {
|
||||
return bp.flushLocked()
|
||||
}
|
||||
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -346,7 +346,7 @@ func (bp *BatchProcessor) Add(item interface{}) error {
|
||||
func (bp *BatchProcessor) Flush() error {
|
||||
bp.mu.Lock()
|
||||
defer bp.mu.Unlock()
|
||||
|
||||
|
||||
return bp.flushLocked()
|
||||
}
|
||||
|
||||
@@ -355,11 +355,11 @@ func (bp *BatchProcessor) flushLocked() error {
|
||||
if len(bp.buffer) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
batch := make([]interface{}, len(bp.buffer))
|
||||
copy(batch, bp.buffer)
|
||||
bp.buffer = bp.buffer[:0] // Reset buffer
|
||||
|
||||
|
||||
return bp.processor(batch)
|
||||
}
|
||||
|
||||
@@ -380,12 +380,12 @@ func (mo *MemoryOptimizer) ProcessWithPools(data []byte, processor func(*big.Int
|
||||
bigInt := mo.pools.GetBigInt()
|
||||
uint256Int := mo.pools.GetUint256()
|
||||
workBuffer := mo.pools.GetByteSlice()
|
||||
|
||||
|
||||
defer func() {
|
||||
mo.pools.PutBigInt(bigInt)
|
||||
mo.pools.PutUint256(uint256Int)
|
||||
mo.pools.PutByteSlice(workBuffer)
|
||||
}()
|
||||
|
||||
|
||||
return processor(bigInt, uint256Int, workBuffer)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user