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

59 lines
1.3 KiB
Go

package oracle
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"time"
)
// OracleData representa um dado externo coletado via oráculo
type OracleData struct {
Source string `json:"source"`
Key string `json:"key"`
Value float64 `json:"value"`
Time time.Time `json:"timestamp"`
}
// FetchFromMock simula obtenção de dados de um oráculo externo (mock)
func FetchFromMock(key string) (*OracleData, error) {
mockPrices := map[string]float64{
"USD-BRL": 5.06,
"ETH-BRL": 18732.42,
"IMOVEL-ABC123": 950000.00,
}
val, ok := mockPrices[key]
if !ok {
return nil, errors.New("dado não encontrado no mock")
}
return &OracleData{
Source: "mock",
Key: key,
Value: val,
Time: time.Now(),
}, nil
}
// FetchFromCoinGecko busca o preço de uma moeda em relação ao BRL
func FetchFromCoinGecko(coin string) (*OracleData, error) {
url := fmt.Sprintf("https://api.coingecko.com/api/v3/simple/price?ids=%s&vs_currencies=brl", coin)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var parsed map[string]map[string]float64
if err := json.NewDecoder(resp.Body).Decode(&parsed); err != nil {
return nil, err
}
price := parsed[coin]["brl"]
return &OracleData{
Source: "coingecko",
Key: coin + "-BRL",
Value: price,
Time: time.Now(),
}, nil
}