const { updateCachedPrice } = require('./price_engine'); async function fetchJson(url) { const res = await fetch(url, { headers: { 'accept': 'application/json', 'user-agent': 'otb-oracle/0.1' } }); if (!res.ok) { throw new Error(`HTTP ${res.status} from ${url}`); } return res.json(); } async function fetchCoinGeckoSimplePrice() { const ids = [ 'usd-coin', 'ethereum', 'etho-protocol', 'etica' ].join(','); const url = `https://api.coingecko.com/api/v3/simple/price?ids=${encodeURIComponent(ids)}&vs_currencies=usd,cad`; return fetchJson(url); } async function main() { const data = await fetchCoinGeckoSimplePrice(); const now = new Date().toISOString(); if (data['usd-coin']) { updateCachedPrice('USDC_ARB', { price_usd: data['usd-coin'].usd ?? null, price_cad: data['usd-coin'].cad ?? null, source: 'coingecko', source_status: 'primary', updated_at: now }); } if (data['ethereum']) { updateCachedPrice('ETH_ETH', { price_usd: data['ethereum'].usd ?? null, price_cad: data['ethereum'].cad ?? null, source: 'coingecko', source_status: 'primary', updated_at: now }); } if (data['etho-protocol']) { updateCachedPrice('ETHO_ETHO', { price_usd: data['etho-protocol'].usd ?? null, price_cad: data['etho-protocol'].cad ?? null, source: 'coingecko', source_status: 'primary', updated_at: now }); } if (data['etica']) { updateCachedPrice('ETI_ETICA', { price_usd: data['etica'].usd ?? null, price_cad: data['etica'].cad ?? null, source: 'coingecko', source_status: 'primary', updated_at: now }); } console.log(JSON.stringify({ ok: true, fetched_at: now, updated_pairs: ['USDC_ARB', 'ETH_ETH', 'ETHO_ETHO', 'ETI_ETICA'] }, null, 2)); } main().catch(err => { console.error(`fetch_prices.js failed: ${err.message}`); process.exit(1); });