Privacy Policy

Last updated: April 2025 — ZIRA Protocol

1. Overview

This Privacy Policy explains how ZIRA Protocol (“ZIRA”, “we”, “our”) collects, uses, stores, and protects information you provide when using our website (zira.network) and participating in the ZIRA Foundation Round. We take your privacy seriously and handle your data with care.

2. What we collect

When you submit a Foundation position request, we collect:

We do not collect your wallet address, government ID, phone number, or payment method details. You send USDT directly to a protocol-controlled address — we receive no banking or card information.

3. Website data

Like most websites, our servers may record standard access logs including IP addresses, browser type, referring pages, and access timestamps. This data is used solely for security monitoring and aggregate analytics. We use no tracking pixels, no behavioural analytics platforms, and no advertising trackers on zira.network.

We use localStorage in your browser to save the Foundation countdown timer state across page reloads. This data stays in your browser and is never transmitted to us.

4. How we use your data

We use your personal data exclusively for:

We do not use your data for advertising, profiling, or any purpose unrelated to your Foundation participation.

5. Who we share data with

We do not sell, rent, or trade your personal data. We may share it only with:

6. The positions monitor

The Foundation positions monitor on our website displays anonymized participation data. Your name and email are never shown publicly. The monitor shows:

This data is manually curated by the ZIRA team and contains no information that could identify you.

7. Data retention

We retain your registration data for as long as necessary to:

After this period, your personal data is deleted from our systems. Anonymized aggregate statistics (total participants, total committed, etc.) may be retained indefinitely for protocol history.

8. Your rights

Depending on your jurisdiction, you may have the right to:

To exercise any of these rights, contact us at privacy@zira.network with your securing code as identification. We will respond within 30 days.

9. Data security

We implement appropriate technical and organisational measures to protect your personal data against unauthorised access, loss, or destruction. These include:

No security measure is perfect. In the event of a data breach affecting your personal information, we will notify you within 72 hours of becoming aware of it, in accordance with applicable law.

10. Children

ZIRA services are not directed at individuals under the age of 18. We do not knowingly collect personal data from minors. If you believe a minor has submitted a Foundation registration, please contact us and we will delete the associated data immediately.

11. Third-party links

Our website may link to third-party sites (e.g., documentation platforms, community channels). This Privacy Policy applies only to zira.network. We are not responsible for the privacy practices of third-party sites.

12. Changes to this policy

We may update this Privacy Policy from time to time. Changes will be posted on this page with an updated “Last updated” date. If changes are material, we will notify Foundation participants by email.

13. Contact

For privacy-related questions or to exercise your rights, contact us at privacy@zira.network. Please include your securing code in all correspondence so we can locate your registration.

