indul Q3 2026 Korai hozzáférés a Cryptofolio platformhoz

A magyar trader közösség, amelyikre vártál.

Csatlakozz a várólistához, és nyerd meg a $6 500 értékű előfizetést és kurzus-csomagot. Minél több embert hívsz meg, annál előrébb kerülsz a sorban.

MK
PT
ZS
BL
+
2 847 magyar tőzsdés vár
Fődíj · 1 nyertes
~ $3 500 érték

Élethosszig tartó MarketMaker tagság

A legmagasabb szintű hozzáférés: trade jelzések, Discord, AI elemző, mentor-csatorna — korlátlan ideig.

év
3 500$érték
1nyertes
Bónusz · 10 nyertes
~ $3 000 érték

Teljes kurzus-csomag, ingyen

Mind a 4 prémium kurzusunk: kezdő, középhaladó, smart-money, makró-elemzés. Vissza nem térő ajánlat.

4kurzus
3 000$érték
10nyertes
Hogyan működik

Három lépés. Egy nyeremény.

A többi platformhoz hasonlóan: minél több ember csatlakozik a meghívóddal, annál előrébb leszel — és annál nagyobb az esélyed a fődíjra.

01

Csatlakozz

Csak egy email kell. Egyetlen kattintással bekerülsz a sorba. Spam nincs — csak akkor írunk, ha indulunk vagy ha nyertél.

3 másodperc · egy mező
02

Hívd meg a barátaid

Megkapod a saját meghívó-linkedet. Oszd meg barátaiddal, social media-n, vagy egy Discord szerveren. Minden új belépő pontot ad.

+50 pont minden meghívásért
03

Lépj feljebb

Ahogy nő a pontszámod, úgy mész előre a sorban. Top 100? Garantált nyeremény. Top 10? Több sorsolásban indulsz egyszerre.

5 tier · jackpot a top 10-nek
Tier rendszer

Minél magasabb tier, annál több nyeremény.

Tier 1
🪙
Satoshi
0 — 99 pont
Korai hozzáférés Q3-ban
Tier 2
Trader
100 — 299 pont
+ 1 hónap ingyen előfizetés
Tier 3
📊
Analyst
300 — 599 pont
+ Kezdő kurzus ingyen
Tier 4
💎
Whale
600 — 999 pont
+ Sorsolás a kurzus-csomagra
Tier 5
👑
MarketMaker
1000+ pont
+ Sorsolás a fődíjra ($3500)

Élő ranglista

👑 1
CR
crypto_robi
218 meghívás
MarketMaker
10 940
🥈 2
DS
deepstack_eva
187 meghívás
MarketMaker
9 380
🥉 3
MK
marcell_k
154 meghívás
MarketMaker
7 720
4
PT
petra_trades
102 meghívás
MarketMaker
5 120
5
ZS
zsolt.btc
88 meghívás
Whale
4 410
6
BL
balazsi
71 meghívás
Whale
3 580
7
AT
attila_HU
62 meghívás
Whale
3 110
8
NN
nora.n
54 meghívás
Analyst
2 720
2 847
?
te (még nem regisztráltál)
0 meghívás
Satoshi
0

Élő aktivitás

CR
crypto_robi elérte a MarketMaker szintet
2p
PT
petra_trades meghívott +3 új tagot
4p
DS
danielsoul csatlakozott a Whale tierhez
8p
MK
marcell_k előrelépett #3-ra
12p
AT
attila_HU meghívott +1 új tagot
14p
NN
nora.n csatlakozott a sorhoz
18p
ZS
zsolt.btc elérte a Whale szintet
22p
Gyakori kérdések

Minden, amit tudnod kell.

Q1 Mikor indul a platform?

2026 Q3-ban indítjuk a teljes platformot. A várólista tagjai 2 héttel előbb kapnak hozzáférést a publikus launch-nál.

Q2 Garantált a nyeremény?

A Top 100 minden résztvevője kap valamilyen jutalmat (1 hónap előfizetés vagy ingyenes kurzus). A fődíjak sorsolással kerülnek kiosztásra.

Q3 Csaló meghívásokat tudunk-e szűrni?

Igen. Email-verifikáció + IP-elemzés van mögötte. A felfedezett botnetek minden pontját azonnal töröljük.

Q4 Hány pontot ér egy meghívás?

Egy verifikált meghívás 50 pont. Ha a meghívottad is meghív valakit, te is kapsz 10 bónuszpontot (2. szintű utalvány).

Q5 Mi van, ha nem nyerek?

Semmi gond — minden várólistás 30% kedvezményt kap az indulás után 60 napig. Ez nincs olyan kupon, amivel kombinálhatnánk.

