#gta6 blokuja leeki po nodach. ale podobno jak sie zapisze ponizszy kod jako .html i otworzy w przegladarce to on umie pobierac leeki bezposrednio z blockchaina i nie da sie zablokowac. jak cos xD
#vibecoding`‹!DOCTYPE html>
‹html lang="pl">
‹head>
‹meta charset="UTF-8">
‹meta name="viewport" content="width=device-width, initial-scale=1.0">
‹title>CYBERLEEK - Offline Viewer‹/title>
‹style>
* { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg:
#00050d; --card:
#001664; --border:
#003299;
--neon:
#0064ec; --neon-dim:
#0050b8; --neon-glow: rgba(0,100,236,0.25);
--green:
#60c33a; --green-glow: rgba(96,195,58,0.25);
--red:
#ff3355; --text:
#a0b0c8; --text-bright:
#d6efc1; --text-dim:
#6a7a90; --text-dark:
#3a4a60;
}
html, body { height: 100%; }
body {
font-family: "Courier New", "Lucida Console", Monaco, monospace;
background: var(--bg); color: var(--text);
min-height: 100vh; line-height: 1.6;
display: flex; flex-direction: column;
overflow-x: hidden;
}
body::before { content: ""; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: repeating-linear-gradient(0deg, transparent, transparent 4px, rgba(0,0,0,0.04) 4px, rgba(0,0,0,0.04) 8px); pointer-events: none; z-index: 9999; }
.wrapper { max-width: 860px; width: 100%; margin: 0 auto; padding: 20px 16px; flex: 1 0 auto; display: flex; flex-direction: column; }
.hero { text-align: center; padding: 20px 12px; position: relative; margin-bottom: 20px; border-bottom: 2px solid var(--neon); }
.hero h1 { font-size: 3em; font-weight: 900; letter-spacing: 4px; color: var(--neon); text-shadow: 0 0 30px var(--neon-glow); margin-bottom: 10px; }
#status { color: var(--amber); font-size: 0.9em; letter-spacing: 1px; animation: pulse 2s infinite; }
.card { background: var(--card); border: 1px solid var(--border); margin-bottom: 15px; position: relative; }
.card-head { padding: 10px 16px; font-size: 1em; font-weight: 700; letter-spacing: 2px; color: var(--green); display: flex; align-items: center; gap: 10px; border-bottom: 1px solid var(--border); background: rgba(96,195,58,0.05); }
.card-head .dot { width: 8px; height: 8px; background: var(--green); box-shadow: 0 0 8px var(--green); flex-shrink: 0; }
.card-body { padding: 16px; }
.content-item, .ann-item, .poll-item { border: 1px solid var(--border); padding: 15px; margin-bottom: 10px; background:
#00102b; }
.content-title { font-weight: 900; font-size: 1.2em; color: var(--neon); text-transform: uppercase; margin-bottom: 10px; word-wrap: break-word; }
.mirror-link { color: var(--neon); text-decoration: none; padding: 8px 12px; border: 1px solid var(--neon); font-size: 0.85em; font-weight: 700; transition: all 0.2s; background: rgba(0,100,236,0.1); display: inline-block; margin-right: 8px; margin-bottom: 8px; }
.mirror-link:hover { background: var(--neon-glow); }
.mirror-magnet { color: var(--green); border-color: var(--green); background: rgba(96,195,58,0.1); }
.mirror-magnet:hover { background: var(--green-glow); }
.ann-date { font-size: 0.8em; color: var(--text-dark); margin-bottom: 5px; }
.ann-title { font-weight: 700; font-size: 1.1em; color: var(--text-bright); margin-bottom: 5px; }
.ann-body { font-size: 0.9em; color: var(--text-dim); }
.poll-badge { display: inline-block; padding: 3px 10px; font-size: 0.8em; font-weight: bold; margin-bottom: 10px; border: 1px solid; }
.poll-badge.live { color: var(--green); border-color: var(--green); }
.poll-badge.ended { color: var(--red); border-color: var(--red); }
.choice-row { border: 1px solid var(--border); padding: 10px; margin-top: 8px; background:
#00050d; }
.choice-name { font-weight: bold; color: var(--text-bright); }
.choice-stats { float: right; color: var(--green); }
@keyframes pulse { 0% { opacity: 0.6; } 50% { opacity: 1; } 100% { opacity: 0.6; } }
‹/style>
‹/head>
‹body>
‹div class="wrapper">
‹header class="hero">
‹h1>CYBERLEEK DECODER‹/h1>
‹div id="status">Inicjalizacja i pobieranie danych z blockchaina...‹/div>
‹/header>
‹section class="card">
‹div class="card-head">‹div class="dot">‹/div> LEEKS (ZRZUTY)‹/div>
‹div class="card-body" id="content-leeks">‹span style="color:var(--text-dim)">Pobieranie...‹/span>‹/div>
‹/section>
‹section class="card">
‹div class="card-head">‹div class="dot" style="background:var(--neon);box-shadow:0 0 8px var(--neon);">‹/div> ANNOUNCEMENTS (OGŁOSZENIA)‹/div>
‹div class="card-body" id="content-anns">‹span style="color:var(--text-dim)">Pobieranie...‹/span>‹/div>
‹/section>
‹section class="card">
‹div class="card-head">‹div class="dot" style="background:
#fbbf24;box-shadow:0 0 8px
#fbbf24;">‹/div> POLLS (ANKIETY)‹/div>
‹div class="card-body" id="content-polls">‹span style="color:var(--text-dim)">Pobieranie...‹/span>‹/div>
‹/section>
‹/div>
‹script>
// Konfiguracja Solany
const PROGRAM_ID = "7rAgHPLDc9NryZmNdeEzyDui6D9PHkvTxMjKhNSa7w3a";
const RPCS = [
"
https://solana-rpc.publicnode.com",
"
https://api.mainnet-beta.solana.com",
"
https://solana.api.onfinality.io/public",
"
https://public.rpc.solanavibestation.com"
];
// Dyskryminatory programów z oryginalnego kodu
const CONFIG = {
LEEKS: { size: 7156, disc: "G6JNBZ2BSey" },
ANNS: { size: 656, disc: "NjkxTouaByo" },
POLLS: { size: 2800, disc: "5Qpj1hsHT4k" }
};
// Klasa pomocnicza odczytująca binarne typy danych Rust/Solana (Little Endian)
class BufferReader {
constructor(buffer) {
this.buffer = buffer;
this.dv = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
this.o = 0;
}
seek(offset) { this.o = offset; }
rem() { return this.buffer.length - this.o; }
u8() { const v = this.dv.getUint8(this.o); this.o += 1; return v; }
bool() { return this.u8() !== 0; }
u32() { const v = this.dv.getUint32(this.o, true); this.o += 4; return v; }
i64() { const v = Number(this.dv.getBigInt64(this.o, true)); this.o += 8; return v; }
u64() { const v = this.dv.getBigUint64(this.o, true); this.o += 8; return v; }
bytes(len) { const v = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset + this.o, len); this.o += len; return v; }
str() {
const len = this.u32();
const bytes = this.bytes(len);
return new TextDecoder().decode(bytes);
}
}
// Uniwersalna funkcja pobierająca dany typ konta
async function fetchAccounts(configType) {
const payload = {
jsonrpc: "2.0", id: 1, method: "getProgramAccounts",
params: [
PROGRAM_ID,
{
encoding: "base64",
filters: [
{ dataSize: configType.size },
{ memcmp: { offset: 0, bytes: configType.disc } }
]
}
]
};
for (const rpc of RPCS) {
try {
const response = await fetch(rpc, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
const data = await response.json();
if (data.result) return data.result;
} catch (err) {
console.warn(
RPC ${rpc} zawiódł.);
}
}
throw new Error(
Wszystkie RPC zablokowały zapytanie dla rozmiaru ${configType.size});
}
// Przetwarzanie Base64 na Uint8Array
function decodeBase64(base64) {
const binaryStr = atob(base64);
const bytes = new Uint8Array(binaryStr.length);
for (let i = 0; i < binaryStr.length; i++) bytes[i] = binaryStr.charCodeAt(i);
return bytes;
}
function formatTime(unixTimestamp) {
return new Date(unixTimestamp * 1000).toLocaleString('pl-PL', { year:'numeric', month:'short', day:'numeric', hour:'2-digit', minute:'2-digit' });
}
// --- PARSOWANIE I RENDEROWANIE LEEKS ---
async function loadLeeks() {
const el = document.getElementById("content-leeks");
try {
const accounts = await fetchAccounts(CONFIG.LEEKS);
let items = [];
for (const acc of accounts) {
const reader = new BufferReader(decodeBase64(acc.account.data[0]));
reader.seek(8); // Pomiń dyskryminator
reader.bytes(32); // Pomiń pubkey autora
const timestamp = reader.i64();
const title = reader.str();
const pos = reader.o;
let links = [];
try {
const len = reader.u32();
for (let i = 0; i < len; i++) links.push({ label: reader.str(), url: reader.str() });
} catch(e) {
reader.seek(pos);
const str = reader.str();
links = [{ label: str, url: str }];
}
items.push({ timestamp, title, links });
}
items.sort((a, b) => b.timestamp - a.timestamp);
if(!items.length) { el.innerHTML = "Brak wpisów"; return; }
el.innerHTML = items.map(item => `
‹div class="content-item">
‹div style="font-size:0.8em; color:var(--text-dark); margin-bottom:5px;">${formatTime(item.timestamp)}‹/div>
‹div class="content-title">${item.title}‹/div>
‹div>
${item.links.map((l, idx) => {
const isMagnet = l.url.startsWith("magnet:");
const label = (l.label && l.label.trim()) ? l.label.trim() :
Mirror ${idx + 1};
return
‹a class="mirror-link ${isMagnet ? 'mirror-magnet' : ''}" href="${l.url}" target="_blank">${isMagnet ? '🧲' : '▸'} ${label}‹/a>;
}).join('')}
‹/div>
‹/div>
`).join('');
} catch(e) { el.innerHTML =
‹span style="color:var(--red)">Błąd: ${e.message}‹/span>; }
}
// --- PARSOWANIE I RENDEROWANIE OGŁOSZEŃ ---
async function loadAnnouncements() {
const el = document.getElementById("content-anns");
try {
const accounts = await fetchAccounts(CONFIG.ANNS);
let items = [];
for (const acc of accounts) {
const reader = new BufferReader(decodeBase64(acc.account.data[0]));
reader.seek(8);
reader.bytes(32); // pubkey
items.push({ timestamp: reader.i64(), title: reader.str(), body: reader.str() });
}
items.sort((a, b) => b.timestamp - a.timestamp);
if(!items.length) { el.innerHTML = "Brak ogłoszeń"; return; }
el.innerHTML = items.map(item => `
‹div class="ann-item">
‹div class="ann-date">${formatTime(item.timestamp)}‹/div>
‹div class="ann-title">${item.title}‹/div>
‹div class="ann-body">${item.body}‹/div>
‹/div>
`).join('');
} catch(e) { el.innerHTML =
‹span style="color:var(--red)">Błąd: ${e.message}‹/span>; }
}
// --- PARSOWANIE I RENDEROWANIE ANKIET ---
async function loadPolls() {
const el = document.getElementById("content-polls");
try {
const accounts = await fetchAccounts(CONFIG.POLLS);
let items = [];
for (const acc of accounts) {
const reader = new BufferReader(decodeBase64(acc.account.data[0]));
reader.seek(8);
reader.bytes(32); // pubkey
let poll = {
timestamp: reader.i64(),
pollId: reader.bytes(32),
title: reader.str(),
choices: [],
endsAt: 0,
isFinalized: [],
finalBalances: []
};
const choicesLen = reader.u32();
for(let i=0; i‹choicesLen; i++) poll.choices.push(reader.str());
poll.endsAt = reader.i64();
const finLen = reader.u32();
for(let i=0; i‹finLen; i++) poll.isFinalized.push(reader.bool());
if (reader.rem() >= 4) {
try {
const balLen = reader.u32();
for(let i=0; i‹balLen; i++) poll.finalBalances.push(reader.u64());
} catch(e) {}
}
items.push(poll);
}
items.sort((a, b) => b.timestamp - a.timestamp);
if(!items.length) { el.innerHTML = "Brak ankiet"; return; }
const now = Math.floor(Date.now() / 1000);
el.innerHTML = items.map(item => {
const isLive = now < item.endsAt;
const finalized = item.isFinalized.every(x => x);
const hasBalances = finalized && item.finalBalances.length > 0;
let html =
‹div class="poll-item">;
html +=
‹div class="poll-badge ${isLive ? 'live' : 'ended'}">${isLive ? '▸ TRWA' : (finalized ? '▸ ZAKOŃCZONA' : '▸ ZAKOŃCZONA - CZEKA NA PODSUMOWANIE')}‹/div>;
html +=
‹div class="content-title" style="color:var(--text-bright);">${item.title}‹/div>;
html +=
‹div class="ann-date">Koniec: ${formatTime(item.endsAt)}‹/div>;
item.choices.forEach((choice, idx) => {
// Formatowanie balansów tokenów (dzielenie przez 10^9 - ułamek dla Solany)
let balanceFormatted = "N/A";
if (hasBalances) {
const rawBal = item.finalBalances[idx];
balanceFormatted = (Number(rawBal) / 1000000000).toLocaleString('pl-PL') + " LEK";
} else {
balanceFormatted = isLive ? "Głosowanie w toku" : "Oczekiwanie na podliczenie";
}
html += `
‹div class="choice-row">
‹span class="choice-name">${choice}‹/span>
‹span class="choice-stats">${balanceFormatted}‹/span>
‹/div>
`;
});
html +=
‹/div>;
return html;
}).join('');
} catch(e) { el.innerHTML =
‹span style="color:var(--red)">Błąd: ${e.message}‹/span>; }
}
// Uruchom wszystkie skrypty na raz
async function init() {
const status = document.getElementById("status");
try {
await Promise.all([loadLeeks(), loadAnnouncements(), loadPolls()]);
status.style.color = "var(--green)";
status.innerText = "◈ DANE SYNCHRONIZOWANE Z BLOCKCHAINEM SOLANA ◈";
status.style.animation = "none";
} catch(e) {
status.style.color = "var(--red)";
status.innerText = "Nie udało się zsynchronizować niektórych elementów.";
}
}
init();
‹/script>
‹/body>
‹/html>`