LIVE DATA FROM COINGECKO

Crypto Exchange Rating 2026

Real-time ranking of 100+ exchanges by Trust Score, 24h volume and liquidity. Exchanges with our exclusive bonus are highlighted.

EXCHANGES TRACKED
TOTAL 24H VOLUME
TOP EXCHANGE
MAX TRUST SCORE
OUR BONUSES
Up to $30,100
LAST UPDATED
🔍
# Exchange ▼ Trust Score ↕ 24h Volume ↕ Pairs ↕ Founded Our Bonus

Loading live exchange data from CoinGecko...

⚠ Failed to load data. Please refresh the page.
const LOGOS_EX = { 'bybit': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iI0Y3QTYwMCIvPjxwYXRoIGQ9Ik0xMCAxM2gxMmMyLjIgMCA0IDEuOCA0IDRzLTEuOCA0LTQgNEgxNHY2SDEwVjEzem00IDR2NGg4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMkgxNHoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=', 'binance': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iI0YwQjkwQiIvPjxnIGZpbGw9IiMwMDAiPjxwb2x5Z29uIHBvaW50cz0iMjAsNyAyMywxMCAyMCwxMyAxNywxMCIvPjxwb2x5Z29uIHBvaW50cz0iMjcsMTQgMzAsMTEgMzMsMTQgMzAsMTciLz48cG9seWdvbiBwb2ludHM9IjEzLDE0IDE2LDExIDE5LDE0IDE2LDE3Ii8+PHBvbHlnb24gcG9pbnRzPSIyMCwxNSAyMywxOCAyNiwxNSAyOSwxOCAyNiwyMSAyOSwyNCAyNiwyNyAyMywyNCAyMCwyNyAxNywyNCAxNCwyNyAxMSwyNCAxNCwyMSAxMSwxOCAxNCwxNSAxNywxOCIvPjxwb2x5Z29uIHBvaW50cz0iMTMsMjIgMTYsMjUgMTMsMjggMTAsMjUiLz48cG9seWdvbiBwb2ludHM9IjI3LDIyIDMwLDI1IDI3LDI4IDI0LDI1Ii8+PHBvbHlnb24gcG9pbnRzPSIyMCwyOSAyMywyNiAyNiwyOSAyMywzMiIvPjwvZz48L3N2Zz4=', 'gate': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iI0U1NUIyNSIvPjxwYXRoIGQ9Ik0yMCA4QzEzLjQgOCA4IDEzLjQgOCAyMHM1LjQgMTIgMTIgMTJjNC41IDAgOC40LTIuNSAxMC41LTYuMkgyMnYtMy4zaDEyYy4xLjUuMSAxIC4xIDEuNUMzNCAyNy43IDI3LjYgMzMgMjAgMzMgMTIuMyAzMyA2IDI2LjcgNiAyMFMxMi4zIDcgMjAgN3oiIGZpbGw9IiNmZmYiLz48L3N2Zz4=', 'okx': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzAwMCIvPjxyZWN0IHg9IjciIHk9IjciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHJ4PSIyIiBmaWxsPSIjZmZmIi8+PHJlY3QgeD0iMTYiIHk9IjciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHJ4PSIyIiBmaWxsPSIjZmZmIi8+PHJlY3QgeD0iMjUiIHk9IjciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHJ4PSIyIiBmaWxsPSIjZmZmIi8+PHJlY3QgeD0iNyIgeT0iMTYiIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHJ4PSIyIiBmaWxsPSIjZmZmIi8+PHJlY3QgeD0iMjUiIHk9IjE2IiB3aWR0aD0iOCIgaGVpZ2h0PSI4IiByeD0iMiIgZmlsbD0iI2ZmZiIvPjxyZWN0IHg9IjciIHk9IjI1IiB3aWR0aD0iOCIgaGVpZ2h0PSI4IiByeD0iMiIgZmlsbD0iI2ZmZiIvPjxyZWN0IHg9IjE2IiB5PSIyNSIgd2lkdGg9IjgiIGhlaWdodD0iOCIgcng9IjIiIGZpbGw9IiNmZmYiLz48cmVjdCB4PSIyNSIgeT0iMjUiIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHJ4PSIyIiBmaWxsPSIjZmZmIi8+PC9zdmc+', 'kucoin': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzI0QUU4RiIvPjxwYXRoIGQ9Ik0xMiAxMGg0djhsNy04aDVsLTggOSA5IDExaC01bC04LTl2OWgtNFYxMHoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=', 'bitget': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzAwRjBEMSIvPjxwYXRoIGQ9Ik0xNCAxMGg3YzMuMyAwIDYgMi43IDYgNiAwIDEuOS0uOSAzLjYtMi4zIDQuN0MyNi41IDIxLjggMjggMjQgMjggMjYuNSAyOCAzMCAyNS4yIDMzIDIyIDMzSDE0VjEwem00IDR2NWgzYzEuNCAwIDIuNS0xLjEgMi41LTIuNVMyMi40IDE0IDIxIDE0aC0zem0wIDl2NWg0YzEuNCAwIDIuNS0xLjEgMi41LTIuNVMyMy40IDIzIDIyIDIzaC00eiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==', 'mexc': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzJCNkZGRiIvPjxwYXRoIGQ9Ik03IDEwbDUgMTAgNS0xMGgzbC03IDEzdjdoLTJ2LTdMNCAxMGgzem0xNiAwaDEydjIuNWgtOXY1aDh2Mi41aC04djVoOVYyN0gyM1YxMHoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=', 'htx': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzBFNDJEMiIvPjxwYXRoIGQ9Ik04IDEwaDN2N2g4di03aDN2MTdoLTN2LTdIMTF2N0g4VjEwem0xNSAwaDExdjNoLTR2MTRoLTNWMTNoLTR2LTN6IiBmaWxsPSIjZmZmIi8+PC9zdmc+', 'bingx': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzFEQjBBQiIvPjxwYXRoIGQ9Ik0xMCAxMGg1YzMuMyAwIDYgMi43IDYgNiAwIDEuNS0uNSAyLjgtMS40IDMuOUwyNCAyN2gtNGwtMy42LTYuNUgxNFYyN2gtNFYxMHptNCAzLjVWMThoMWMxLjcgMCAzLTEuMSAzLTIuMyAwLTEuMy0xLjMtMi4yLTMtMi4ySDE0ek0yNSAxMGg0bDMgNiAzLTZoNGwtNSA4IDUgOWgtNGwtMy02LTMgNmgtNGw1LTktNS04eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==', 'phemex': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzVBMzdDQyIvPjxwYXRoIGQ9Ik0xMCAxMGg5YzMuOSAwIDcgMy4xIDcgN3MtMy4xIDctNyA3aC01djZoLTRWMTB6bTQgNHY2aDVjMS43IDAgMy0xLjMgMy0zcy0xLjMtMy0zLTNoLTV6IiBmaWxsPSIjZmZmIi8+PC9zdmc+', 'bitfinex': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzE2QjE1NyIvPjxwYXRoIGQ9Ik0yMCA2QzEyLjMgNiA2IDEyLjMgNiAyMHM2LjMgMTQgMTQgMTQgMTQtNi4zIDE0LTE0UzI3LjcgNiAyMCA2em0wIDNjMS40IDAgMi41LjYgMy4yIDEuNUwxMi41IDIxLjJDMTIuMiAyMC44IDEyIDIwLjQgMTIgMjBjMC00LjQgMy42LTggOC04em0wIDE4Yy0xLjQgMC0yLjUtLjYtMy4yLTEuNWwxMC43LTEwLjdjLjMuNC41LjguNSAxLjIgMCA0LjQtMy42IDgtOCA4eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==', 'bitmart': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzFBOTBGRiIvPjxwYXRoIGQ9Ik04IDEwaDN2MTdIOFYxMHptNSAwaDVjNC40IDAgOCAzLjIgOCA3LjIgMCAzLTEuOCA1LjUtNC41IDYuOEwyNiAyN2gtNGwtMy41LTZIMTd2NmgtNFYxMHptNCAzLjVWMThoMS41YzIuNSAwIDQuNS0xLjEgNC41LTIuNVMyMCAxMy41IDE3LjUgMTMuNUgxN3oiIGZpbGw9IiNmZmYiLz48L3N2Zz4=', 'coinex': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzFBQURGRiIvPjxwYXRoIGQ9Ik0yMiA4Yy03LjcgMC0xNCA2LjMtMTQgMTRzNi4zIDE0IDE0IDE0YzQuNSAwIDguNS0yLjEgMTEuMS01LjRsLTMtMi4yQzI4LjIgMzAuNyAyNS4zIDMyIDIyIDMyYy01LjUgMC0xMC00LjUtMTAtMTBzNC41LTEwIDEwLTEwYzMuMyAwIDYuMiAxLjYgOC4xIDRsMy0yLjJDMzAuNSAxMC4zIDI2LjUgOCAyMiA4em02IDloLTZ2Mmg0djJoLTR2Mmg2di02eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==', 'xt': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzBEQzhCMCIvPjxwYXRoIGQ9Ik02IDEwaDRsNCA2IDQtNmg0bC02IDkgNyAxMWgtNGwtNS04LTUgOEg1bDctMTEtNi05em0xOCAwaDE0djNoLTUuNXYxNGgtM1YxM0gyNHYtM3oiIGZpbGw9IiNmZmYiLz48L3N2Zz4=', 'coinw': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzg4NTVGRiIvPjxwYXRoIGQ9Ik0xOCA4Yy02LjYgMC0xMiA1LjQtMTIgMTJzNS40IDEyIDEyIDEyYzMuOCAwIDcuMS0xLjggOS4zLTQuNWwtMi44LTJDMjMgMjcuMyAyMC42IDI4LjUgMTggMjguNWMtNC43IDAtOC41LTMuOC04LjUtOC41UzEzLjMgMTEuNSAxOCAxMS41YzIuNiAwIDQuOSAxLjIgNi41IDNsMi44LTJDMjUuMSA5LjggMjEuOCA4IDE4IDh6bTQgOGgzbDIgNCAyLTRoM2wtMy41IDYgMy41IDZoLTNsLTItNC0yIDRoLTNsMy41LTZMMjIgMTZ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+', 'abcex': 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iI0ZGNkIzNSIvPjxwYXRoIGQ9Ik0yMCA3bDkgMTZIMTFMMjAgN3ptMCA2bC00IDhoOGwtNC04ek0xMCAyNmg1YzAgMi44IDIuMiA1IDUgNXM1LTIuMiA1LTVoNWMwIDUuNS00LjUgMTAtMTAgMTBTMTAgMzEuNSAxMCAyNnoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=', }; // ─── OUR AFFILIATE EXCHANGES ─── const OUR_EXCHANGES = { 'bybit': {bonus:'$30,100',link:'https://partner.bybit.com/b/BONUSYVCRU',p2p:true}, 'mexc': {bonus:'$10,000',link:'https://www.mexc.com/ru-RU/acquisition/custom-sign-up?shareCode=mexc-BONUSVC',p2p:true}, 'bingx': {bonus:'$11,000',link:'https://bingx.com/ru/partner/VipClient/',p2p:true}, 'kucoin': {bonus:'$11,000',link:'https://www.kucoin.com/r/af/BONUSVCRU',p2p:true}, 'bitget': {bonus:'$6,200', link:'https://partner.bitget.com/bg/BONUSVC1',p2p:true}, 'okx': {bonus:'$5,000', link:'https://www.okx.com/join/BONUSVC',p2p:false}, 'binance': {bonus:'$600', link:'https://www.binance.com/join?ref=HS1DYFRR',p2p:true}, 'phemex': {bonus:'$15,000',link:'https://phemex.com/register?referralCode=GJFJA5',p2p:false}, 'gate': {bonus:'$135', link:'https://www.gate.com/share/bvjfa1bz',p2p:true}, 'htx': {bonus:'$1,500', link:'https://www.htx.com.am/invite/ru-ru/1h?invite_code=xhmtb223',p2p:true}, 'bitmart': {bonus:'$14,000',link:'https://www.bitmart.com/ru-RU/invite/cVSRvT',p2p:false}, 'coinex': {bonus:'$100', link:'https://www.coinex.com/register?rc=2my4f',p2p:false}, 'xt': {bonus:'$500', link:'https://www.xt.com/ref/11EDMB',p2p:false}, 'coinw': {bonus:'$2,000', link:'https://www.coinw.com/ru_RU/register?r=26596654',p2p:false}, 'bitfinex': {bonus:'$0', link:'https://www.bitfinex.com/sign-up?refcode=rBmZ4jdUB',p2p:false}, 'abcex': {bonus:'$200', link:'https://abcex.io/auth/register?referral=1c0d20ab650042c0be2c3676f93ac116',p2p:true}, }; const PAGE_LINKS = { 'bybit':'bybit','mexc':'mexc','bingx':'bingx','kucoin':'kucoin','bitget':'bitget', 'okx':'okx','binance':'binance','phemex':'phemex','gate':'gate','htx':'htx', 'bitmart':'bitmart','coinex':'coinex','xt':'xt','coinw':'coinw','bitfinex':'bitfinex','abcex':'abcex' }; let allData = []; let filteredData = []; let currentPage = 1; let perPage = 50; let currentFilter = 'all'; let currentSearch = ''; let sortField = 'trust'; let sortDir = -1; let btcPrice = 95000; // ─── FETCH BTC PRICE ─── async function fetchBtcPrice() { try { const r = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd'); const d = await r.json(); btcPrice = d.bitcoin.usd || 95000; } catch(e) {} } // ─── FETCH EXCHANGES ─── async function fetchExchanges() { await fetchBtcPrice(); const pages = [1,2,3,4]; let all = []; for(const page of pages) { try { const r = await fetch(`https://api.coingecko.com/api/v3/exchanges?per_page=100&page=${page}`); if(!r.ok) break; const d = await r.json(); if(!d || !d.length) break; all = all.concat(d); if(d.length < 100) break; } catch(e) { break; } } return all; } function formatVol(btcVol) { if(!btcVol) return '—'; const usd = btcVol * btcPrice; if(usd >= 1e9) return '$'+(usd/1e9).toFixed(1)+'B'; if(usd >= 1e6) return '$'+(usd/1e6).toFixed(0)+'M'; return '$'+(usd/1e3).toFixed(0)+'K'; } function formatVolTotal(btcVols) { const total = btcVols.reduce((a,b)=>a+b,0) * btcPrice; if(total >= 1e12) return '$'+(total/1e12).toFixed(1)+'T'; if(total >= 1e9) return '$'+(total/1e9).toFixed(0)+'B'; return '$'+(total/1e6).toFixed(0)+'M'; } function trustColor(score) { if(!score) return '#4a5568'; if(score >= 8) return '#00e676'; if(score >= 5) return '#f5c842'; return '#ff4444'; } function trustDots(score) { const max = 10; const filled = score || 0; const color = trustColor(filled); let dots = ''; for(let i=0;i`; } return `
${dots}
`; } function renderRows(data) { const list = document.getElementById('exList'); if(!data.length) { list.innerHTML = '
No exchanges found
'; return; } const start = (currentPage-1)*perPage; const slice = data.slice(start, start+perPage); const globalStart = start; list.innerHTML = slice.map((ex, idx) => { const rank = globalStart + idx + 1; const our = OUR_EXCHANGES[ex.id]; const pageLink = PAGE_LINKS[ex.id]; const rankClass = rank<=3 ? `rank-${rank}` : ''; const hasBonus = our ? 'has-bonus' : ''; const topClass = rank<=3 ? 'top3' : ''; const vol = formatVol(ex.trade_volume_24h_btc); const color = trustColor(ex.trust_score); const imgHtml=logoImg(ex.id,32,8); const placeholderHtml=''; const bonusBadge = our ? `✓ BONUS` : ''; const bonusVal = our ? our.bonus : '—'; const bonusColor = our ? 'color:var(--gold)' : 'color:var(--text3)'; const p2pBadge = our && our.p2p ? `P2P` : ''; const country = ex.country ? `${ex.country}` : ''; const year = ex.year_established || '—'; const actionBtns = our ? `Get Bonus →${pageLink?`Details`:''}` : (pageLink ? `Details` : `Visit →`); return `
${rank} ${imgHtml}${placeholderHtml} ${ex.name}${bonusBadge} ${country} ${ex.trust_score ? `${trustDots(ex.trust_score)}${ex.trust_score}` : 'N/A'} ${vol} ${p2pBadge} ${ex.trade_volume_24h_btc_normalized ? '—' : (ex.number_of_coins||'—')} ${year} ${bonusVal} ${actionBtns}
`; }).join(''); } function renderPagination(total) { const pages = Math.ceil(total/perPage); const block = document.getElementById('paginationBlock'); if(pages <= 1) { block.innerHTML=''; return; } let html = ''; if(currentPage>1) html += ``; const start = Math.max(1,currentPage-2); const end = Math.min(pages,currentPage+2); if(start>1) html += `${start>2?'...':''}`; for(let i=start;i<=end;i++) html += ``; if(end...':''}`; if(currentPageNext →`; html += `${(currentPage-1)*perPage+1}–${Math.min(currentPage*perPage,total)} of ${total}`; block.innerHTML = html; } function applyFiltersAndRender() { let data = [...allData]; // Filter if(currentFilter==='our') data = data.filter(ex=>OUR_EXCHANGES[ex.id]); else if(currentFilter==='top10') data = data.slice(0,10); else if(currentFilter==='green') data = data.filter(ex=>ex.trust_score>=8); else if(currentFilter==='p2p') data = data.filter(ex=>OUR_EXCHANGES[ex.id]&&OUR_EXCHANGES[ex.id].p2p); // Search if(currentSearch) data = data.filter(ex=>(ex.name||'').toLowerCase().includes(currentSearch)); filteredData = data; currentPage = 1; renderRows(filteredData); renderPagination(filteredData.length); } function setFilter(f,btn) { currentFilter=f; document.querySelectorAll('.filter-btn').forEach(b=>b.classList.remove('active')); btn.classList.add('active'); applyFiltersAndRender(); } function searchEx(val) { currentSearch = val.toLowerCase(); applyFiltersAndRender(); } function setPerPage(val) { perPage = parseInt(val); currentPage = 1; renderRows(filteredData); renderPagination(filteredData.length); } function goPage(p) { currentPage = p; renderRows(filteredData); renderPagination(filteredData.length); window.scrollTo({top:300,behavior:'smooth'}); } function sortBy(field) { if(sortField===field) sortDir*=-1; else { sortField=field; sortDir=-1; } if(field==='trust') allData.sort((a,b)=>sortDir*((a.trust_score_rank||999)-(b.trust_score_rank||999))); if(field==='vol') allData.sort((a,b)=>sortDir*((b.trade_volume_24h_btc||0)-(a.trade_volume_24h_btc||0))); if(field==='pairs') allData.sort((a,b)=>sortDir*((b.number_of_coins||0)-(a.number_of_coins||0))); applyFiltersAndRender(); } // ─── INIT ─── (async ()=>{ document.getElementById('loadingBlock').style.display='block'; document.getElementById('exList').style.display='none'; try { allData = await fetchExchanges(); if(!allData.length) throw new Error('No data'); // Sort by trust_score_rank allData.sort((a,b)=>(a.trust_score_rank||999)-(b.trust_score_rank||999)); // Market stats const vols = allData.map(e=>e.trade_volume_24h_btc||0).filter(v=>v>0); document.getElementById('statTotal').textContent = allData.length; document.getElementById('statVol').textContent = formatVolTotal(vols); document.getElementById('statTop').textContent = allData[0]?.name || '—'; document.getElementById('statTrust').textContent = (allData.find(e=>e.trust_score)?.trust_score||'—')+'/10'; document.getElementById('statTime').textContent = new Date().toLocaleTimeString(); document.getElementById('loadingBlock').style.display='none'; document.getElementById('exList').style.display='block'; filteredData = [...allData]; renderRows(filteredData); renderPagination(filteredData.length); // Refresh every 5 minutes setInterval(async()=>{ const fresh = await fetchExchanges(); if(fresh.length) { allData = fresh.sort((a,b)=>(a.trust_score_rank||999)-(b.trust_score_rank||999)); applyFiltersAndRender(); document.getElementById('statTime').textContent = new Date().toLocaleTimeString(); } }, 300000); } catch(e) { document.getElementById('loadingBlock').style.display='none'; document.getElementById('errorBlock').style.display='block'; } })();