Q6 Mikor lesz a sorsolás?

A teljes platform indulása napján, élő Discord-on. Minden résztvevő látja az eredményt, és az algoritmus auditálható (commit-reveal scheme).

Ne maradj le. Csatlakozz most.

Csak email kell. Két kattintásra vagy a top 100-tól.

Sikeres regisztráció

Üdv a sorban, trader.

Itt a pozíciód, a meghívó linked, és a haladásod a következő szintig.

Az aktuális helyezésed
#2 848
a 2 848 regisztrálóból
🪙 Satoshi tier Még 100 pont a Trader szintig

A te meghívó linked

Oszd meg a linket — minden új belépő +50 pont-ot ad. Ha a meghívottad is hív valakit, kapsz +10 bónuszpontot.

Haladásod a Trader tierhez 50 / 100 pont
Satoshi
Trader
Analyst
Whale
MarketMaker

Statisztikák

50
Pontok
1
Meghívás
#2 848
Helyezés
2 848
Összesen

Megnyerhető jutalmak

Korai hozzáférés
FELOLDVA · Satoshi tier
1 hónap ingyen előfizetés
Trader tier · még 50 pont
Kezdő kurzus, ingyen
Analyst tier · még 250 pont
Sorsolás · Fődíj $3 500
MarketMaker · még 950 pont
Link másolva!
` blokkja HELYÉRE (a fájl ALJÁN, kb. az 1638-1792 sorok). * * Mit csinál: * - signup(): POST /api/waitlist/signup → "ellenőrizd az email-edet" toast * - URL `?verify=TOKEN` → szerver-redirect-tel jött vissza, kezeljük * - URL `?ref=XYZ` → fetch /api/waitlist/me → ha verified, dashboard-nézet * - URL `?ref=XYZ&verified=1` → friss verifikáció → dashboard + welcome-toast * - URL `?error=CODE` → hiba-toast * - Leaderboard polling: 30s-ként refresh /api/waitlist/leaderboard * - Activity-feed polling: 30s-ként refresh /api/waitlist/activity * * Konfig: a `WAITLIST_API_BASE` változót a deploy előtt állítsd be: * - Production: https://app.cryptofolio.hu (a Next.js webapp domain) * - Dev: http://localhost:3000 */ // === CONFIG — DEPLOY ELŐTT ÁTÍRD! ================================= const WAITLIST_API_BASE = 'https://app.cryptofolio.hu'; // ==================================================================== (function () { 'use strict'; const TIER_LABELS = { satoshi: { name: 'Satoshi', emoji: '🪙', tickets: 1 }, trader: { name: 'Trader', emoji: '⚡', tickets: 5 }, analyst: { name: 'Analyst', emoji: '📊', tickets: 10 }, whale: { name: 'Whale', emoji: '💎', tickets: 20 }, marketmaker: { name: 'MarketMaker', emoji: '👑', tickets: 50 }, }; const ACTIVITY_LABELS = { signup_verified: 'csatlakozott a sorhoz', referral_l1: 'meghívott egy új tagot', referral_l2: 'indirekt-meghívás bónusz', social_share: 'megosztotta a sort', tier_up: 'új tier-t ért el', admin_adjustment: 'adminisztrátori módosítás', }; const ERROR_MESSAGES = { invalid_token: 'Érvénytelen megerősítő link.', token_not_found: 'A megerősítő link nem található vagy lejárt.', token_expired: 'A megerősítő link lejárt. Regisztrálj újra.', rate_limit: 'Túl sok próbálkozás. Próbáld újra egy perc múlva.', server_error: 'Szerverhiba. Próbáld újra később.', }; // ==================================================================== // STATE // ==================================================================== const state = { refCode: null, email: null, verified: false, tier: 'satoshi', points: 0, tickets: 1, inviteCount: 0, position: null, totalVerified: 0, }; // ==================================================================== // UTILITIES // ==================================================================== function $(sel) { return document.querySelector(sel); } function $$(sel) { return document.querySelectorAll(sel); } function setView(name) { $$('.view').forEach(v => v.setAttribute('data-active', 'false')); const target = $('#view-' + name); if (target) target.setAttribute('data-active', 'true'); window.scrollTo({ top: 0 }); } function showToast(text, type) { const t = $('#toast'); if (!t) return; const txt = $('#toastText'); if (txt) txt.textContent = text; t.classList.remove('error'); if (type === 'error') t.classList.add('error'); t.classList.add('show'); setTimeout(() => t.classList.remove('show'), 3000); } function fmtNumber(n) { return (n ?? 0).toLocaleString('hu-HU').replace(/,/g, ' '); } function readQuery(key) { return new URLSearchParams(window.location.search).get(key); } function setLocalRef(refCode) { try { localStorage.setItem('cfh_waitlist_ref', refCode); } catch (_) {} } function getLocalRef() { try { return localStorage.getItem('cfh_waitlist_ref'); } catch (_) { return null; } } // ==================================================================== // API CALLS // ==================================================================== async function apiPost(path, body) { const r = await fetch(WAITLIST_API_BASE + path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), credentials: 'omit', }); return { status: r.status, data: await r.json().catch(() => ({})) }; } async function apiGet(path) { const r = await fetch(WAITLIST_API_BASE + path, { method: 'GET', credentials: 'omit', }); return { status: r.status, data: await r.json().catch(() => ({})) }; } // ==================================================================== // SIGNUP FLOW // ==================================================================== async function signup(e) { if (e && e.preventDefault) e.preventDefault(); const form = e.target; const emailInput = form.querySelector('input[type=email]'); const consentInput = form.querySelector('input[type=checkbox][name=consent]'); const honeypotInput = form.querySelector('input[name=website]'); const submitBtn = form.querySelector('button[type=submit]'); const email = emailInput?.value?.trim(); if (!email) { showToast('Add meg az email-címedet.', 'error'); return; } if (consentInput && !consentInput.checked) { showToast('El kell fogadnod a feltételeket.', 'error'); return; } // UTM-parameters from URL const sp = new URLSearchParams(window.location.search); const utm = {}; for (const k of ['source', 'medium', 'campaign', 'term', 'content']) { const v = sp.get('utm_' + k); if (v) utm[k] = v.slice(0, 80); } // Refcode from URL or localStorage const refCode = readQuery('ref') || getLocalRef() || null; if (submitBtn) { submitBtn.disabled = true; submitBtn.dataset.origLabel = submitBtn.textContent; submitBtn.textContent = 'Küldés...'; } try { const { status, data } = await apiPost('/api/waitlist/signup', { email, refCode, website: honeypotInput?.value ?? '', utm: Object.keys(utm).length ? utm : undefined, consent: true, }); if (status === 200 && data.alreadyVerified) { // Már verifikálva → próbáljunk meg dashboard-ot betölteni if (data.refCode) setLocalRef(data.refCode); await loadDashboard(data.refCode); showToast('Már regisztráltál! Itt a dashboardod.'); return; } if (status === 200 && data.alreadyRegistered) { showToast(data.message || 'Megerősítő emailt küldtünk újra. Nézd meg a postaládát!'); showVerifyPending(email); return; } if (status === 201 && data.ok) { setLocalRef(data.refCode); showToast('Sikeres regisztráció! Erősítsd meg az email-címed.'); showVerifyPending(email); return; } showToast(data.error || 'Ismeretlen hiba a regisztráció során.', 'error'); } catch (err) { showToast('Hálózati hiba. Ellenőrizd a kapcsolatot.', 'error'); } finally { if (submitBtn) { submitBtn.disabled = false; submitBtn.textContent = submitBtn.dataset.origLabel || 'Csatlakozom'; } } } function showVerifyPending(email) { // Egyszerű variant: a hero-formot átírjuk "ellenőrizd az email-edet" overlay-re const hero = $('.hero'); if (!hero) return; const existing = $('#verifyPendingBox'); if (existing) existing.remove(); const box = document.createElement('div'); box.id = 'verifyPendingBox'; box.style.cssText = 'max-width:560px;margin:24px auto;padding:24px;background:rgba(212,160,74,0.08);border:1px solid rgba(212,160,74,0.3);border-radius:14px;text-align:center;color:var(--text)'; box.innerHTML = `
📧

