Files
dejo-node/internal/oracle/validator.go
2025-05-23 10:44:32 -03:00

45 lines
1.0 KiB
Go

package oracle
import (
"fmt"
"math"
"time"
)
// ValidateMajority recebe múltiplas leituras e tenta achar um consenso baseado na maioria simples.
func ValidateMajority(data []*OracleData, tolerance float64) (*OracleData, error) {
if len(data) == 0 {
return nil, fmt.Errorf("nenhum dado recebido para validar")
}
count := make(map[float64]int)
latest := make(map[float64]time.Time)
for _, d := range data {
rounded := math.Round(d.Value/tolerance) * tolerance // agrupar valores similares
count[rounded]++
if d.Time.After(latest[rounded]) {
latest[rounded] = d.Time
}
}
// Encontrar o valor com mais votos
var maxVal float64
var maxCount int
for val, c := range count {
if c > maxCount {
maxVal = val
maxCount = c
}
}
// Retornar o OracleData mais recente com esse valor
for _, d := range data {
rounded := math.Round(d.Value/tolerance) * tolerance
if rounded == maxVal && d.Time.Equal(latest[maxVal]) {
return d, nil
}
}
return nil, fmt.Errorf("nenhum consenso válido encontrado")
}