Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Suivi de marché crypto : les 250 premières capitalisations, prix en temps réel et graphiques en bougies. Next.js (App Router) déployé sur Vercel. Node >= 20.9 requis (engines dans package.json). Copier .env.example vers .env.local. Aucune n'est obligatoire pour démarrer : sans COINGECKO_API_KEY, l'app bascule sur le quota public partagé par IP, ce qui suffit en local mais provoque des 429 en production. Les valeurs de production vivent déjà dans Vercel. Pour travailler en local, on les rapatrie plutôt que d'en créer de nouvelles :README 전문 보기 ↗
Suivi de marché crypto : les 250 premières capitalisations, prix en temps réel et graphiques en bougies. Next.js (App Router) déployé sur Vercel.
npm run dev # serveur de dev sur http://localhost:3000
npm run build # build de production (à lancer avant tout commit non trivial)
npm run lint # eslint (l'exécutable, pas `next lint` : retiré dans Next 16)
Node >= 20.9 requis (engines dans package.json).
Copier .env.example vers .env.local. Aucune n'est obligatoire pour démarrer :
sans COINGECKO_API_KEY, l'app bascule sur le quota public partagé par IP, ce
qui suffit en local mais provoque des 429 en production.
Les valeurs de production vivent déjà dans Vercel. Pour travailler en local, on les rapatrie plutôt que d'en créer de nouvelles :
npx vercel link && npx vercel env pull .env.local
COINGECKO_API_KEY est un secret : jamais de préfixe NEXT_PUBLIC_, jamais
committée. Elle n'est lue que par app/lib/coingecko.ts, côté serveur.
NEXT_PUBLIC_SITE_URL sert de base aux métadonnées et aux images OG. Un domaine
personnalisé se déclare par cette variable, pas en modifiant app/lib/site.ts.
L'app croise deux sources, et la répartition n'est pas arbitraire.
| Rôle | Source | Clé |
|---|---|---|
| Référentiel : noms, logos, capitalisation, offre, ATH, description, sparkline | CoinGecko | oui, côté serveur |
| Prix en direct | Binance !miniTicker@arr (WebSocket) | non |
| Graphiques en bougies | Binance klines | non |
| Indice Fear & Greed | alternative.me (côté serveur) | non |
Cinq points à connaître avant de toucher à cette répartition.
api.coingecko.com et l'en-tête x-cg-demo-api-key.
pro-api.coingecko.com est réservé aux abonnements payants et répond 401 à
une clé Demo. C'était le bug d'origine : la page détail n'affichait rien.resolvePairs rejette tout écart de
plus de 5 % avec le prix CoinGecko : c'est ce qui évite d'afficher Monero à
118 $ au lieu de 560 $, via un XMRUSDT gelé depuis son délistage.!ticker@arr ne renvoie rien (testé, aucun message en 25 s), alors
qu'il est le flux « complet » annoncé. Utiliser !miniTicker@arr, qui n'envoie
que les symboles ayant bougé. Il ne fournit pas de variation : elle se calcule
(c - o) / o * 100.data-stream.binance.vision, pas stream.binance.com :
dédié aux données de marché, aucun compte requis, et cinq fois plus rapide à
la connexion (1,4 s contre 7,2 s en mesure).app/
├── page.tsx Marché — composant serveur, revalidation 60 s
├── coin/[id]/page.tsx Détail — SSR + generateMetadata (lien partageable)
├── api/chart/[id] Repli graphique, coins sans paire Binance
├── components/ MarketTable (client), CoinRow, PriceChart, Sparkline…
└── lib/
├── coingecko.ts Serveur uniquement : lit la clé API
├── binance.ts REST public : paires, prix, klines
├── symbols.ts Appairage + garde-fou d'écart de prix
├── market.ts Composition des deux sources
├── stream.ts WebSocket partagé, tampon et reconnexion
└── format.ts Intl, notations compactes
Deux règles structurantes :
fetchMarkets renvoie des CoinBase ;
seul resolvePairs produit des Coin. Oublier l'étape est une erreur de
compilation, pas un pair silencieusement absent.Une seule connexion WebSocket dessert toutes les lignes appairées. Le flux
délivre environ 71 tickers par seconde : les ticks sont accumulés dans une Map
et appliqués au plus quatre fois par seconde, alignés sur requestAnimationFrame
— ce qui suspend aussi les mises à jour quand l'onglet passe à l'arrière-plan.
Un setState par message déclencherait une tempête de rendus pour un résultat
que l'œil ne distingue pas.
Le tri du tableau s'appuie sur les valeurs de référence et non sur les prix en direct : trier sur une valeur qui tique replacerait les lignes plusieurs fois par seconde et rendrait impossible de viser une ligne.
next.config.js. Toute nouvelle origine appelée depuis le
navigateur doit être déclarée dans connect-src, sinon elle est bloquée
silencieusement. Les tolérances de développement (unsafe-eval pour React, la
WebSocket HMR) sont accordées par phase et n'existent pas en production.bitcoin et ../../admin passent le même filtre de caractères.dangerouslySetInnerHTML, donc aucun sanitiseur dans le bundle client.next.config.js, 2 espaces dans app/. Pas de
point-virgule en fin de ligne.@layer, base compris. Les
jetons de thème vivent donc en CSS brute dans app/globals.css : placé dans
@layer base, le bloc :root.light était purgé faute de composant écrivant
« light », et le thème clair disparaissait sans erreur ni avertissement.ResizeObserver ne livre rien tant que le navigateur ne peint pas. Le
graphique mesure donc sa largeur à l'attachement du nœud, l'observateur ne
servant qu'au redimensionnement — sinon le tracé peut rester « M0 0 L0 0… »
dans un conteneur pourtant large.prefetch={false}. Sinon chaque ligne visible
déclenche un rendu serveur de la page détail, donc un appel CoinGecko, pour des
pages que personne n'ouvrira.