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 }