Ellenőrizd a postaládádat

Megerősítő emailt küldtünk a ${email} címre. Kattints a benne levő gombra a regisztráció véglegesítéséhez.

Nem találod? Nézd meg a spam/promóció mappát.

`; hero.appendChild(box); } // ==================================================================== // DASHBOARD LOAD // ==================================================================== async function loadDashboard(refCode) { if (!refCode) return; try { const { status, data } = await apiGet('/api/waitlist/me?ref=' + encodeURIComponent(refCode)); if (status !== 200) { showToast(data.error || 'Nem található regisztráció.', 'error'); return; } state.refCode = data.refCode; state.email = data.email; state.verified = data.verified; state.tier = data.tier; state.points = data.points; state.tickets = data.tickets; state.inviteCount = data.inviteCount; state.position = data.position; state.totalVerified = data.totalVerified; renderDashboard(); setView('dashboard'); } catch (err) { showToast('Hálózati hiba a dashboard betöltésénél.', 'error'); } } function renderDashboard() { const dashName = $('#dashName'); if (dashName) dashName.textContent = (state.email || 'trader').split('@')[0]; const posNum = $('#posNum'); if (posNum) posNum.textContent = fmtNumber(state.position); const posOf = $('.pos-of b'); if (posOf) posOf.textContent = fmtNumber(state.totalVerified); const refCodeEl = $('#refCode'); if (refCodeEl) refCodeEl.textContent = state.refCode || 'TRADER-XXXX'; const statPoints = $('#statPoints'); if (statPoints) statPoints.textContent = fmtNumber(state.points); const statInvites = $('#statInvites'); if (statInvites) statInvites.textContent = fmtNumber(state.inviteCount); const statRank = $('#statRank'); if (statRank) statRank.textContent = '#' + fmtNumber(state.position); const statTickets = $('#statTickets'); if (statTickets) statTickets.textContent = fmtNumber(state.tickets) + '×'; const curPoints = $('#curPoints'); if (curPoints) curPoints.textContent = fmtNumber(state.points); // Tier-progress const tiers = [ { id: 'satoshi', min: 0, max: 100 }, { id: 'trader', min: 100, max: 300 }, { id: 'analyst', min: 300, max: 600 }, { id: 'whale', min: 600, max: 1000 }, { id: 'marketmaker', min: 1000, max: 5000 }, ]; const curTierIdx = tiers.findIndex(t => t.id === state.tier); const t = tiers[curTierIdx >= 0 ? curTierIdx : 0]; const pct = Math.min(100, ((state.points - t.min) / (t.max - t.min)) * 100); const bar = $('#tpBar'); if (bar) bar.style.width = pct + '%'; $$('.tp-node').forEach((n, i) => { n.setAttribute('data-on', i <= curTierIdx ? 'true' : 'false'); }); } // ==================================================================== // LEADERBOARD POLLING // ==================================================================== async function refreshLeaderboard() { try { const { status, data } = await apiGet('/api/waitlist/leaderboard?limit=10'); if (status !== 200 || !data.leaderboard) return; renderLeaderboard(data.leaderboard, data.stats); } catch (_) {} } function renderLeaderboard(leaders, stats) { const tbody = $('.lb-table'); if (!tbody) return; // Kivesszük a podium és sima row-okat (a "you" row marad) const youRow = tbody.querySelector('.lb-row.you'); tbody.querySelectorAll('.lb-row:not(.you)').forEach(r => r.remove()); leaders.forEach((row, i) => { const tierInfo = TIER_LABELS[row.tier] || TIER_LABELS.satoshi; const rankBadge = i === 0 ? '👑 1' : i === 1 ? '🥈 2' : i === 2 ? '🥉 3' : String(i + 1); const podiumClass = i < 3 ? 'podium-' + (i + 1) : ''; const div = document.createElement('div'); div.className = 'lb-row ' + podiumClass; div.innerHTML = `
${rankBadge}
${(row.publicName || '??').slice(0, 2).toUpperCase()}
${escapeHtml(row.publicName)}
${row.inviteCount} meghívás
${tierInfo.name}
${fmtNumber(row.points)}
`; if (youRow) { tbody.insertBefore(div, youRow); } else { tbody.appendChild(div); } }); // Update "you" row if logged in if (youRow && state.refCode) { const rankEl = youRow.querySelector('.lb-rank'); const nmEl = youRow.querySelector('.nm'); const subEl = youRow.querySelector('.sub'); const ptsEl = youRow.querySelector('.lb-pts'); const tierBadge = youRow.querySelector('.lb-tier-badge'); if (rankEl && state.position) rankEl.textContent = fmtNumber(state.position); if (nmEl) nmEl.textContent = 'te (' + (state.email || state.refCode) + ')'; if (subEl) subEl.textContent = state.inviteCount + ' meghívás'; if (ptsEl) ptsEl.textContent = fmtNumber(state.points); if (tierBadge) { tierBadge.textContent = (TIER_LABELS[state.tier] || TIER_LABELS.satoshi).name; } } // Aggregate stats if (stats) { $$('.live, [data-stat=signups]').forEach(el => { if (el.textContent && /\d/.test(el.textContent)) { el.textContent = fmtNumber(stats.totalVerified) + ' verifikált tag (' + stats.totalSignups + ' összes regisztráció)'; } }); } } // ==================================================================== // ACTIVITY FEED POLLING // ==================================================================== async function refreshActivity() { try { const { status, data } = await apiGet('/api/waitlist/activity?limit=10'); if (status !== 200 || !data.activity) return; renderActivityFeed(data.activity); } catch (_) {} } function renderActivityFeed(activities) { const feed = $('.feed'); if (!feed) return; feed.innerHTML = ''; activities.forEach(a => { const div = document.createElement('div'); div.className = 'feed-item'; const label = ACTIVITY_LABELS[a.kind] || 'esemény történt'; div.innerHTML = `
${(a.subjectPublicName || '??').slice(0, 2).toUpperCase()}
${escapeHtml(a.subjectPublicName)} ${escapeHtml(label)}
${timeAgo(a.createdAt)} `; feed.appendChild(div); }); } function timeAgo(iso) { const t = new Date(iso).getTime(); const diffSec = Math.max(0, Math.floor((Date.now() - t) / 1000)); if (diffSec < 60) return diffSec + 's'; if (diffSec < 3600) return Math.floor(diffSec / 60) + 'p'; if (diffSec < 86400) return Math.floor(diffSec / 3600) + 'ó'; return Math.floor(diffSec / 86400) + 'n'; } // ==================================================================== // COPY + SHARE // ==================================================================== function copyLink() { const link = 'https://cryptofolio.hu/varolista?ref=' + (state.refCode || 'TRADER-XXXX'); if (navigator.clipboard) { navigator.clipboard.writeText(link).catch(() => {}); } else { // Fallback: textarea-trick const ta = document.createElement('textarea'); ta.value = link; document.body.appendChild(ta); ta.select(); try { document.execCommand('copy'); } catch (_) {} document.body.removeChild(ta); } const btn = $('#copyBtn'); if (btn) { btn.classList.add('copied'); const label = btn.querySelector('.btn-label'); if (label) label.textContent = 'Másolva!'; setTimeout(() => { btn.classList.remove('copied'); if (label) label.textContent = 'Másolás'; }, 1800); } showToast('Meghívó link a vágólapon!'); } function shareTo(platform) { const link = encodeURIComponent('https://cryptofolio.hu/varolista?ref=' + (state.refCode || 'TRADER')); const txt = encodeURIComponent('Csatlakozz a Cryptofolio Hungary várólistához — fődíj 1 év MarketMaker tagság!'); const urls = { x: 'https://twitter.com/intent/tweet?text=' + txt + '&url=' + link, fb: 'https://www.facebook.com/sharer/sharer.php?u=' + link, wa: 'https://wa.me/?text=' + txt + '%20' + link, dc: '#discord', }; if (platform === 'dc') { copyLink(); showToast('Discord link másolva!'); return; } if (urls[platform]) window.open(urls[platform], '_blank', 'noopener,noreferrer'); } function escapeHtml(s) { return String(s ?? '').replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', }[c])); } // Expose for HTML inline handlers window.signup = signup; window.copyLink = copyLink; window.shareTo = shareTo; window.setView = setView; // ==================================================================== // INITIALIZATION // ==================================================================== document.addEventListener('DOMContentLoaded', async () => { // URL-paraméterek feldolgozása const verified = readQuery('verified'); const already = readQuery('already'); const errorCode = readQuery('error'); const urlRef = readQuery('ref'); if (errorCode) { showToast(ERROR_MESSAGES[errorCode] || 'Hiba történt: ' + errorCode, 'error'); // Url-cleanup history.replaceState({}, '', window.location.pathname); } if (verified === '1' && urlRef) { // Friss verifikáció — mentsük el local-store-ba, és üzenjünk setLocalRef(urlRef); await loadDashboard(urlRef); showToast(already === '1' ? 'Már korábban verifikáltad ezt a regisztrációt.' : 'Email megerősítve! Üdv a sorban! 🎉'); // URL-cleanup (NE maradjon a "?verified=1" az URL-en) history.replaceState({}, '', window.location.pathname + '?ref=' + urlRef); } else if (urlRef) { // Csak refcode → dashboard betöltés (más user megosztotta a linkjét) await loadDashboard(urlRef); } else { // Lokál refcode — saját korábbi regisztráció? const localRef = getLocalRef(); if (localRef) { await loadDashboard(localRef); } } // Leaderboard + activity polling refreshLeaderboard(); refreshActivity(); setInterval(refreshLeaderboard, 30_000); setInterval(refreshActivity, 30_000); }); // Smooth scroll for nav links document.querySelectorAll('a[href^="#"]').forEach(a => { a.addEventListener('click', (e) => { const id = a.getAttribute('href').slice(1); const el = document.getElementById(id); if (el) { e.preventDefault(); el.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); })();