+ (n / 1000).toFixed(1) + 'k'; return ' + n; } function genCode() { var chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; var code = 'ZIRA-'; for (var i = 0; i < 6; i++) code += chars[Math.floor(Math.random() * chars.length)]; return code; } /* -- SCROLL REVEAL (bulletproof) ----------------------- */ function initReveal() { var wrapper = qs('.zira-page') || qs('#zira-root'); var fades = qsa('.z-fade'); if (!fades.length) return; // Step 1: pre-mark elements already in viewport BEFORE enabling CSS hiding fades.forEach(function (el) { var r = el.getBoundingClientRect(); if (r.top < window.innerHeight + 20) { el.classList.add('z-up'); } }); // Step 2: enable CSS-based hiding (only elements without z-up will hide) if (wrapper) wrapper.classList.add('z-js-loaded'); // Step 3: observe remaining elements if (!window.IntersectionObserver) { // Fallback: make everything visible fades.forEach(function (el) { el.classList.add('z-up'); }); return; } var io = new IntersectionObserver(function (entries) { entries.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add('z-up'); io.unobserve(e.target); } }); }, { threshold: 0.04, rootMargin: '0px 0px -8px 0px' }); fades.forEach(function (el) { if (!el.classList.contains('z-up')) io.observe(el); }); } /* -- SCROLL PROGRESS ----------------------------------- */ function initProgress() { var bar = qs('#z-progress'); if (!bar) return; function update() { var s = document.documentElement.scrollTop || document.body.scrollTop; var h = document.documentElement.scrollHeight - window.innerHeight; bar.style.width = (h > 0 ? (s / h * 100) : 0) + '%'; } window.addEventListener('scroll', update, { passive: true }); update(); } /* -- SECTION DOTS -------------------------------------- */ function initDots() { var nav = qs('#z-dots'); if (!nav) return; var sections = CONFIG.SECTIONS.map(function (id) { return qs('#' + id); }).filter(Boolean); if (!sections.length) return; sections.forEach(function (sec, i) { var lbl = (sec.getAttribute('data-dot') || sec.id); var btn = document.createElement('button'); btn.setAttribute('aria-label', lbl); btn.title = lbl; btn.addEventListener('click', function () { sec.scrollIntoView({ behavior: 'smooth' }); }); nav.appendChild(btn); }); var btns = qsa('button', nav); function update() { var mid = window.scrollY + window.innerHeight / 2; var active = 0; sections.forEach(function (sec, i) { if (sec.offsetTop <= mid) active = i; }); btns.forEach(function (b, i) { b.classList.toggle('z-on', i === active); }); } window.addEventListener('scroll', update, { passive: true }); update(); } /* -- FLOATING CTA -------------------------------------- */ function initFloat() { var el = qs('#z-float'); if (!el) return; var hero = qs('#home'); function update() { var heroH = hero ? hero.offsetTop + hero.offsetHeight : 400; el.classList.toggle('z-show', window.scrollY > heroH - 100); } window.addEventListener('scroll', update, { passive: true }); update(); } /* -- TYPEWRITER ---------------------------------------- */ function initTypewriter() { var el = qs('#z-typewriter'); if (!el) return; var phrases = CONFIG.TYPEWRITER; var pi = 0, ci = 0, deleting = false; var SPEED_TYPE = 38, SPEED_DEL = 18, PAUSE = 2800; function tick() { var phrase = phrases[pi]; if (!deleting) { el.textContent = phrase.slice(0, ci + 1); ci++; if (ci >= phrase.length) { deleting = true; setTimeout(tick, PAUSE); return; } setTimeout(tick, SPEED_TYPE); } else { el.textContent = phrase.slice(0, ci - 1); ci--; if (ci <= 0) { deleting = false; pi = (pi + 1) % phrases.length; setTimeout(tick, 400); return; } setTimeout(tick, SPEED_DEL); } } setTimeout(tick, 900); } /* -- NAV ----------------------------------------------- */ function initNav() { var nav = qs('#z-nav'); if (!nav) return; function update() { nav.classList.toggle('z-scrolled', window.scrollY > 60); } window.addEventListener('scroll', update, { passive: true }); update(); } /* -- MENU ---------------------------------------------- */ function initMenu() { var burger = qs('#z-burger'); var drawer = qs('#z-drawer'); var overlay = qs('#z-overlay'); var closeBtn = qs('#z-drawer-close'); if (!burger || !drawer) return; function open() { burger.classList.add('open'); drawer.classList.add('open'); if (overlay) overlay.classList.add('open'); document.body.style.overflow = 'hidden'; } function close() { burger.classList.remove('open'); drawer.classList.remove('open'); if (overlay) overlay.classList.remove('open'); document.body.style.overflow = ''; } burger.addEventListener('click', function () { drawer.classList.contains('open') ? close() : open(); }); if (closeBtn) closeBtn.addEventListener('click', close); if (overlay) overlay.addEventListener('click', close); qsa('a', drawer).forEach(function (a) { a.addEventListener('click', close); }); } /* -- COUNTDOWN ----------------------------------------- */ function initCountdown() { var dEl = qs('#z-cd-d'), hEl = qs('#z-cd-h'), mEl = qs('#z-cd-m'), sEl = qs('#z-cd-s'); if (!dEl) return; var end = CONFIG.FOUNDATION_END.getTime(); function update() { var diff = end - Date.now(); if (diff <= 0) { dEl.textContent = hEl.textContent = mEl.textContent = sEl.textContent = '00'; return; } var d = Math.floor(diff / 86400000); var h = Math.floor((diff % 86400000) / 3600000); var m = Math.floor((diff % 3600000) / 60000); var s = Math.floor((diff % 60000) / 1000); dEl.textContent = pad(d); hEl.textContent = pad(h); mEl.textContent = pad(m); sEl.textContent = pad(s); } update(); setInterval(update, 1000); } /* -- CALCULATOR ---------------------------------------- */ function initCalc() { var sel = qs('#z-amount'); var usdEl = qs('#z-calc-usd'); var zirEl = qs('#z-calc-zir'); var incEl = qs('#z-calc-income'); if (!sel) return; function update() { var usd = parseFloat(sel.value) || 500; var zir = Math.round(usd / CONFIG.ZIR_PRICE); var income = Math.round(zir * CONFIG.YIELD); if (usdEl) usdEl.textContent = ' + usd.toLocaleString() + ' USDT'; if (zirEl) zirEl.textContent = zir.toLocaleString() + ' ZIR'; if (incEl) incEl.textContent = income.toLocaleString() + ' ZIR / year + fee share'; } sel.addEventListener('change', update); update(); } /* -- FORM ---------------------------------------------- */ function initForm() { var form = qs('#z-form'); var formState = qs('#z-form-state'); var confirmState = qs('#z-confirm-state'); if (!form || !confirmState) return; form.addEventListener('submit', function (e) { e.preventDefault(); var btn = qs('#z-submit-btn'); if (btn) { btn.disabled = true; btn.textContent = 'Securing\u2026'; } var email = (qs('#z-email', form) || {}).value || ''; var usd = parseFloat((qs('#z-amount', form) || {}).value) || 500; var code = genCode(); var addr = CONFIG.USDT_ADDRESS; setTimeout(function () { // show confirmation if (formState) formState.style.display = 'none'; confirmState.style.display = 'block'; var codeEl = qs('#z-code-display'); var addrEl = qs('#z-addr-display'); var usdEl2 = qs('#z-confirm-usd-display'); var emailEl = qs('#z-confirm-email-display'); if (codeEl) codeEl.textContent = code; if (addrEl) addrEl.textContent = addr; if (usdEl2) usdEl2.textContent = ' + usd.toLocaleString() + ' USDT'; if (emailEl) emailEl.textContent = email; // copy button var copyBtn = qs('#z-copy-addr'); if (copyBtn) { copyBtn.addEventListener('click', function () { if (navigator.clipboard) { navigator.clipboard.writeText(addr).then(function () { copyBtn.textContent = '\u2713 Copied!'; setTimeout(function () { copyBtn.textContent = '\uD83D\uDCCB Copy address'; }, 2000); }); } }); } // 48-hour deadline var ddlEl = qs('#z-confirm-ddl'); if (ddlEl) { var deadline = new Date(Date.now() + 48 * 3600 * 1000); ddlEl.textContent = '\u23F3 This address is valid until ' + deadline.toUTCString() + '. After that, contact support with your securing code.'; } }, 1200); }); } /* -- MONITOR ------------------------------------------- */ function initMonitor() { var totalEl = qs('#z-m-total'); var usdEl = qs('#z-m-usd'); var zirEl = qs('#z-m-zir'); var avgEl = qs('#z-m-avg'); var barEl = qs('#z-m-bar'); var pctEl = qs('#z-m-pct'); var tbody = qs('#z-pos-tbody'); var progFill = qs('#z-prog-fill'); var progCnt = qs('#z-prog-count'); var m = CONFIG.MONITOR; var total = m.total; var totalUsd = m.totalUsd; var avgUsd = Math.round(totalUsd / total); var totalZir = Math.round(totalUsd / CONFIG.ZIR_PRICE); var pct = m.poolPct; if (totalEl) totalEl.textContent = total; if (usdEl) usdEl.textContent = ' + totalUsd.toLocaleString(); if (zirEl) zirEl.textContent = fmtZir(totalZir); if (avgEl) avgEl.textContent = fmtUsd(avgUsd); if (pctEl) pctEl.textContent = pct.toFixed(1) + '%'; if (progCnt) progCnt.textContent = total + ' / est. 350 total'; // Animate bars on visibility function animateBars() { if (barEl) barEl.style.width = pct + '%'; if (progFill) progFill.style.width = (pct / 1 > 100 ? 100 : pct) + '%'; } var barObserver = new IntersectionObserver(function (entries) { if (entries[0].isIntersecting) { animateBars(); barObserver.disconnect(); } }, { threshold: 0.3 }); var monitorEl = qs('.z-monitor'); if (monitorEl) barObserver.observe(monitorEl); // Table if (!tbody) return; tbody.innerHTML = ''; CONFIG.POSITIONS.forEach(function (p) { var zir = Math.round(p.usd / CONFIG.ZIR_PRICE); var tr = document.createElement('tr'); tr.innerHTML = '' + p.id + '' + '' + p.init + '' + ' + p.usd.toLocaleString() + '' + '' + zir.toLocaleString() + ' ZIR' + ' Confirmed' + '' + p.ts + ''; tbody.appendChild(tr); }); } /* -- ZTI BARS ------------------------------------------ */ function initZTI() { var bars = qsa('.z-zti-fill'); if (!bars.length) return; var io = new IntersectionObserver(function (entries) { if (entries[0].isIntersecting) { bars.forEach(function (b) { b.style.width = (b.getAttribute('data-w') || 0) + '%'; }); io.disconnect(); } }, { threshold: 0.3 }); var container = qs('#z-zti-bars'); if (container) io.observe(container); } /* -- HERO CANVAS --------------------------------------- */ function initHeroCanvas() { var canvas = qs('#z-hero-canvas'); if (!canvas || !canvas.getContext) return; var ctx = canvas.getContext('2d'); function resize() { canvas.width = canvas.offsetWidth; canvas.height = canvas.offsetHeight; } resize(); window.addEventListener('resize', resize); // Floating node graph var nodes = []; var NODE_COUNT = 38; var COLORS = ['rgba(0,216,196,', 'rgba(123,92,240,', 'rgba(232,168,60,']; for (var i = 0; i < NODE_COUNT; i++) { nodes.push({ x: Math.random() * canvas.width, y: Math.random() * canvas.height, vx: (Math.random() - .5) * .4, vy: (Math.random() - .5) * .4, r: Math.random() * 2.5 + 1, c: COLORS[Math.floor(Math.random() * COLORS.length)], a: Math.random() * .5 + .2 }); } var raf; function draw() { if (document.hidden) { raf = requestAnimationFrame(draw); return; } ctx.clearRect(0, 0, canvas.width, canvas.height); // Move nodes.forEach(function (n) { n.x += n.vx; n.y += n.vy; if (n.x < 0 || n.x > canvas.width) n.vx *= -1; if (n.y < 0 || n.y > canvas.height) n.vy *= -1; }); // Edges var MAX_DIST = 140; for (var i = 0; i < nodes.length; i++) { for (var j = i + 1; j < nodes.length; j++) { var dx = nodes[i].x - nodes[j].x; var dy = nodes[i].y - nodes[j].y; var d = Math.sqrt(dx * dx + dy * dy); if (d < MAX_DIST) { var alpha = (1 - d / MAX_DIST) * 0.12; ctx.beginPath(); ctx.moveTo(nodes[i].x, nodes[i].y); ctx.lineTo(nodes[j].x, nodes[j].y); ctx.strokeStyle = nodes[i].c + alpha + ')'; ctx.lineWidth = 0.8; ctx.stroke(); } } } // Nodes nodes.forEach(function (n) { ctx.beginPath(); ctx.arc(n.x, n.y, n.r, 0, Math.PI * 2); ctx.fillStyle = n.c + n.a + ')'; ctx.fill(); }); raf = requestAnimationFrame(draw); } draw(); } /* -- NETWORK CANVAS ------------------------------------ */ function initNetCanvas() { var canvas = qs('#z-net-canvas'); if (!canvas || !canvas.getContext) return; var ctx = canvas.getContext('2d'); function resize() { canvas.width = canvas.offsetWidth; canvas.height = canvas.offsetHeight; } resize(); window.addEventListener('resize', resize); var ROLES = [ { label: 'Validator', x: .5, y: .18, color: '#00D8C4' }, { label: 'Validator', x: .18, y: .42, color: '#00D8C4' }, { label: 'Validator', x: .82, y: .42, color: '#00D8C4' }, { label: 'Operator', x: .35, y: .68, color: '#7B5CF0' }, { label: 'Operator', x: .65, y: .68, color: '#7B5CF0' }, { label: 'LP', x: .2, y: .82, color: '#E8A83C' }, { label: 'LP', x: .8, y: .82, color: '#E8A83C' }, { label: 'Governor', x: .5, y: .88, color: '#34D399' } ]; var EDGES = [[0,1],[0,2],[1,2],[1,3],[2,4],[3,4],[3,5],[4,6],[5,7],[6,7],[0,3],[0,4]]; var packets = []; setInterval(function () { if (packets.length < 12) { var e = EDGES[Math.floor(Math.random() * EDGES.length)]; packets.push({ from: e[0], to: e[1], t: 0, speed: 0.012 + Math.random() * 0.012 }); } }, 600); function getPos(node) { return { x: node.x * canvas.width, y: node.y * canvas.height }; } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); // Edges EDGES.forEach(function (e) { var a = getPos(ROLES[e[0]]), b = getPos(ROLES[e[1]]); ctx.beginPath(); ctx.moveTo(a.x, a.y); ctx.lineTo(b.x, b.y); ctx.strokeStyle = 'rgba(30,43,96,.8)'; ctx.lineWidth = 1; ctx.stroke(); }); // Packets packets.forEach(function (p, i) { p.t += p.speed; if (p.t >= 1) { packets.splice(i, 1); return; } var a = getPos(ROLES[p.from]), b = getPos(ROLES[p.to]); var x = a.x + (b.x - a.x) * p.t; var y = a.y + (b.y - a.y) * p.t; ctx.beginPath(); ctx.arc(x, y, 3, 0, Math.PI * 2); ctx.fillStyle = ROLES[p.from].color + 'CC'; ctx.fill(); }); // Nodes ROLES.forEach(function (n) { var p = getPos(n); var sz = canvas.width < 400 ? 26 : 34; ctx.beginPath(); ctx.arc(p.x, p.y, sz / 2, 0, Math.PI * 2); ctx.fillStyle = '#0B1130'; ctx.fill(); ctx.strokeStyle = n.color + '88'; ctx.lineWidth = 1.5; ctx.stroke(); ctx.fillStyle = n.color; ctx.font = 'bold ' + (canvas.width < 400 ? 8 : 9) + 'px Inter,sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillText(n.label, p.x, p.y); }); requestAnimationFrame(draw); } draw(); } /* -- FAQ ----------------------------------------------- */ function initFAQ() { qsa('.z-faq-item').forEach(function (item) { var btn = item.querySelector('.z-faq-q'); if (!btn) return; btn.addEventListener('click', function () { var isOpen = item.classList.contains('open'); qsa('.z-faq-item.open').forEach(function (o) { o.classList.remove('open'); }); if (!isOpen) item.classList.add('open'); }); }); } /* -- USE CASE TABS ------------------------------------- */ function initTabs() { var tabs = qsa('.z-uc-tab'); var panels = qsa('.z-uc-panel'); tabs.forEach(function (tab) { tab.addEventListener('click', function () { var key = tab.getAttribute('data-tab'); tabs.forEach(function (t) { t.classList.remove('z-on'); }); panels.forEach(function (p) { p.classList.remove('z-on'); }); tab.classList.add('z-on'); var panel = document.querySelector('.z-uc-panel[data-tab="' + key + '"]'); if (panel) panel.classList.add('z-on'); }); }); } /* -- SMOOTH SCROLL ------------------------------------- */ function initSmoothScroll() { qsa('a[href^="#"]').forEach(function (a) { a.addEventListener('click', function (e) { var id = a.getAttribute('href').slice(1); var target = id ? document.getElementById(id) : null; if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth' }); } }); }); } /* -- BOOT ---------------------------------------------- */ function boot() { initReveal(); // FIRST -- fixes content visibility initProgress(); initDots(); initFloat(); initNav(); initMenu(); initCountdown(); initTypewriter(); initCalc(); initForm(); initMonitor(); initZTI(); initHeroCanvas(); initNetCanvas(); initFAQ(); initTabs(); initSmoothScroll(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); } else { boot(); } })();