Best Price Cash To Crypto Aggregate
This revision is from 2025/06/22 20:57. You can Restore it.
<div>
<label>Fiat:</label>
<select id="fiat">
<option>USD</option><option>EUR</option><option>GBP</option>
</select>
<label>Amount:</label>
<input type="number" id="amount" value="100" min="1" />
<label>Crypto:</label>
<select id="crypto">
<option value="bitcoin">BTC</option>
<option value="ethereum">ETH</option>
<option value="litecoin">LTC</option>
<option value="monero">XMR</option>
<option value="binancecoin">BNB</option>
</select>
<button id="refresh">Refresh</button>
</div>
<div id="results"><p class="loading">Loading…</p></div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const services = [
// Original services with corrected fees
{name:'PayPal', fee:3.5}, // Updated (includes spread)
{name:'MoonPay', fee:4.5}, // Updated (varies by payment method)
{name:'Coinbase', fee:1.49}, // Verified (card fee)
{name:'Binance', fee:1.8}, // Updated (card purchases)
{name:'Binance P2P', fee:0},
{name:'Kraken', fee:0.26}, // Verified (trading fee)
{name:'Kraken P2P', fee:0},
{name:'Crypto.com', fee:2.99}, // Updated (card purchases)
{name:'OKX', fee:0.1}, // Verified
{name:'OKX P2P', fee:0},
{name:'Gemini', fee:1.49}, // Verified
{name:'Bitstamp', fee:0.5}, // Updated
{name:'KuCoin', fee:0.1},
{name:'KuCoin P2P', fee:0},
{name:'eToro', fee:1.0}, // Spread-based
{name:'Bitfinex', fee:0.2},
{name:'CoinJar', fee:1.0},
{name:'Best Wallet', fee:2.0},
{name:'MEXC', fee:0.0}, // Updated (no fee for card purchases)
{name:'Bybit', fee:0.1},
{name:'Robinhood', fee:0.0}, // Verified (spread only)
{name:'CashApp', fee:2.2}, // Updated
{name:'PayID (BitPay/Banxa)', fee:1.0},
{name:'PayPal Card', fee:3.0},
{name:'Banxa', fee:2.5}, // Updated
{name:'Transak', fee:1.99}, // Updated
{name:'Unlimit', fee:2.0},
{name:'Mercuryo', fee:3.95},
{name:'Coinbase Pay', fee:1.5},
{name:'Simplex', fee:5.0}, // Updated (min 10$ or 5%)
{name:'Paybis', fee:2.49}, // Updated
{name:'Paxful P2P', fee:0.99}, // Updated
{name:'MetaMask On-ramp', fee:0.95},// Updated (aggregator min fee)
{name:'Pionex', fee:0.05},
{name:'Margex', fee:1.0},
{name:'Uphold', fee:0.95}, // Updated verification
{name:'Bitget', fee:0.1},
{name:'CEX.IO', fee:2.99},
{name:'BYDFi', fee:0.1},
{name:'OKCoin', fee:0.2},
{name:'Huobi', fee:0.2},
{name:'OpenPeer', fee:0},
{name:'Coindirect', fee:1.5},
{name:'Hodl Hodl', fee:0.6},
{name:'WhalesHeaven', fee:0.5},
{name:'Remitano', fee:1.0},
{name:'LocalCoinSwap', fee:1.0},
{name:'Bisq', fee:0.88},
{name:'BingX', fee:0},
{name:'CoinEx', fee:0.2},
// Newly added important services
{name:'Revolut', fee:2.5}, // Standard tier
{name:'Bitpanda', fee:1.49},
{name:'Nexo', fee:0.0}, // Free fiat deposits
{name:'Bitso', fee:0.65}, // Popular in LATAM
{name:'Luno', fee:1.5}, // Popular in Africa/SEA
{name:'Gate.io', fee:0.1},
{name:'SwissBorg', fee:1.0},
{name:'BitFlyer', fee:0.15}, // Popular in Japan
{name:'LocalBitcoins', fee:1.0},
{name:'BitPay', fee:1.0}
];
const fiatEl = document.getElementById('fiat');
const amountEl = document.getElementById('amount');
const cryptoEl = document.getElementById('crypto');
const resultsEl = document.getElementById('results');
async function fetchPrice(cryptoId, fiat) {
const url = "/coingecko-proxy.php?ids=" + cryptoId + "&vs_currencies=" + fiat;
console.log("Fetching:", url);
try {
const r = await fetch(url);
if (!r.ok) throw new Error("HTTP "+r.status);
const j = await r.json();
return j[cryptoId]?.[fiat.toLowerCase()] || null;
} catch (err) {
console.error("Error fetching price:", err);
return null;
}
}
async function refresh() {
const fiat = fiatEl.value || 'usd';
const amt = parseFloat(amountEl.value) || 100;
const cryptoId = cryptoEl.value || 'bitcoin';
resultsEl.innerHTML = '<p class="loading">Loading…</p>';
const price = await fetchPrice(cryptoId, fiat);
if (!price) {
resultsEl.innerHTML = '<p>Error: could not fetch price.</p>';
return;
}
const rows = services.map(s => {
const gross = price * (1 + s.fee / 100);
return { service: s.name, amount: amt / gross };
}).sort((a, b) => b.amount - a.amount);
let html =
'<table style="width: 100%; border-collapse: collapse; margin-top: 20px;">' +
'<thead>' +
'<tr style="background: #f2f2f2;"><th style="padding: 12px; text-align: left;">Service</th><th style="padding: 12px; text-align: right;">' + cryptoId.toUpperCase() + ' Amount</th></tr>' +
'</thead>' +
'<tbody>';
rows.forEach(function(r, i) {
const bgColor = i % 2 === 0 ? '#fff' : '#f9f9f9';
html +=
'<tr style="background: ' + bgColor + ';">' +
'<td style="padding: 10px; border-bottom: 1px solid #ddd;">' + r.service + '</td>' +
'<td style="padding: 10px; text-align: right; border-bottom: 1px solid #ddd; font-family: monospace;">' + r.amount.toFixed(6) + '</td>' +
'</tr>';
});
html += '</tbody></table>';
resultsEl.innerHTML = html;
}
document.getElementById('refresh').onclick = refresh;
refresh(); // Initial load
});
</script>