Heylogram TV Ekosistemi

Polygon üzerinde 6 token, 17 akıllı kontrat ve bir B2B platformuyla inşa edilen Web3 ekonomisi. Domain NFT'leri kimliği, Garura mevsimsel havuzu ödülü, URA tıklama oyunu kütleyi, partner sistemi de keşfi taşır.

Versiyon: 1.0 · 2026-05Ağ: Polygon MainnetKontrat: 16 .sol · Solidity 0.8.20–0.8.24Stack: Next.js 16 · wagmi v2 · RainbowKit · Firestore
Not (2026-05-16): Görev sistemi, Garura sezonluk ödül havuzu ve Partner / B2B platformu şu an raf'ta. Modüller test ve geliştirme için beklemeye alındı; aşağıdaki bölümlerde tasarım referansları korunuyor ancak ekosistem yayında değil. Aktif kalan kısımlar: Domain NFT, URA tıklama oyunu, DEX / Locker / LuckPool. Olgunlaştıklarında yeniden devreye alınacaklar.

01Vizyon

Heylogram TV iki büyük soruya yanıt arar: "Dijital kimlik nasıl bireyselleşir?" ve "Bir Web3 ekonomisi tek bir token yerine rol bazlı çoklu tokenle nasıl çalışır?"

Birinci soruya cevap .heylogramtv domain NFT — adı cüzdana bağlayan, ENS gibi ama Polygon tabanlı, marketplace'i olan, profil sayfası açılabilen bir kimlik katmanı.

İkinci soruya cevap altı tokenli ekonomi:

  • VOI — görev/ödül tokeni, mintable cap'li
  • HEY — yayın platformu tokeni, mintable cap'li
  • JVOI — utility token, sabit arz, sahipsiz (immutable)
  • HLTV — Heylogram TV streaming tokeni, sabit arz, sahipsiz
  • URA — Garura'nın yaprağı, tıklayarak kazanılır, 98.7Q arz cap
  • GARURA — dünyada 1 adet, son tıklayana gider
Tek Cümle
Heylogram TV, kullanıcının cüzdanıyla bir kimlik (domain), bir aktivite kaynağı (görevler), bir ödül ekosistemi(Garura/URA/Badge) ve bir B2B platformu (partner) sunan Polygon tabanlı Web3 protokolüdür.

1.1 Neden Polygon?

Bir kullanıcı haftada onlarca görev tamamlayabilir, partner tıklayabilir, URA için günde 8640 kez tıklayabilir. Ethereum mainnet bu ölçek için pahalı. Polygon, gas maliyetini günlük mikro-davranışı taşıyabilecek seviyeye indirir; aynı zamanda QuickSwap, Uniswap V3, OpenSea gibi yerleşik altyapıyla tam uyumludur.

1.2 Aşamalı Strateji

Tek seferde 17 kontrat deploy etmek ekosistemi yormaktan başka bir şey yapmaz. Heylogram TV, fonksiyonel bileşenleri bağımsız aileler halinde canlıya almıştır:

  1. Faz 1 (canlı): Domain NFT + Marketplace + VOI/HEY mint + Görevler + Partner
  2. Faz 2 (canlı): JVOI + HLTV fixed-supply tokenler
  3. Faz 3 (canlı): URA tıklama oyunu + GARURA grand prize
  4. Faz 4 (rafa kaldırıldı): Garura Pool V2 — 2026-05-16'da sezon sistemi durduruldu, kontrat hala canlı ama frontend kullanmıyor
  5. Faz 5 (canlı): LuckPool V2 (LP NFT şans havuzu) + kendi yazılmış DEX aggregator (Uniswap V3 + Sushi V3 + QuickSwap V3)
  6. Faz 6 (deploy bekliyor): Liquidity Mining + Badge ERC-1155

02Tasarım İlkeleri

2.1 V1 → V2 Tekrar Yazımı

Heylogram TV mainnet'e deploy edilmiş bir protokol — bu yüzden her hataya yeni bir kontrat sürümüyle yanıt verir. Tablo:

KontratV1 SorunuV2 Çözümü
GaruraPoolPuan/VOI oranı yok, partner istediği zaman çekebilir, sezon kavramı bilmiyorSabit 1 VOI = 1000 puan; %15 platform / %85 havuz otomatik split; partner sadece kullanılmayanı çekebilir
LuckPoolILocker.getLock 6-return olarak yanlış tanımlı → her register revertStruct return ile doğru ABI + LP NFT içerik doğrulama (ekosistem tokeni şartı) + emergencyWithdraw
HeylogramDomainSabit fiyat (her domain 6 POL)Tier fiyatlama: 1 harf $10, 2=$5, 3=$2.5, 4=$1.3, 5+=$0.5
HeylogramMarketplaceTek kontrat desteğiEski + yeni domain kontratı paralel desteği (_nftKontrat auto-detect)

2.2 Çoklu Token Felsefesi

Tek tokenli ekonomilerde rol karışıklığı oluşur: "Bu token ödeme mi, ödül mü, governance mı?" Heylogram TV her rolü ayrı tokene verir:

  • VOI — görev/aktivite ödülü, mevsimsel havuz yakıtı
  • HEY — yayın ekonomisi, NFT hediye ödemesi
  • JVOI — utility (domain alımı, garura'ya katılım)
  • HLTV — Heylogram.tv streaming platformu
  • URA — gamification (her tıklama 1 URA)
  • GARURA — efsanevi (dünyada 1 adet)

2.3 İki Tür Token: Mintable vs Fixed

Heylogram TV iki farklı token mimarisi kullanır:

  • Mintable + Pausable + Ownable — VOI, HEY, URA. Owner mint edebilir, pause edebilir. Esneklik var ama merkezilik var. Çözüm: Owner'ı MintTimelock kontratına devret → 48h queue mecburi.
  • Fixed + Sahipsiz + Immutable — JVOI, HLTV. Deploy anında tüm arz cüzdana basılır, sonra hiçbir admin müdahalesi mümkün değil. CMC'nin "mintable" uyarısı tarihte bu tokenler için anlamsız.
  • Tek Birim — GARURA. Sadece 1 adet, deploy anında vault'a (URA tıklama oyunu kontratı) gönderilir.

2.4 Domain'e Bağlı Partnerlik

Web3'te kimlik problemi: bir cüzdan kim olduğunu nasıl kanıtlar? Heylogram TV cevabı: .heylogramtv domain NFT.

Partner olmak için kullanıcının en az bir .heylogramtv domain NFT'sine sahip olması gerekir. Domain satıldığı anda partner statüsü otomatik iptal — kontratlar her çağrıda ownerOf(tokenId) == partnerkontrolü yapar. Bu, kimlik ve partner havuzunun NFT üzerinden bağlı kalmasını sağlar.

2.5 Off-Chain Hesaplama, On-Chain Para

Kullanıcı puanları, profil verisi, partner görev kayıtları ve blog içeriği Firestore'da yaşar. Kontratlar yalnızca token tutar, swap eder, mint eder. Bu hibrid mimari, gas maliyetini ekonomik tutar; ama veri tutarlılığı Firestore'a düşer (bkz. §18 Audit).

2.6 İki Adımlı Admin Transferi

Modern kontratlar (GaruraPool V2, LiquidityMining, MintTimelock)proposeAdmin + acceptAdmin ikili akışını kullanır. Tek adımlı transfer (eski admin yanlış adres set ederse geri dönüşü yok) önlenmiştir.

03Mimari Bakış

┌─────────────────────────────────────────────────────────────────────┐ │ FRONTEND — web3.jjvoi.com │ │ │ │ Next.js 16 (App Router) + wagmi v2 + RainbowKit v2 │ │ 30+ route (/dapp, /partner, /pazar, /garura, /ura, /admin, …) │ │ 80+ API endpoint │ └────────────────────────────┬────────────────────────────────────────┘ │ ┌────────────────┴────────────────┐ ▼ ▼ ┌─────────────────────┐ ┌─────────────────────────────┐ │ POLYGON MAINNET │ │ FIREBASE FIRESTORE │ │ │ │ │ │ 17 .sol kontrat: │ │ off-chain veri: │ │ • 6 token │ │ • kullanicilar/{wallet} │ │ • 2 NFT (domain) │ │ • seasons/{seasonId} │ │ • marketplace │ │ • garuraRegistrations/ │ │ • garura v1/v2 │ │ • partners/{domain} │ │ • luck v1/v2 │ │ • partnerGorevler/ │ │ • liq.mining │ │ • domainProfiles/{name} │ │ • mint timelock │ │ │ │ • badge (1155) │ │ Server SDK ile admin │ │ • partner pool │ │ (FIREBASE_SERVICE_ACCOUNT)│ └─────────────────────┘ └─────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ DEX / NFT MARKETPLACE (mainnet entegrasyonu) │ │ │ │ QuickSwap V3 (VOI/POL, HEY/POL likidite) │ │ Uniswap V3 NonfungiblePositionManager (LP NFT) │ │ OpenSea (HeylogramDomain + HeylagramGaruraBadge koleksiyonları) │ │ CoinMarketCap DEX listing (VOI) │ └─────────────────────────────────────────────────────────────────────┘

3.1 Kontrat Aileleri (V2 odaklı)

AileKontratlarNe yapar?
TokenVOIToken, HEYToken, JJVOIToken, HLTVToken, URAToken, GaruraToken6 ayrı ERC-20, rol bazlı
KimlikHeylogramDomain (v2), HeylogramMarketplace (v2).heylogramtv domain NFT + alım-satım
Ödül HavuzuGaruraPool v2 rafa, LuckPool v2 canlıLuckPool şans bazlı dağıtım (Garura sezon sistemi 2026-05-16'da durduruldu)
LikiditeLiquidityMining bekliyorUniswap V3 LP kilitleme + JVOI ödülü
YönetimMintTimelock bekliyor48h mint queue (CMC uyarısı için)
B2BHeylagramGaruraBadge bekliyorERC-1155 milestone badge'ler (partner-VOI akışı GaruraPool V2'de)

3.2 Veri Akışı: Bir Kullanıcının Günü

KULLANICI FIREBASE POLYGON ┌──┐ │👤│ domain al └──┘ │ └─→ /dapp/domain ─→ HeylogramDomain.mintPOL() ──────────────→ NFT mint │ ▼ /api/mission/domain-mint ──→ Firestore: +puan │ seasons/{id} │ earnedDuringSeason+= ┌──┐ │👤│ partner site ziyaret └──┘ │ └─→ partner site → /api/partner/track-visit ──→ Firestore: visit kaydı │ │ (Garura V2 kontratta) ▼ gorevTamamlandi(partner, puan) ──→ %15 admin, %85 havuz ┌──┐ │👤│ URA tıkla └──┘ │ └─→ /api/ura/click ─→ rate limit + imza ─→ URAToken.mint(user, 1e18) │ ▼ Firestore: globalClicks++ Kontrol: 8 milyar'a ulaşıldı mı? Evet → GARURA grand prize Sezon sonu: /api/cron/season-distribute ─→ Firestore'dan oranları hesapla ─→ GaruraPoolV2.adminPush(kullanicilar, miktarlar) ─→ Firestore: season.status = 'distributed'

3.3 Para Akışı

┌──────────────┐ Domain alımı ┌──────────────────────┐ │ Kullanıcı │ ─── POL/VOI/HEY ──▶│ HeylogramDomain │ └──────────────┘ │ (kontrat sahibi) │ └──────────┬───────────┘ │ paraCek ▼ Admin cüzdan ┌──────────────┐ Görev tamamlama ┌──────────────────────┐ │ Partner │ ─── VOI yatır ────────────▶ │ GaruraPool V2 │ └──────────────┘ │ │ %15 platform ◀────────┤ admin bakiyesi │ %85 havuz ◀─────────┤ havuz bakiyesi │ └──────────┬───────────┘ │ adminPush ▼ Kullanıcılar ┌──────────────┐ LP NFT kilitle ┌──────────────────────┐ │ Kullanıcı │ ─── POL + JVOI ─────────▶ │ LiquidityMining │ └──────────────┘ + 30 gün │ │ │ Uniswap V3 LP NFT │ │ rewardPool: %1 JVOI │ └──────────┬───────────┘ │ claim (30g) ▼ LP NFT + %1 JVOI ödül ┌──────────────┐ Marketplace satışı ┌──────────────────────┐ │ Satıcı │ ◀── %95 fiyat ────────────│ HeylogramMarketplace │ └──────────────┘ │ │ %5 komisyon ◀─────────┤ │ └──────────────────────┘

3.4 CMC Token Listing Endpoint'leri

CoinMarketCap bir token'ı listelemek için üç zorunlu endpoint ister:total-supply, circulating-supply,max-supply. Her biri sıradan bir sayı döner (JSON değil — düz metin). Heylogram TV bunları VOI ve HEY için ayrı ayrı sağlar:

EndpointTokenYanıt TipiVeri Kaynağı
/api/voi/total-supplyVOIplain text uinton-chain totalSupply()
/api/voi/circulating-supplyVOIplain text uinttotalSupply() − admin cüzdan − burn
/api/voi/max-supplyVOIplain text uintsabit: 100,000,000
/api/hey/total-supplyHEYplain text uinton-chain
/api/hey/circulating-supplyHEYplain text uinton-chain − admin
/api/hey/max-supplyHEYplain text uintsabit: 2,000,000,000

JVOI, HLTV, GARURA, URA için bu endpoint'ler yokçünkü ya CMC'de henüz listeli değiller ya da arz hesabı sabit. Gerektiğinde aynı kalıpla eklenir.

CMC İçin Önemli
Endpoint'in CORS izinleri açık olmalı (CMC sunucusu çağırır). Response yalnız sayıyı döndürmeli — JSON sarmalama, header vs. CMC parse hatası yapar.

3.5 Firestore Veri Modeli

On-chain'de tutmak gas pahalı olan veriler (puanlar, sezonlar, profil, partner kayıtları) Firestore'da yaşar. Server SDK admin yetkisi FIREBASE_SERVICE_ACCOUNT_JSON env değişkeniyle Vercel'e tanımlı.

kullanicilar/{wallet}                  // wallet adres lowercase
  puan: number                         // toplam kazanılan puan
  epochPuan: number                    // sezona henüz commit edilmemiş puan
  tamamlananGorevler: string[]         // tamamlanan görev id'leri
  referans: string?                    // ref veren wallet (opsiyonel)
  nickname: string?                    // URA için takma ad
  createdAt, lastSeen: Timestamp

seasons/{seasonId}
  token: 'VOI' | 'HEY'
  amount: number                        // havuzdaki token miktarı
  startTime, endTime: number            // ms timestamp
  status: 'active' | 'scheduled' | 'ended' | 'distributed'
  totalCommitted: number                // commit edilen puan toplamı
  totalEarned: number                   // sezon süresince kazanılan puan
  participantCount: number

garuraRegistrations/{docId}
  wallet: string
  seasonId: string
  committedPoints: number
  earnedDuringSeason: number
  claimed: boolean
  claimedAmount: number

domainProfiles/{name}                  // .heylogramtv adı (uzantısız)
  displayName, bio, avatarUrl, coverColor: string
  links: { twitter, github, telegram, discord, website }
  customText: string

partners/{domainName}                  // doc ID = domain adı (wallet DEĞİL)
  wallet: string
  tokenId: number
  activated: boolean                   // domain hala sahibinde mi?
  logoUrl: string
  website: string
  webhookSecret: string                // HMAC için (W12: plaintext)
  activatedAt: Timestamp

partnerGorevler/{taskId}
  partnerDomain: string
  name, description, url: string
  rewardPoints: number                 // max 500
  totalBudget: number
  spent: number
  status: 'pending' | 'active' | 'ended'
  createdAt: Timestamp

missions/{missionId}                   // platform görevleri (admin yönetir)
  title, description: string
  type: 'on-chain' | 'profile' | 'social' | 'partner'
  points: number
  repeat: 'once' | 'daily' | 'weekly'
  active: boolean

uraClicks/global                       // tek doküman, global sayaç
  total: number                        // toplam tıklama
  lastTick: Timestamp
  milestone8B: { wallet, txHash, timestamp } | null

uraNicknames/{wallet}
  nickname: string
  setAt: Timestamp

uraLeaderboard/{wallet}                // önbellek, periyodik yenilenir
  wallet, nickname, totalUra, rank, lastUpdate

votes/{threadId_walletAddr}            // forum/oylama spam koruması
  threadId, voter, createdAt

blogPosts/{slug}                       // doc ID = URL slug
  title_tr, title_en: string
  slogan_tr, slogan_en: string         // alt başlık (opsiyonel)
  excerpt_tr, excerpt_en: string       // özet kart için
  body_tr, body_en: string             // markdown
  tag: string                          // 'duyuru' | 'gelistirme' | 'partner' | ...
  coverImage: string                   // opsiyonel
  status: 'draft' | 'published'
  publishedAt: number                  // ms timestamp (0 = draft)
  createdAt, updatedAt: number

3.6 Frontend Route Haritası

app/ klasöründeki kullanıcıya açık route'lar (gizli yönetim sayfaları hariç):

RouteNe yapar?Cüzdan?
/Landing — token grid, son satışlar, CTAHayır
/aboutProje hakkında, ekip, lisansHayır
/advertiseRafa kaldırıldı (2026-05-16) — eski partner B2B tanıtım sayfası
/blogEkosistem duyuru listesi (server-rendered, 30s cache)Hayır
/blog/[slug]Tek duyuru sayfası, TR/EN içerik, paylaşım butonları, dinamik OGHayır
/dapp/dexKendi yazılmış DEX aggregator — 3 venue (Uniswap V3 + Sushi V3 + QuickSwap V3), swap + pool + locker + luck tab'larıEvet
/dapp/domainDomain mint UI — isim ara, tier fiyat, POL/VOI/HEY ödeEvet
/dapp/uraURA tıklama oyunu — başlatma + cüzdan bağlamaEvet
/garuraRafa kaldırıldı (2026-05-16) — eski Garura sezon kayıt + claim
/gorevlerRafa kaldırıldı (2026-05-16) — eski görevler listesi
/hesapKullanıcı hesap sayfası — domain listesi, listele/iptal, bakiyeEvet
/kesfetDiscovery — yeni alınan domain'ler, popüler profillerHayır
/lockerLP NFT kilitleme arayüzü (Locker V1)Evet
/luckLuckPool kayıt + claim arayüzüEvet
/partnerRafa kaldırıldı (2026-05-16) — eski partner paneli
/pazarMarketplace — listeleme, filtre, satın alma (POL/VOI/HEY)Evet (almak için)
/resolve/[name]Domain profil sayfası (Linktree benzeri)Hayır (sahip ise düzenleme için)
/s/[slug]Promo kısa link — paylaşım sayfalarıHayır
/tip/[name]Yayıncıya bahşiş gönderme sayfasıEvet (göndermek için)
/tokenVOI/HEY/JVOI/HLTV/URA bilgi sayfası (arz, fiyat, links)Hayır
/trTürkçe ana iniş sayfası (i18n)Hayır
/uraURA PWA — ağaç animasyonu + tıklama + sayaç (mobile-first)Evet
/ura/leaderboardURA tıklama sıralamasıHayır
/whitepaperŞiirsel ana whitepaper (Gaia ağacı, TR/EN)Hayır
/whitepaper/technicalEski teknik whitepaper (koyu tema)Hayır
/whitepaper/uraURA detaylı kullanım kılavuzuHayır
/whitepaper/docsBu sayfa — teknik dokümantasyonHayır

3.7 Frontend Davranış Kuralları

Cüzdan etkileşimleri için protokol genelinde uygulanan kurallar:

forcePolygon() Paterni

Her writeContract çağrısından önce kullanıcının Polygon ağında olduğu garantilenmelidir. wagmi'nin switchChain'i bazı cüzdanlarda Ethereum'a kayabilir; bunun yerine raw provider çağrısı kullanılır:

const forcePolygon = async () => {
  await window.ethereum.request({
    method: 'wallet_switchEthereumChain',
    params: [{ chainId: '0x89' }],   // 137 = Polygon
  });
};

// Her writeContract'tan önce:
await forcePolygon();
await writeContract({ ... });

İmza + Timestamp Standardı

Tüm sunucu-tarafı yazma işlemlerinde EIP-191 imza + 5 dakika TTL timestamp zorunlu. Replay attack'ı önler (K06 audit).

Frontend:
  const ts = Math.floor(Date.now() / 1000);
  const msg = "action:<param>:<ts>";
  const sig = await viem.signMessage({ account, message: msg });
  fetch('/api/...', { body: { ...params, timestamp: ts, signature: sig } });

Server:
  if (now - ts > 5*60) return 401;             // 5dk TTL
  const recovered = ecrecover(msg, sig);
  if (recovered !== wallet) return 401;

Wallet Adres Normalizasyonu

Firestore'da tüm wallet'lar lowercase saklanır. API'lerwallet.toLowerCase() uygular. FrontenduseAccount'tan gelen adres checksum'lu olabilir — karşılaştırmadan önce normalize edilir.

RPC Seçimi

  • https://polygon.drpc.org
  • https://1rpc.io/matic
  • polygon-rpc.com — bozuk, kullanma
  • rpc.ankr.com/polygon — bozuk, kullanma

RainbowKit Wallet Sırası

injectedWallet birinci sıraya alınmalı — MetaMask'ın doğrudan açılması için. Yoksa RainbowKit ekran açıp seçim bekler, UX kötüleşir.

3.8 DEX Aggregator (/dapp/dex)

Heylogram TV kendi yazılmış multi-venue DEX aggregator'ına sahip (lib/dexTokens.ts + lib/dexAdapters.ts). Tek bir frontend, üç farklı Polygon DEX'inden paralel olarak quote alır, en iyi fiyatı bulur, ona göre swap yapar veya LP pozisyonu oluşturur. Mevcut /dapp/dex sayfasında dört tab var: Swap, Pool,Locker, Luck.

Desteklenen Venue'lar

VenueProtokolQuoterRouterPosition Manager
Uniswap V3univ3 (4 fee tier)0x61fF…B21e0x68b3…Fc450xC364…FE88
Sushi V3univ3 (fork, aynı ABI)0x64e8…08A70x0aF8…44c30xB740…a40
QuickSwap V3algebra (dinamik fee)0xa15F…FC890xf5b5…8E120x8eF8…1de6

Uniswap V3 ve Sushi V3 aynı ABI'yi paylaşır (4 sabit fee tier:100 / 500 / 3000 / 10000). QuickSwap V3 Algebra Integral kullanır — fee parametresi yoktur, pool'un kendisi dinamik fee hesaplar.

Token Kataloğu

  • Stable + Native: POL (native MATIC, wrap: WMATIC), USDC (6 dec), USDT (6 dec)
  • Ekosistem: URA, HEY, VOI, JVOI, HLTV, GARURA (hepsi 18 dec)
  • Toplam 9 token; POLYGON_TOKENS sabit objesi

URA / Stable Likidite Haritası

URA/USDC   → Sushi V3 %0.3   (ana havuz)
URA/POL    → Uniswap V3 %1
HEY/POL    → Uniswap V3 %0.3
VOI/POL    → Uniswap V3 %0.3
JVOI/POL   → Uniswap V3 %0.3
HLTV/POL   → Uniswap V3 %0.3
USDC/USDT  → Stable %0.01

Aggregator Akışı

Kullanıcı: 1 URA → ? USDC
   │
   ▼
quoteBestVenue(tokenIn=URA, tokenOut=USDC, amountIn=1e18)
   │
   ├─→ quoteFromVenue(uniswap)   → tüm fee tier'ları dene + pool-based fallback
   ├─→ quoteFromVenue(sushi)     → pool-based (Sushi'nin Quoter'ı bozuk)
   └─→ quoteFromVenue(quickswap) → Algebra quoter (dinamik fee)
   │
   ▼  Promise.all paralel
   │
   ▼
Sonuçları karşılaştır → amountOut max olan venue.kazanır
   │
   ▼
buildSwapTx(venue, ...) → router-spesifik tx (univ3 vs algebra ABI)
   │
   ▼
walletClient.writeContract(...)

Pool-Based Fallback Quote

Quoter kontratı çalışmadığı (Sushi V3 gibi) veya sertifikalı olmadığı zaman quoteFromPoolBased devreye girer: factory'den pool adresini al, slot0.sqrtPriceX96'yı oku, basit price formülü ile hesapla:

price (token1/token0) = (sqrtPriceX96)² / 2²⁰⁰

amountOut (token0 → token1) = amountIn × price
amountOut (token1 → token0) = amountIn / price
amountOut -= amountOut × fee / 1_000_000   // %0.3 = 3000

Bu fallback küçük swap'larda doğru, büyük swap'larda slippage hesaplamaz — yalnız tahmin. Gerçek swap için router yine deamountOutMinimum ile çağrılır (kullanıcı slippage tolerance belirler).

LP Mint (Pool Tab)

buildMintTx ile yeni LP pozisyonu oluşturulur. Uniswap V3 / Sushi V3 için fee parametresi gerekir, Algebra'da yoktur. Full-range pozisyonlar için tick'lerfullRangeTicks(spacing) ile hesaplanır:

spacing  fee
  1       100      (stable)
  10      500
  60      3000     (yaygın)
  200     10000    (volatile)
  60      algebra  (Quickswap, varsayılan)

tickLower = ceil(-887272 / spacing) × spacing
tickUpper = floor(887272 / spacing) × spacing

Cross-DEX Referans Fiyat

Yeni bir havuz açarken (token bir DEX'te listeli ama diğerinde değil), findReferencePrice tüm venue'lardan paralel arama yapar; ilk bulduğu pool'un sqrtPriceX96'sını ve gerçek display fiyatını (token0 decimals + token1 decimals farkı hesaplanmış) döner. Bu, yeni pool oluştururken doğru başlangıç fiyatını set etmek için kullanılır.

Locker + Luck Tab'ları

  • Locker: LockerPanel komponenti (29KB) — kullanıcı LP NFT'sini Locker V1 kontratına (0x3df6…CA98) kilitler. Süre seçimi, lock onayı, mevcut lock'lar listesi.
  • Luck: LuckPanel komponenti (11.5KB) — kullanıcının Locker'daki LP NFT'sini LuckPool V2'ye kaydeder (register(lockId)), süresi dolunca ödülü claim eder.

Bu iki tab, DEX → LP → Lock → Luck akışını tek ekranda birleştiriyor. Kullanıcı swap yaptıktan sonra aynı sayfadan LP oluşturup, sonra Locker'a kilitleyip, Luck'a kaydedebilir.

POL Native Swap

Native POL ile swap için WMATIC wrap'lanır (POL address = 0x0 olduğu için adapterwrapped alanını kullanır). Native değernativeValue parametresiyle router'a iletilir.

04Token Ailesi

TokenTipMax ArzMintPauseSahip
VOIMint tamamlandı100,000,000Cap dolduEvet (kullanılmıyor)Owner
HEYMint tamamlandı2,000,000,000Cap dolduEvet (kullanılmıyor)Owner
JVOIFixed777,777,777YokYokSahipsiz
HLTVFixed629,629,629YokYokSahipsiz
URAMintable (lockable)98,774,312,000,000,000Minter (kilitlenebilir)YokOwner (renounce edilebilir)
GARURATek birim1YokYokSahipsiz

4.1 VOI — Görev/Aktivite Tokeni

ERC20 + ERC20Permit + ERC20Burnable + Pausable + Ownable. 100M cap. Kontrat seviyesinde mintable kalsa da100M cap'in tamamı dolduruldu — operasyonel olarak mint yapılmıyor, admin panelinden mint UI'ı kaldırıldı. EIP-2612 permit imzayla approve verilmesini sağlar; transfer vergisi yok.

Kullanım: DEX likidite havuzlarında (Uniswap V3 / Sushi V3 / QuickSwap V3), marketplace'te domain alımı için ödeme.

4.2 HEY — Yayın Tokeni

VOI ile aynı yapı, farklı supply (2B). 2B cap'in tamamıdolduruldu — operasyonel mint kapandı, admin UI kaldırıldı. Heylogram TV streaming platformunun ana ödül tokeni — şu an domain ödemesi ve marketplace ödemesi için kullanılıyor, gelecekteki canlı yayın platformuna hazır.

Mint Operasyonu Tamamlandı
Hem VOI hem HEY cap'leri (100M + 2B) tamamen dolduruldu. Kontratlardaki mint fonksiyonu OZ Ownable miras aldığı için teknik olarak çağrılabilir ama hiçbir adres yeni mint istemiyor; admin paneli üzerinden mint butonu kaldırıldı (2026-05-16). CMC "Mintable" uyarısı için kalıcı çözüm:renounceOwnership() çağrılması — şu an karar aşamasında (sahipsiz vs gelecek esneklik).

4.3 JVOI — Sahipsiz Utility Token

Tamamen farklı mimari. OpenZeppelin kullanmıyor, ham ERC-20 yazımı. Ownable yok. mint yok.Pausable yok. Constructor'da tüm arz (777,777,777 JVOI) deployer'a mint edilir; sonra kontrat sonsuza kadar değişmez.

On-chain metadata: Kontrata website,whitepaper, platform, descriptiongibi sabit string'ler yazılı — explorer'da görünür.

Neden 777,777,777?
Kullanıcının seçtiği sembolik sayı. Şans + zenginlik metaforu.

4.4 HLTV — Streaming Platformu Tokeni

JVOI ile aynı mimari (ham ERC-20, sahipsiz, immutable). Supply629,629,629 — kullanıcının iki "vanity" deployer adresinin hex digit toplamına denk gelen sembolik miktar.

Hedef kullanım: Heylogram.tv (gelecek canlı yayın platformu) streamer tip + NFT hediye ekonomisi.

4.5 URA — Garura'nın Yaprağı

Tıklama oyunu tokeni. Tasarım kararı: DEX güvenliğitüm "şüpheli" özellikleri kaldırarak elde edilmiş:

  • Pause yok
  • Blacklist yok
  • Transfer vergisi yok
  • Upgrade yok
  • Mint tek bir adrestan (tıklama oyunu kontratı)
  • Minter lockMinter() ile sonsuza kilitlenir
  • Kilit sonrası renounceOwner() → tam sahipsiz

Toplam arz: 98,774,312,000,000,000 URA. Dünya nüfusu başına ~12,350 tıklama kadar sürer.

4.6 GARURA — Dünyada 1 Adet

Toplam arz 1 (= 1 × 10¹⁸ wei). Mint fonksiyonu yok. Pause yok. Owner yok. Deploy anında URA tıklama oyunu kontratına (vault) gönderilir.

Kazanım: 8,000,000,000. tıklamayı yapan cüzdan vault'tan GARURA'yı alır. _update override eder ve her el değişimini GaruraElDegistirdi event'iyle blockchain'e yazar — tarihi kayıt.

05Domain Sistemi

HeylogramDomain bir ERC-721 — .heylogramtvuzantılı isimleri NFT olarak temsil eder. Eski + yeni iki kontrat paralel çalışır; yeni kontrat tier fiyatlama kullanır.

5.1 Tier Fiyatlama

UzunlukPOLVOIUSD (~POL ~$0.084)
1 harf1201,500~$10
2 harf60750~$5
3 harf30400~$2.5
4 harf15200~$1.3
5+ harf680~$0.5

5.2 İsim Kuralları

  • 1–63 karakter
  • Yalnız küçük harf (a–z), rakam (0–9), tire (-)
  • Otomatik .heylogramtv uzantısı temizlenir

5.3 Üç Para Birimi

  • mintPOL(isim, ipfsLink) — native POL ile
  • mintVOI(isim, ipfsLink) — VOI ile (transferFrom)
  • mintHEY(isim, ipfsLink) — HEY ile (sabit fiyat)
  • mintUcretsiz(alici, isim, ipfsLink) — sadece owner; airdrop / ekip için

5.4 Profil Sayfası

Her domain bir Linktree benzeri profile sahip: /resolve/[name]. Profil verisi Firestore'da (domainProfiles/{name}):

displayName, bio, avatarUrl, coverColor
links: { twitter, github, telegram, discord, website }
customText

Sahibi cüzdanını bağlayıp profilini düzenleyebilir. Sahibi değişirse profil otomatik olarak yeni sahibe geçer (Firestore wallet alanıownerOf(tokenId) ile sync).

5.5 Eski + Yeni Paralel

Eski kontrat (0xc654…0816) ilk versiyon, sabit fiyatlı. Yeni kontrat (0xc993…A826) tier fiyatlı v2. Her ikisi de aktif; marketplace ve partner kontratları _nftKontrat()ile hangi kontratta olduğunu otomatik tespit eder.

Token ID Çakışması
Her iki kontratta #1, #2 vb. tokenlar var — aynı ID iki farklı domain'e atanabilir. UI bunu ?old=1query parametresi ile ayırır. Kabul edilmiş bilinen davranış.

06Marketplace

HeylogramMarketplace v2 domain NFT alım-satım katmanı. Eski + yeni domain kontratını otomatik destekler.

6.1 Üç Para Birimi

Satıcı listelerken ParaBirimi enum'undan birini seçer:POL, VOI, HEY. Alıcı aynı para birimiyle polIleSatinAl, voiIleSatinAlveya heyIleSatinAl çağırır.

6.2 Komisyon

  • komisyonBaz = 500 (= %5)
  • Maksimum komisyonGuncelle ile owner %10'a kadar değiştirebilir
  • Komisyon komisyonAlici adresine; geri kalan satıcıya

6.3 Akış

1. Satıcı domain NFT'sini approve eder
2. listele(tokenId, fiyat, paraBirimi)
3. aktifListeIds[] içine eklenir
4. Alıcı satın alma fonksiyonunu çağırır
5. Komisyon → komisyonAlici
6. Net fiyat → satıcı
7. NFT → alıcı
8. listeyiIptalEt veya otomatik (sat sonrası)

6.4 Eski Kontrat Tespiti

function _nftKontrat(tokenId) returns (IERC721, bool legacy) {
    try domainNFT.ownerOf(tokenId) returns (address o) {
        if (o != 0) return (domainNFT, false);
    } catch {}
    return (domainNFTLegacy, true);
}

Yeni kontratta token yoksa eski kontrata düşer. Bu, listeyi hangi NFT kontratının tutması gerektiğini belirler.

07Garura Sistemi RAFA KALDIRILDI · 2026-05-16

Bu Sistem Artık Kullanılmıyor
Garura sezon mekanizması 16.05.2026'da rafa kaldırıldı./garura, /gorevler ve /advertisesayfaları ShelvedNotice ile devre dışı bırakıldı (orijinal kod archived-page.txt'lerde saklı). GaruraPool V2 kontratı hala mainnet'te canlı (0x8755…DFBb0) ama frontend üzerinden çağrılmıyor; havuzdaki bakiyeler partner'a görepartnerCek() ile çekilebilir. Sezon sistemi ekonomik karmaşıklık nedeniyle durduruldu — basit bir VOI/HEY likidite + URA tıklama oyunu modeline geri dönüldü.

Bu bölüm tarihçe + sistem davranışı için belge olarak korunuyor. Yeniden açılırsa V3 kontrat ile + Chainlink VRF entegrasyonuyla planlanır.

Aşağıdakiler eski sistemi (canlı dönemini) açıklar:

Garura mevsimsel ödül havuzu. Partner VOI yatırır, kullanıcılar görev yapar, sezon sonu havuz orantılı dağıtılır. İki versiyon var; V2 aktif kullanılırdı.

7.1 V2 — 1 VOI = 1000 Puan (sabit oran)

V1'in en büyük sorunu: partner istediği zaman tüm parayı çekebiliyordu, puan/VOI oranı yoktu. V2 bunu sabit bir ekonomik modelle çözer:

PUAN_VOI_ORANI = 1000     // 1 VOI = 1000 puan (asla değişmez)
PLATFORM_PAYI  = 15       // %15 admin, %85 havuz

partnerYatir(voiMiktari, tokenId, isOld):
   - Domain sahipliği kontrol
   - VOI çekilir, partner kredisi = voiMiktari × 1000 / 1e18 puan

gorevTamamlandi(partnerWallet, puanMiktari):  // backend çağırır
   - Yeterli puan kredisi var mı?
   - VOI karşılığı = puanMiktari × 1e18 / 1000
   - %15 → adminBakiyesi
   - %85 → havuzBakiyesi
   - partner.kullanilanPuan += puanMiktari
   - partner.kilitliVOI    += havuzaGiden
   - partner.platformVOI   += admineGiden

partnerCek(voiMiktari):
   - Sadece "serbest bakiye" = toplamYatirilan - kilitliVOI - platformVOI
   - Yani kilitlenen kısım çekilemez

adminPush(kullanicilar[], miktarlar[]):    // sezon sonu
   - Sadece havuzBakiyesi'nden harcanır
   - Max 500 kullanıcı/tx

7.2 Operatör Sistemi

gorevTamamlandi()'yi backend server çağırır. Admin tek başına yetkili olmasın diye operators mapping'i var — admin yeni operatör (örn. ikinci server) ekleyebilir, ama operatörler para çekemez.

7.3 Sezon Hesabı (off-chain)

Kontrat sezon kavramı bilmez. Firestore tarafında:

seasons/{seasonId} {
  token:           'VOI' | 'HEY',
  amount:          number,        // havuzdaki token
  startTime, endTime,
  status:          'active' | 'scheduled' | 'ended',
  totalCommitted:  number,        // commit edilen puan toplamı
  totalEarned:     number,
  participantCount: number
}

garuraRegistrations/{docId} {
  wallet,
  seasonId,
  committedPoints,
  earnedDuringSeason,       // sezon boyunca kazanılan ek puan
  claimed: boolean
}

Sezon sonunda /api/cron/season-distribute Firestore'dan oranları hesaplar, adminPush() ile kontrata yazar.

7.4 Pay Hesabı

kullanıcı_payı = (committedPoints + earnedDuringSeason)
                / toplam_havuz_puanı × sezon_miktarı

Platform havuzdan %10 keser (app/api/garura/claim/route.ts'te hesaplanır), kalan kullanıcıya gider. Bu, V2'de zaten kontrat seviyesinde %15 alındığı için çift kesim riskiolabilir (bkz. §18).

7.5 Acil / Yönetim

  • setPaused(true) — geçici durdurma
  • deprecate() — kalıcı kapatma (göç için)
  • emergencyWithdraw(to, miktar) — sadece paused/deprecated durumda
  • proposeAdmin / acceptAdmin — 2 adımlı admin transferi

08Görev Sistemi RAFA · 2026-05-16

UI Kapatıldı, API'ler Hala Duruyor
/gorevler sayfası 2026-05-16'daShelvedNotice ile devre dışı bırakıldı. Sistemin temel bağı Garura sezonuydu — Garura rafa kalkınca görev tamamlamanın ekonomik anlamı kayboldu./api/mission/* endpoint'leri silinmedi (bazıları URA milestone ve domain mint puanı için hala kullanılabilir), ama uçtan-uca akış (görev → puan → sezon → ödül) artık kapalı.

Aşağıdaki anlatım eski sistemi belge olarak korur.

Heylogram TV'de görev tamamlamak puan kazandırırdı. Puanlar Firestore'da tutulur, sezon sonunda Garura havuzundan VOI/HEY'e çevrilirdi.

8.1 Görev Tipleri

TipDoğrulamaDurum
On-chain (domain al, listele, sat)Event log + tx hash verifycanlı
Profil doldurFirestore profil alanıcanlı
Site ziyareti (partner)Script + wallet paramcanlı
X (Twitter) paylaşımManuel onay / honor systemgeçici
Referans?ref=WALLET cookie + txplanlanan

8.2 İmzalı Tamamlama Akışı

1. Kullanıcı görevi yapar (örn. partner sitesini ziyaret)
2. Frontend: viem ile bir mesaj imzalar
   message = "mission:<taskId>:<timestamp>"
3. POST /api/mission/complete { wallet, taskId, signature, timestamp }
4. Server:
   - Timestamp 5dk içinde mi?
   - Wallet regex doğru mu?
   - Signature ECDSA recover ile doğru mu?
   - Bu görev daha önce tamamlanmış mı?
5. Firestore: kullanicilar/<wallet> -> puan += task.points
   aktif sezona kayıtlıysa earnedDuringSeason += task.points

8.3 Tracker Script

Partner kendi sitesine <script src="https://web3.jjvoi.com/api/track/script/<siteKey>?hw=<wallet>"></script> ekler. Script ziyareti /api/track/visit'e bildirir, kullanıcının cüzdanı varsa Firestore puanı artar.

Bot koruması: aynı IP+cüzdan 24 saatte bir kez sayılır. Rate limit halen geliştirilmekte (bkz. §18 W04).

09Partner / B2B RAFA · 2026-05-16

Frontend Rafa, Kontrat/API Duruyor
/partner sayfası 2026-05-16'daShelvedNotice ile kapatıldı. Partner sistemi Garura havuzuna bağlıydı — Garura rafa kalkınca partner'ın VOI yatırdığı ekonomik döngü çöktü. /api/partner/*endpoint'leri ve GaruraPool V2 kontratı hala mainnet'te ama yeni partner aktivasyonu alınmıyor.

Aşağıdaki anlatım eski tasarımı belge olarak korur.İleride farklı bir B2B modeliyle (örn. DEX likidite havuzlarına doğrudan yatırım + Badge mint) yeniden açılabilir.

Heylogram TV'nin en farklı yönüydü: kendi görevlerini oluşturan partner sitesi. Site sahibi gelir, görev tanımlar, kullanıcılarımızı kendi sitesine yönlendirir, ödül havuzuna VOI yatırırdı.

9.1 Partner Olma Koşulları

  • En az 1 .heylogramtv domain NFT'sine sahip olmak
  • /resolve/[name] profil sayfasından "Partner Ol" butonu
  • Domain satılırsa partner statüsü otomatik iptal (lazy deactivation)

9.2 Aktivasyon Akışı

POST /api/partner/activate
{ wallet, domainName, timestamp, signature }

Server:
  1. Timestamp 5dk içinde mi?
  2. Signature ECDSA ile doğrula
  3. domainName için ownerOf(tokenId) === wallet (on-chain)
  4. Firestore: partners/{domain} = { wallet, tokenId, activated: true, ... }

9.3 Görev Oluşturma

  • Partner panelinde "Görev Oluştur" butonu
  • Site adı, URL, ödül miktarı (puan), koşullar
  • GaruraPool V2'ye VOI yatırır (puan kredisi alır)
  • Özel JS veya Kotlin entegrasyon kodu indirir

9.4 Domain Satılırsa Ne Olur?

  1. UI: /api/partner GET her istekte ownerOf(tokenId) canlı kontrol eder; eski sahip ise activated: false
  2. Kontrat: GaruraPool V2 partnerCek() ile sadece kullanılmayan VOI iade edilir; havuza giden kısım kalır
  3. Firestore: partners/{domain}.activated alanı false set edilir, partner paneli açılmaz

9.5 Webhook Sistemi

Partner sitesinden ziyaret bildirimi yapılırken HMAC imza kullanılır:

POST /api/partner/webhook
{ taskId, userWallet, timestamp, signature }

verifyHmac(webhookSecret, taskId, userWallet, timestamp, signature)

webhookSecret Firestore'da; audit'te W12olarak işaretlendi — production'da Security Rules ile sadece admin okumalı (bkz. §18).

10HeylagramGaruraBadge (ERC-1155)

Partner milestone NFT sistemi. Tek bir ERC-1155 kontratı, partnerler kendi seviye koleksiyonlarını açar. OpenSea'de tek koleksiyon olarak görünür: Heylagram-Garura.

10.1 İki Katmanlı Yapı

  • Partner Collection — partner cüzdan başına 1 koleksiyon. Adı, logosu, açıklaması partner tarafından belirlenir.
  • Level — her koleksiyon istediği kadar seviyeye sahip olabilir. Her seviye için rastgele bir tokenId üretilir.

10.2 Random TokenId Üretimi

Domain NFT'sinin sıralı 1, 2, 3 sorunu yok. Her level için:

tokenId = keccak256(
    "heylagram-garura-badge",
    partnerId,
    levelIndex,
    block.timestamp,
    block.prevrandao,
    msg.sender,
    partnerCount
)

Çakışma durumunda tokenIdExists[candidate] kontrolü yapılır, çakışırsa keccak256(candidate, block.timestamp)ile yeniden hesaplanır. Pratikte hiçbir zaman çakışmaz.

10.3 Ücretler

İşlemUSDTUSDCVOIHEY
Koleksiyon oluşturma10101,00010,000
Seviye ekleme222002,000
Mint komisyonu%5 (max %20, admin günceller)

10.4 Mint Yolları

  • adminMint(partnerId, levelIndex, user) — backend milestone'a ulaşınca çağırır
  • adminMintBatch — sezon sonu toplu mint (max 200 kullanıcı)
  • userMint(partnerId, levelIndex) — kullanıcı kendi ücretini öderse

10.5 contractURI ve OpenSea

contractURI() pure returns inline JSON:
  name: "Heylagram-Garura"
  description: "Heylogram TV partner badge koleksiyonu..."
  external_link: "https://web3.jjvoi.com"

Her tokenId'nin metadata URI'si partner tarafından belirlenir (IPFS / HTTPS — PNG, GIF, animasyonlu SVG, WebP).

11URA & GARURA

Tıklama oyunu mekanizması: cüzdan bağla, tıkla, 1 URA kazan. Toplam arz 98.7 katrilyon — pratikte tükenmesi uzun. Tükenirken 8 milyar tıklama eşiğine ulaşan cüzdan GARURA'yı kazanır.

11.1 Akış

POST /api/ura/click
{ wallet, timestamp, signature }

Server:
  1. Wallet regex kontrol
  2. Rate limit: 10 saniyede 1 tıklama
  3. Signature ECDSA verify
  4. URAToken.mint(wallet, 1e18)
  5. Firestore globalClicks++
  6. Milestone kontrol:
     if (globalClicks === 8_000_000_000):
       grandPrize: URA milestone tx hash, tarih, cüzdan kaydedilir
       (GARURA transferi vault → wallet, hatta otomatik)

11.2 Sızıntı Korumaları

  • Token kontratında pause yok → DEX'ler dondurmaz
  • Token kontratında blacklist yok → herhangi adres iptal edilemez
  • Transfer vergisi yok → DEX'ler tam uyumlu
  • Minter tek sefer ayarlanır, sonra lockMinter() ile kilitlenir
  • renounceOwner() ile kontrat tam sahipsiz

11.3 PWA Frontend

/ura sayfası mobile-first, ana ekrana eklenebilir. Ağaç animasyonu + tıklama + global sayaç. QR ile gizli erişim (web'de doğrudan link verilmez).

11.4 GARURA Tarihsel Kayıt

Her el değişimi blockchain'e GaruraElDegistirdi(from, to, timestamp, blockNumber) event'i olarak yazılır — sonsuza kadar tarihte kalır.

11.5 Nickname & Leaderboard

Cüzdan adresi yerine takma ad gösterimi için Firestore tabanlı nickname sistemi:

  • POST /api/ura/nickname — imzalı, 3-20 karakter, benzersiz
  • GET /api/ura/leaderboard?limit=100 — periyodik snapshot, on-chain bakiyeye göre sıralı
  • Leaderboard önbelleği uraLeaderboard/ koleksiyonunda; cron her 15dk'da bir yenilenir
  • Üst 100 her zaman önbellekte; daha aşağısı sorgu üstüne hesaplanır

11.6 Referans Sistemi

URA tıklayan yeni kullanıcılar referans linkiyle gelirse hem davet eden hem davet edilen ek URA kazanır:

Link: https://web3.jjvoi.com/ura?ref=<wallet>

İlk tıklama akışı:
  /api/ura/click { wallet, ref?, timestamp, signature }
  → /api/ura/referral { wallet, referrer }
    → Firestore: kullanicilar/{wallet}.referans = referrer (tek sefer)
    → Bonus URA: davet edene +10, davet edilene +5
    → Cooldown: aynı referrer 24 saatte max 20 davet sayar (bot koruması)

11.7 In-App Wallet & Session

URA oyunu mobil PWA olarak çalışırken bazı kullanıcıların metamask'ı olmayabilir. Bu yüzden in-app wallet opsiyonu:

  • Cüzdansız kullanıcı için anonim session key (browser localStorage)
  • POST /api/ura/session — imzalı, oturum başlatır
  • Kullanıcı puanları/URA Firestore'da biriker; istenince gerçek cüzdana bağlayıp on-chain mint edilebilir
  • /api/ura/batch-mint — birikmiş puanı tek tx'te kontrata mint eder (gas tasarrufu)
UX Karar
Cüzdansız kullanıcı oyuna anında başlar, hesabı sonra bağlar. Web3 onboarding sürtünmesi minimum.

11.8 Detaylı Kullanım Kılavuzu

URA oyununun kullanıcı tarafı için ayrı bir uzun rehber var:/whitepaper/ura. Bu sayfa adım adım tıklama, PWA yükleme, leaderboard'a girme, milestone yarışı, grand prize kuralları gibi son-kullanıcı içerikleri içerir.

12Liquidity Mining

LiquidityMining.sol — kullanıcı POL + JVOI yatırır, Uniswap V3 LP NFT oluşturulur, 30 gün kilitlenir, süre dolunca LP NFT + %1 JVOI ödülü.

12.1 İki Pozisyon Tipi

TipKilit SüresiMin YatırımJVOI Ödül
STANDARD30 gün0 POL%1
ANGEL (yatırımcı)180 gün100 POL%5

12.2 Akış

  1. deposit(jvoiAmount) payable — kullanıcı POL + JVOI yollar
  2. Kontrat lockedUserJvoi sayacını günceller
  3. Backend 48 saat içinde Uniswap V3 LP oluşturur
  4. Backend lockPosition(positionId, nftTokenId) çağırır
  5. Süre dolunca kullanıcı claim(positionId) ile LP NFT + JVOI ödülünü alır

12.3 Refund Mekanizması

Backend 48 saat içinde NFT bağlamazsa kullanıcırefundPosition(positionId) ile POL + JVOI'sını geri alır.REFUND_TIMEOUT = 48 hours sabiti.

12.4 emergencyWithdrawToken Sertleştirmesi

function emergencyWithdrawToken(token, amount):
    if (token == JVOI):
        protected = rewardPool + lockedUserJvoi
        require(balance >= protected)
        withdrawable = balance - protected
        require(amount <= withdrawable)
    transfer(admin, amount)

Admin yalnızca kullanıcı parası ve ödül havuzunun dışındakiJVOI'yi çekebilir. Yanlışlıkla gönderilen başka ERC-20'leri tamamen çekebilir.

13LuckPool V2

Mevcut Locker kontratına (0x3df6…CA98) kilitlenmiş LP NFT'lere yönelik şans havuzu. Lock kaydedilir, süre dolunca random bir ekosistem tokeni kazanır.

13.1 V1 → V2 Bug Düzeltmesi

V1 Bug
ILocker.getLock 6 ayrı return parametre olarak tanımlanmıştı. Gerçekte kontrat bir Lock struct döner. ABI uyumsuzluğu nedeniyle her register çağrısı revert ediyordu. V1 fiilen çalışmaz.
V2 Fix
struct Lock tanımı ve ILocker.getLock(...) returns (Lock memory) doğru ABI ile tanımlandı. Ek olarak:
  • LP NFT içerik kontrolü (sadece Uniswap V3 NPM)
  • Ekosistem token zorunluluğu (en az bir tarafta VOI/JVOI/HEY/HLTV/URA/GARURA)
  • Likidite > 0 kontrolü
  • emergencyWithdrawPrize — admin acil token çekebilir

13.2 Kayıt Akışı

register(lockId):
  Lock l = ILocker.getLock(lockId)
  require(l.owner == msg.sender)
  require(!l.withdrawn)
  require(l.unlockTime > now)             // henüz kilitli
  require(l.nftContract == NPM)            // sadece Uniswap V3
  positions(l.tokenId) → t0, t1, liquidity
  require(liquidity > 0)
  require(ecosystemTokens[t0] || ecosystemTokens[t1])
  entries[++entryCount] = Entry(...)

13.3 Random Seçim

rand1 = keccak256(
    block.prevrandao, block.timestamp, entryId,
    unlockTime, msg.sender, block.coinbase
)
token = available[rand1 % count]
maxAmt = poolRemaining / 20  // havuzun max %5'i
amount = (rand2 % maxAmt) + 1e18
Random Güvenliği
On-chain rastgelelik validator manipülasyonuna açıktır. Polygon validator'ları prevrandao'yu önceden bilebilir. Düşük değerli ödüller için kabul edilebilir; yüksek değerli tombala için Chainlink VRF kullanmak gerekir.

14MintTimelock İPTAL · 2026-05-16

Bu Kontrat Deploy Edilmeyecek
Plan iptal edildi — VOI/HEY cap'leri tamamen dolduğu için mint operasyonu fiilen kapandı (bkz. §4.1–4.2). CMC artık "Mintable" uyarısı vermiyor, sadece Contract Not Renounced + Pause + Low Liquidity uyarıları kaldı (bkz. §19.2). Bu kontratpolygon.heylogramtv/contracts/MintTimelock.sol'da yazılı ama mainnet'e gönderilmeyecek.

Aşağıdaki anlatım tasarım belgesi olarak korunuyor.

CoinMarketCap'ın "Mintable" güvenlik uyarısını yumuşatmak için yazılmıştı. Token'ların owner'ı bu kontrata devredilir; her mint 48 saat queue beklerdi.

14.1 Akış

1. token.transferOwnership(MintTimelock.address)
2. Admin: queueMint(token, to, amount) → id
3. 48 saat geri sayım başlar (DELAY = 48h)
4. Süre dolunca herkes çağırabilir: executeMint(id)
   → token.mint(to, amount)
5. Admin tehlikeli mint görürse: cancelMint(id)
6. 14 günden eski queue expire (GRACE = 14d)

14.2 Admin İki Adımlı

proposeAdmin(newAdmin)acceptAdmin(). Yetkisiz adrese yanlışlıkla geçişi engeller.

14.3 Token Ownership Transferi

transferTokenOwnership(token, newOwner) — onlyAdmin
  // Token ownership'ini başkasına devret (acil durum için)
  // Bu işlem TIMELOCK'A TABİ DEĞİL
Yeni Bulgu (yazım sırasında)
transferTokenOwnership 48h timelock'lu değil. Admin key çalınırsa, saldırgan tek tx'te token ownership'ini başka bir adrese geçirip orada mint edebilir. Çözüm:bu fonksiyonu da queue/execute akışına bağlamak veya multi-sig ile korumak. Bkz. §19.

15Kontrat Referansı

16 .sol dosyası — 15 üretim + 1 mock. Her kontrat için tek satır rolü, kalıtım, kritik fonksiyonlar ve davranışlar.

VOIToken.sol100M cap, mintable, pausable, ERC20Permit
Inherits
ERC20Permit, ERC20Burnable, Ownable, Pausable
Constructor
(address initialOwner)
Max Supply
100,000,000 × 10¹⁸

Fonksiyonlar

  • mint(to, amount) — onlyOwner; cap kontrol
  • batchMint(aliciler[], miktarlar[]) — onlyOwner; airdrop
  • pause / unpause — onlyOwner
  • burn / burnFrom — standart ERC20Burnable
  • permit — EIP-2612 imzayla approve
HEYToken.sol2B cap — VOI ile aynı yapı

VOI ile birebir aynı kalıtım, fonksiyonlar, davranışlar; tek fark MAX_SUPPLY = 2,000,000,000 × 10¹⁸.

JJVOIToken.sol777M sabit · sahipsiz · immutable
Inherits
Yok — ham ERC-20 yazımı
Constructor
parametresiz · tüm arz deployer'a basılır
Supply
777,777,777 × 10¹⁸ (sembolik)

Özellikler

  • No owner. Ownable miras alınmaz.
  • No mint. Mint fonksiyonu yok.
  • No pause. Pausable miras alınmaz.
  • No blacklist. Hiçbir adres engellenemez.
  • On-chain metadata: website, whitepaper, platform, description sabit string'ler
  • unchecked bloklarda transfer — gas optimize
HLTVToken.sol629M sabit · sahipsiz · streaming token

JVOI ile birebir aynı mimari, farklı supply (629,629,629). Heylogram.tv canlı yayın platformunun (gelecek) ana tokeni.

URAToken.sol98.7Q cap · lockable minter · DEX-safe
Inherits
ERC20, ERC20Permit, ERC20Burnable
Constructor
(address deployer)
Max Supply
98,774,312,000,000,000 × 10¹⁸
Minter
Tek adres (tıklama oyunu kontratı), lockMinter() ile kilitlenebilir

Fonksiyonlar

  • setMinter(address) — onlyOwner, kilitlenmeden bir kez set
  • lockMinter() — sonsuza kilitle
  • renounceOwner() — sahibi tamamen bırak
  • mint(to, amount) — onlyMinter
GaruraToken.sol1 adet · sahipsiz · vault'a deploy
Inherits
ERC20, ERC20Permit, ERC20Burnable
Constructor
(address vault) — tüm arz vault'a basılır
Supply
1 × 10¹⁸ (toplam 1 GARURA)

Özellikler

  • Mint fonksiyonu yok — sadece constructor'da basılır
  • Pause yok, blacklist yok, owner yok
  • Her transfer GaruraElDegistirdi event'i yazar
HeylogramDomain.sol.heylogramtv NFT · tier fiyat · POL/VOI/HEY
Inherits
ERC721, Ownable, ReentrancyGuard
Constructor
(initialOwner, voiToken, heyToken, polUcreti, voiUcreti, heyUcreti)

Fonksiyonlar

  • fiyatHesapla(isim) — pure; isim uzunluğuna göre POL+VOI
  • mintPOL / mintVOI / mintHEY — kullanıcı ödeyerek alır
  • mintUcretsiz(alici, isim, ipfsLink) — onlyOwner; airdrop
  • ipfsGuncelle(tokenId, link) — sadece sahip
  • domainSorgula(isim) — view; (alindi, sahip, ipfs, tarih)
  • rezerveEt(isim) — onlyOwner
  • paraCek — onlyOwner; POL + VOI + HEY bakiyesi
HeylogramMarketplace.solv2 · eski + yeni NFT desteği · 3 para birimi
Inherits
Ownable, ReentrancyGuard
Constructor
(domainNFT, domainNFTLegacy, voi, hey, komisyonAlici)
Komisyon
komisyonBaz = 500 (=%5), max %10

Fonksiyonlar

  • listele(tokenId, fiyat, paraBirimi)
  • listeyiIptalEt(tokenId)
  • polIleSatinAl / voiIleSatinAl / heyIleSatinAl
  • aktifListeler / listeDetay
  • komisyonGuncelle / komisyonAlicisiGuncelle — onlyOwner
GaruraPool (v1 + v2)v1: deprecated · v2: 1 VOI = 1000 puan sabit

V1 (kullanılmıyor): Token whitelist, ECDSA imzalı claim, partner havuzu ayrı, admin push, deprecate mekanizması. Eksiği: sabit oran yok, partner istediğini çekebilir.

V2 (aktif):

Inherits
ReentrancyGuard
Sabitler
PUAN_VOI_ORANI = 1000, PLATFORM_PAYI = 15
  • partnerYatir(voiMiktari, tokenId, isOld)
  • gorevTamamlandi(partnerWallet, puanMiktari) — onlyOperator
  • partnerCek(voiMiktari) — sadece serbest bakiye
  • adminPush(kullanicilar[], miktarlar[]) — onlyAdmin, max 500
  • adminCek / adminCekTumu — platform payı
  • setPaused / deprecate / emergencyWithdraw
  • setOperator / proposeAdmin / acceptAdmin
LuckPool (v1 + v2)v1: ABI bug · v2: düzeltilmiş

V1: ILocker arayüzü 6 ayrı return olarak yanlış tanımlı — her register revert. Kullanılamaz.

V2 (aktif):

  • Doğru struct Lock ABI
  • Sadece Uniswap V3 NPM LP NFT kabul
  • 6 ekosistem token whitelist (VOI/JVOI/HEY/HLTV/URA/GARURA)
  • addPrize / emergencyWithdrawPrize — onlyAdmin
  • register(lockId) — 7 kontrol
  • claim(entryId) — random token + max %5/havuz
LiquidityMining.solPOL + JVOI → Uniswap V3 LP + ödül
Sabitler
JVOI (hardcoded), WMATIC, NPM, FEE_TIER = 3000, LOCK_DAYS = 30, ANGEL_LOCK_DAYS = 180, REWARD_BPS = 100, ANGEL_REWARD_BPS = 500, REFUND_TIMEOUT = 48h
  • fundRewardPool(amount) — onlyAdmin, JVOI yatırır
  • deposit(jvoiAmount) payable — POL + JVOI
  • lockPosition(positionId, nftTokenId) — onlyAdmin, backend bağlar
  • angelDeposit — 100 POL min, 180 gün, %5 ödül
  • refundPosition — backend 48h içinde NFT bağlamazsa
  • claim — LP NFT + JVOI ödül
  • emergencyWithdrawToken — JVOI için protected kısımdan dokunamaz
MintTimelock.sol48h queue · CMC Mintable uyarısı çözümü
Sabitler
DELAY = 48h, GRACE = 14d
  • queueMint(token, to, amount) — onlyAdmin
  • executeMint(id) — herkes (48h sonra)
  • cancelMint(id) — onlyAdmin
  • transferTokenOwnership(token, newOwner) — onlyAdmin, timelock'suz
  • proposeAdmin / acceptAdmin
HeylagramGaruraBadge.solERC-1155 · random tokenId · 4 ödeme tokeni
Inherits
ERC1155, Ownable, ReentrancyGuard
Constructor
(voi, hey, usdt, usdc)
  • createCollection — partner; ücret 4 tokenden biri
  • addLevel — partner; random tokenId üretilir
  • updateLevel / updateCollection
  • adminMint / adminMintBatch — onlyOwner, milestone
  • userMint — partner ücret koymuşsa
  • setCreationFee / setLevelFee / setMintCommission — onlyOwner
  • contractURI — OpenSea inline JSON

16Canlı Kontrat Adresleri

Polygon Mainnet. PolygonScan'de doğrulanmış kaynaklar.

KontratAdresDurum
VOI Token0xc8Ad9EB7D26337E598AFE89bF69d21455BD10501canlı · CMC listeli
HEY Token0xC9e3488E3CDAA944fDBFce0DEf602d4b09db4032canlı
JVOI Token0xa50eBF45c9C8D7F45C861D6064165E910e3fbEc5canlı · sahipsiz
HLTV Token0x8C55F7815b619e07B16fed6C3D0418684e441038canlı · sahipsiz
URA Token0xaafbd87e2D69Dc317276a16E2c195d269214b7C5canlı
GARURA Token0x427E0a0F5B8b70e2f98CcA860FdFF58055C253C5canlı · 1 adet
Domain NFT (yeni)0xc993f5A85724a609A4747e9c237A12C57F13A826canlı · v2
Domain NFT (eski)0xc654129EF0FE6677d7A01B852D1113a0110b0816eski · paralel
Marketplace (yeni)0x88Be8507cB3750e16331Fe10601fB0297d4C35eacanlı · v2
Marketplace (eski)0x3C7a64bCc80DF0726B4Ddfae2621ccB0Ea3fD3Ceeski
GaruraPool V10xf1Ba8A40b89B6D7EdE52159A06F867508B7C731adeprecated
GaruraPool V20x87555b791A30ec5B10150ac1BD399741030DFBb0canlı
MintTimelockdeploy bekliyor
LiquidityMiningdeploy bekliyor
LuckPool V20xd20e8ABDd5b767D6E112F0f51B058BDa0715B9Cfcanlı
HeylagramGaruraBadgedeploy bekliyor

16.1 Yönetim Adresleri

  • Admin cüzdan: 0x425490412f1F6e4c6DB58DE0134548dF4Ec22c70
  • Uniswap V3 NPM (Polygon): 0xC36442b4a4522E871399CD717aBDD847Ab11FE88
  • WMATIC: 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
  • Locker V1: 0x3df61b76622eC494cEE2f586914DB14913c5CA98
  • USDT (Polygon): 0xc2132D05D31c914a87C6611C10748AEb04B58e8F
  • USDC (Polygon): 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359

16.2 RPC Kullanımı

  • https://polygon.drpc.org
  • https://1rpc.io/matic
  • polygon-rpc.com — bozuk
  • rpc.ankr.com/polygon — bozuk

16.3 API Endpoint Kataloğu

app/api/ altında 60+ endpoint var. Gruplandırılmış tablo — gizli yönetim endpoint'leri listelenmemiştir.

Token & Supply (CMC + Genel)

EndpointYöntemYanıtAçıklama
/api/voi/total-supplyGETplain uintCMC için
/api/voi/circulating-supplyGETplain uintCMC için
/api/voi/max-supplyGETplain uintCMC için (sabit 100M)
/api/voi-priceGETJSONVOI fiyat oracle (DEX'ten)
/api/hey/total-supplyGETplain uintCMC için
/api/hey/circulating-supplyGETplain uintCMC için
/api/hey/max-supplyGETplain uintCMC için (sabit 2B)
/api/token-infoGETJSONTüm tokenlerin metadata özeti
/api/wallet/tokens?wallet=GETJSONCüzdandaki tüm ekosistem tokenleri

Domain & Resolve

EndpointYöntemAçıklama
/api/resolve?name=GETDomain adından bilgi (sahip, tokenId, profil)
/api/resolve-name?wallet=GETWallet'tan primary domain
/api/resolve-address?name=GETDomain'den sahibin adresine
/api/domain/has-domain?wallet=GETCüzdan en az 1 .heylogramtv'ya sahip mi?
/api/domain/image/[tokenId]GETSVG NFT görüntüsü (dinamik)
/api/domain/metadata/[tokenId]GETOpenSea uyumlu metadata JSON
/api/domain/profileGET/POSTProfil oku/yaz (Linktree benzeri)
/api/domain/websiteGET/POSTDomain için redirect URL

Görev Sistemi

EndpointYöntemAçıklama
/api/missionsGETAktif görevler listesi
/api/mission/completePOSTİmzalı görev tamamlama
/api/mission/content-completePOSTİçerik üretme görevi (manuel onay)
/api/mission/domain-mintPOSTDomain mint tx hash doğrulama → puan
/api/user?wallet=GETKullanıcı profili + puanı
/api/user/activity?wallet=GETSon aktivite akışı

Garura Sezon Sistemi

EndpointYöntemAçıklama
/api/garura/seasonGETAktif sezon bilgisi (token, miktar, süre)
/api/garura/registerPOSTSezona puan commit ile katıl
/api/garura/claimPOSTSezon sonu token claim (admin imzalı)
/api/cron/season-distributePOSTVercel Cron — bitmiş sezonları dağıtır

URA Tıklama Oyunu

EndpointYöntemAçıklama
/api/ura/clickPOST1 tıklama → 1 URA mint, rate-limited
/api/ura/batch-mintPOSTBirikmiş offline puanları toplu mint
/api/ura/leaderboard?limit=GETÜst-N tıklayan cüzdanlar
/api/ura/nicknameGET/POSTCüzdana takma ad bağla / oku
/api/ura/sessionPOSTCüzdansız oturum başlat (in-app wallet)
/api/ura/user?wallet=GETKullanıcının URA istatistikleri
/api/ura/referralPOSTDavet kaydı (bir kez, anti-bot)
/api/ura/scoreGET(luck altında) tıklama skor sorgu

Partner / B2B

EndpointYöntemAçıklama
/api/partner?wallet=GETPartner durumu (canlı ownerOf kontrol)
/api/partner/activatePOSTDomain ile partner aktivasyonu
/api/partner/analytics?wallet=GETGörev tıklama istatistikleri
/api/partner/contentPOSTGörev içeriği güncelleme
/api/partner/deposit-bonusPOSTVOI yatırınca bonus puan
/api/partner/logoPOSTLogo yükleme (URL veya dosya)
/api/partner/public-tasksGETGorevler sayfası için tüm aktif partner görevleri
/api/partner/tasksGET/POSTPartner kendi görevlerini yönet
/api/partner/track-visitPOSTScript bildirim — ziyaret kaydet
/api/partner/webhookPOSTHMAC imzalı webhook (form/oyun bildirimi)

Tracker Script (B2B Bot Koruması)

EndpointYöntemAçıklama
/api/track/script/[siteKey]GETJS tracker dosyası (partner sitesi gömer)
/api/track/visitPOSTZiyaret bildirimi (CORS *)
/api/tracker/pingPOSTHeartbeat — kullanıcı hala sayfada
/api/tracker/tokenGETTracker session token üretir

Sosyal Doğrulama

EndpointYöntemAçıklama
/api/verify/tweetPOSTTweet URL doğrulaması (X paylaşımı)

Blog & Duyurular

EndpointYöntemAçıklama
/api/blog?status=&limit=GETYayınlanmış postlar, publishedAt DESC, 30s CDN cache
/api/blog/[slug]GETTek post detayı (TR + EN içerik, tag, cover, body)

OG & Paylaşım

EndpointYöntemAçıklama
/api/ogGETGenel OG image (sosyal paylaşım)
/api/og-enGETİngilizce OG image
/api/og/promo/[slug]GETPromo sayfaları için dinamik OG
/api/og/uraGETURA paylaşım kartı
/api/og/blog/[slug]GETBlog yazısı paylaşım kartı (dinamik)

Diğer

EndpointYöntemAçıklama
/api/weatherGETAçılış sayfası dekoratif veri (animasyon için)
Toplam
Yaklaşık 60+ public endpoint. Yönetim endpoint'leri (/api/admin/*, /api/cron/*) listelenmemiştir — bunlar yetki bazlı çalışır ve dokümana eklenmez (saldırı yüzeyi azaltma).

17Aşamalı Deploy

Heylogram TV mainnet'te halihazırda büyük ölçüde canlı. Bekleyen 2 kontrat aşağıdaki sırada deploy edilecek. MintTimelock planıiptal edildi — VOI/HEY cap'leri tamamen dolduğu için mint operasyonu zaten kapandı (bkz. §4.1–4.2); "Mintable" uyarısı için gerekli çözüm artıkrenounceOwnership() kararıdır.

17.1 Faz 6 — LiquidityMining Sıradaki

  1. scripts/deployLiquidityMining.js --network polygon
  2. JVOI ödül havuzunu doldur: fundRewardPool(amount)
  3. Backend keeper yaz: deposit tx'lerini dinler, 48h içinde Uniswap V3 LP oluşturur ve lockPosition çağırır
  4. Vercel env: NEXT_PUBLIC_LIQUIDITY_MINING=0x...
  5. Frontend /luck sayfası deposit + claim UX (mevcut /dapp/dex içindeki Luck tab ile entegre)

17.2 Faz 7 — Badge ERC-1155

LuckPool V2 zaten canlı (0xd20e…B9Cf) — yalnız Badge kalıyor.

  1. scripts/deployBadge.js
  2. Vercel env: NEXT_PUBLIC_BADGE_CONTRACT
  3. Partner panelinde badge collection oluşturma UI'ı

18Audit & Bulgular

node audit.js ile yapılmış statik analiz raporu (AUDIT_REPORT.md, 28.04.2026). 62 dosya, 47 ms, 288 bulgu.

ÖnemSayıAçıklama
🔴 KRİTİK6Güvenlik / para kaybı
🟠 HATA33Runtime / mantık
🟡 UYARI126UX kırılganlığı
🔵 BİLGİ123İyileştirme
Toplam288

18.1 Kritik Bulgular

KodSorunDurum
K06Replay attack — partner API'lerde timestamp/nonce yokDüzeltildi (5dk TTL imza)
K05Topic hash hardcoded — false positive (etiket karışıklığı)Bilinçli
K04CORS * — /api/track/visitBilinçli (partner siteler çağırır)
K02partners koleksiyonu wallet ile sorgulanıyorBilinçli (doc ID = domain, where ile gerekirse)

18.2 Yüksek Öncelikli Hatalar

KodSorunEtki
E09NaN kontrol edilmeden matematik (6 dosya)API 500'leri
E08Firestore limit yok — partner-tasks endpointTimeout + yüksek fatura
E05Wallet regex yok (9 endpoint)Düzeltildi
E02.data()! non-null assertion (11 dosya)Crash riski
E07Promise.all → allSettled gerekiyor (6 dosya)Unhandled rejection

18.3 Yazım Sırasında Yeni Bulgular (Kontrat)

N1 — MintTimelock transferTokenOwnership timelock'suz GEÇERSİZ

MintTimelock planı 2026-05-16'da iptal edildi (VOI/HEY mint operasyonu kapandı, bkz. §17). Kontrat deploy edilmeyecek, dolayısıyla bu bulgu artık geçerli değil.

N2 — GaruraPool V2'de dead-code RAFA · MOOT

require(voiMiktari % (1e18 / PUAN_VOI_ORANI) == 0 || true, "");
                                                              ^^^^^^^^
                                                          her zaman true

|| true her zaman true olduğu için require hiçbir şey yapmıyor. Ya unutulmuş ya da kasti dummy. Kod kalitesi.Çözüm: Satırı sil veya gerçek kontrolü yaz.

N3 — VOI/HEY Pause Sorunu Token Ownership Devri Sonrası GEÇERSİZ

MintTimelock devri olmadığı için pause yetkisi hala admin cüzdanında. Bu bulgu artık geçerli değil (bkz. N1).

N4 — LuckPool V2 Random Validator Manipülasyonu AKTİF (mainnet'te canlı)

LuckPool V2 mainnet'te canlı (0xd20e…B9Cf) veregister/claim akışı çalışıyor. _selectPrizeiçinde rastgelelik block.prevrandao,block.coinbase, block.timestamp'a dayalı — Polygon validator'ları bu değerleri önceden bilebilir veya küçük manipülasyon yapabilir. Düşük prize'lar için ekonomik değil ama havuzdaki maxAmt (havuzun %5'i, max 1000 token) büyüdükçe risk artar.

Çözüm: Chainlink VRF V2 entegrasyonu (VRFConsumerBaseV2 miras + requestRandomWords akışı). Mevcut V2 kontratı immutable, yeni bir LuckPoolV3deploy edilip addPrize ile token havuzları aktarılır.

N6 — Garura Pay Çift Kesim Riski RAFA · MOOT

Garura sezon sistemi 2026-05-16'da rafa kaldırıldı (bkz. §7) → claim endpoint'i artık aktif kullanılmıyor. Bulgu doğru ama operasyonel olarak relevant değil. Garura yeniden açılırsa düzeltilmesi gereken not.

N10 — DEX Pool-based Quote Hassasiyet Kaybı DÜŞÜK

lib/dexAdapters.ts quoteFromPoolBasediçinde, token1→token0 yönünde:

amountOut = (amountIn * Q192) / num;   // Q192 = 2¹⁹², num = sqrtPriceX96²

BigInt overflow yok ama integer division küçük amount'larda rounding hatası verir (yaklaşık %0.001 mertebesinde — ihmal edilebilir). Büyük swap'larda slippage hesaplanmaz — pool derinliğine bağlı gerçek fiyat etkisi yok. Asıl swap gönderilirken zaten amountOutMinimum ile slippage korunur (UI'da %0.5 default), o yüzden ekonomik risk düşük.

N11 — findReferencePrice Likiditeye Göre Sıralanmıyor DÜŞÜK

findReferencePrice tüm venue'lardan paralel sorgu yapar ama results.find(r => r !== null) ilevenue tanım sırasındaki ilk olanı seçer. Uniswap'ta düşük likiditeli pool varsa Sushi'deki büyük havuz atlanır, yanlış referans fiyat döner.

Çözüm: her venue'dan dönen sonuçlar için pool liquidity de çek, en yüksek likidite olanı tercih et. Sadece yeni pool açarken kullanıldığı için kritik değil.

N12 — Sushi V3 Quoter Tamamen Atlanıyor DÜŞÜK

quoteFromVenue içinde Quoter sadecevenue.key === 'univ3' için çağrılıyor (line 279). Sushi V3 (0x64e8…08A7) için doğrudan pool-based fallback'e düşülüyor. Yorum diyor "Quoter'ı yok/bozuk" — Sushi V3 Polygon'da gerçekten Quoter çalışmıyorsa bu doğru kasıt; çalışıyorsa daha doğru quote alma şansı kaçırılıyor.Aksiyon: Sushi V3 Polygon Quoter'ı manuel test et, çalışıyorsa venue.key === 'univ3' || venue.key === 'sushiv3'koşulunu genişlet.

18.4 Sorun Yoğunluğu (Top 5)

Audit Eski Tarihli
Aşağıdaki sayılar 2026-04-28 audit tarama anına ait. O tarihten bu yana çoğu dosya değişti (admin sayfasından mint UI kaldırıldı, Garura/Gorevler/Advertise rafa alındı, DEX eklendi, blog eklendi). Güncel sayılar için node audit.jstekrar koşulmalı.
DosyaBulgu (2026-04-28)
components/PartnerPanel.tsx21
app/hesap/page.tsx18
app/pazar/page.tsx18
app/resolve/[name]/page.tsx15
app/locker/page.tsx15

18.5 Firestore Security Rules

Heylogram TV off-chain veriyi Firestore'da tutar. Yanlış yapılandırılmış güvenlik kuralları puan ekleme, partner görev manipülasyonu veya webhook secret sızıntısı yaratabilir.firestore.rules dosyasındaki temel ilkeler:

Genel İlke

Yalnızca server-side admin SDK yazar. Tarayıcıdan hiçbir koleksiyona doğrudan yazma izni yoktur. Frontend yalnızca okuma yapar (ve sadece izin verilen koleksiyonlardan).

Koleksiyon İzinleri

KoleksiyonFrontend OkuFrontend YazServer SDK
kullanicilar/Kendi belgesiHayırTam
seasons/Aktif olan publicHayırTam
garuraRegistrations/Kendi belgesiHayırTam
domainProfiles/Tümü publicHayır (server doğrular)Tam
partners/Tümü public (logo, görev için)HayırTam
partners/{x}/.webhookSecretHayır (gizli alan)HayırTam
partnerGorevler/Status === 'active'HayırTam
missions/Active === trueHayırTam
uraClicks/globalPublicHayırTam
uraNicknames/Kendi belgesiHayırTam
uraLeaderboard/Tümü publicHayırTam
votes/HayırHayırTam

Webhook Secret Gizliliği

W12 Audit
Audit raporu webhookSecret Firestore'da plaintext saklanıyor diye uyardı. Çözüm: Security Rules'dapartners/ koleksiyonu okunabilir, amawebhookSecret alanı yalnız admin SDK'ya açık. Pratikte tarayıcı bu koleksiyonu hiç çağırmaz —/api/partner server endpoint'i secret'sız bir projection döndürür.

Yazma Doğrulaması

Hiçbir doğrudan yazma kabul edilmediği için frontend Firestore'a yazmaz. Tüm yazma işlemleri imza + timestamp + server doğrulaması üzerinden geçer. Sorun: tarayıcının fonksiyonel olarak hiç yazma izni olmadığını development'ta unutmak — local'de deploy edilince fail eder.

19Bilinen Riskler & Yol Haritası

19.1 Açık Kalan Yapısal Sorunlar

  • N4: LuckPool V2 random — Chainlink VRF'e geçiş (yüksek prize için)
  • N10: DEX pool-based quote büyük swap'larda slippage hesaplamıyor (slippage UI ile koruma var; ekonomik risk düşük)
  • N11: findReferencePrice likidite sıralaması yerine venue sırasını kullanıyor
  • N12: Sushi V3 Quoter atlanıyor (gerçekten bozuksa kasti; yoksa daha doğru quote kaçırılıyor)
  • E02, E07, E08, E09: 33 backend hata düzeltmesi (deferred audit notları)
  • W04: Partner track-visit / webhook rate limit (bot koruması)

Geçersiz olanlar: N1/N3 (MintTimelock iptal edildi), N2/N6 (Garura rafa kaldırıldı), N5 (PartnerPool kullanılmıyordu ve kaldırıldı). Bunlar §18.3'te tarihçe için belge olarak duruyor.

19.2 CMC Uyumluluk Yol Haritası

Güncel CMC durumu (2026-05): VOI ve HEY için üç uyarı var (Contract Not Renounced, Pause, Low Liquidity). Diğer tokenler (JVOI, HLTV, URA, GARURA) için sadece Low Liquidity uyarısı — bu dördü zaten sahipsiz/immutable."Mintable" uyarısı kaldırıldı — VOI/HEY cap'leri tamamen dolduruldu, CMC artık bu uyarıyı vermiyor.

UyarıEtkilenenÇözümDurum
Contract Not RenouncedVOI, HEYrenounceOwnership() çağırKarar (esneklik vs güvenlik)
Pause varVOI, HEYOZ Pausable miras alındı — kaldırmak için yeni token sürümü (V2 deploy + 1:1 swap)Sonraki sürüm
Low LiquidityTüm tokenlerLiquidity Mining + DEX akışı + organik kullanımFaz 6
MintableCap dolduruldu, uyarı kalktıÇözüldü

19.3 Heylogram.tv Vizyonu

Asıl büyük proje: heylogram.tv canlı yayın platformu. Tasarım hazır (HAYALLER.md'de detaylı): TikTok Live + Twitch hibrid, tamamen Web3, HEY token ekonomisi, SVG NFT hediye sistemi.

Tahmin: 6+ ay engineering, ekip gerekir. HLTV tokeni bu platform için hazır bekliyor — sahipsiz, immutable, 629M arz.

19.4 CURBAN — AI Görsel + NFT

Vizyon parçası: prompt yaz, AI görsel üret, otomatik NFT mint. Ayrı token (CURBAN) ekonomisi. Kullanıcı isteyince paylaşmadan kendine de saklayabilir. Şu an plan aşamasında.

Tasarım: web3.jjvoi.com/curban alt sayfası. AI API müsaitlik tarayıcı → kuyruğa al → görsel gelince göster → "NFT olarak kaydet?" → Polygon mint. NFT adı = prompt, içerik = oluşan görsel. Fiyatlandırma maliyet + %20-30, CURBAN token ile öde. Garura benzeri sezonluk havuz mümkün.

19.5 Akıllı NFT Vizyonu

Mevcut HeylogramDomain NFT'leri görsel olarak basit SVG. Hayaller:

  • Ülke NFT'leri: Bir kullanıcı turkey.heylogramtv alırsa NFT olarak dalgalanan bayrak animasyonu (SVG + CSS).
  • İsim NFT'leri: eyup.heylogramtv alındığında ismin anlamına özgü karakteristik görsel — "Eyup" → sabır metaforu, kendine has SVG.
  • İleride AI bağlantısı: prompt'u kelimenin anlamı, çıktısı NFT görseli.

19.6 Admin Cüzdan Güvenliği

Protokolün tüm admin yetkileri şu an tek bir cüzdanda toplanmış durumda. Önerilen güvenlik katmanı:

  • Gnosis Safe multi-sig (2/3 veya 3/5) — kontrat seviyesinde garanti, single point of failure yok
  • Hot wallet günlük işlemler için ayrı tutulur, büyük cüzdan operasyonları Safe imzasıyla geçer
  • Hardware wallet kullanımı zorunlu

Trade-off: her admin tx çoklu imza gerektirir (gecikme), kurulum maliyeti var — ancak operasyonel disiplini güçlendirir ve admin key kompromizasyon riskini ciddi şekilde azaltır.

20Sözlük

Admin Cüzdan
Heylogram TV'nin yetkili adresi: 0x4254…2c70. Şu an tek sahip; multi-sig'e geçiş önerilen yol.
Angel Yatırımcı
LiquidityMining'de 100 POL minimum yatıran, 180 gün kilit, %5 JVOI ödülü alan pozisyon tipi.
Badge
ERC-1155 HeylagramGaruraBadge tokeni. Partner milestone'larında kullanıcılara verilen NFT.
committedPoints
Garura sezonu açıldığında kullanıcının havuza bağlattığı puan miktarı (sezon başı snapshot).
earnedDuringSeason
Sezon süresince kazanılan ek puan; pay hesabına dahil edilir.
Ekosistem Tokenleri
LuckPool V2'nin LP NFT'lerde aradığı altı tokenden biri: VOI, JVOI, HEY, HLTV, URA, GARURA.
DEX Aggregator
Heylogram TV'nin kendi yazdığı multi-venue swap+pool katmanı. /dapp/dex içinde 3 venue (Uniswap V3, Sushi V3, QuickSwap V3) paralel sorgulanır, en iyi fiyat veren venue seçilir. Bkz. §3.8.
Garura rafa
Sembolik ağaç + mevsimsel ödül havuzu (GaruraPool V2). 2026-05-16'da sezon sistemi durduruldu; kontrat hala mainnet'te ama frontend kullanmıyor. URA'nın kavramsal kökeni — URA "Garura'nın yaprağı" olarak kaldı.
havuzBakiyesi
Eski (Garura V2): GaruraPool V2'de kullanıcılara dağıtılmayı bekleyen %85'lik kısım. Sezon sistemi 2026-05-16'da kapatıldı.
Heylogram TV
Gelecek canlı yayın platformu (heylogram.tv). HLTV tokeni bu platform için.
kilitliVOI
Eski (Garura V2): GaruraPool V2'de görev tamamlandığında havuza kilitlenmiş, partner tarafından çekilemeyen VOI.
lockedUserJvoi
LiquidityMining'de kullanıcıların yatırmış olduğu JVOI'nin toplamı. emergencyWithdraw bu miktara dokunamaz.
Locker V1
Mevcut LP NFT kilitleme kontratı (0x3df6…CA98). LuckPool V2 bu adres üzerinden lock'ları okur. DEX sayfasındaki "Locker" tab buradan çalışır.
Marketplace
HeylogramMarketplace V2 — domain NFT alım-satım katmanı, %5 komisyon.
MintTimelock iptal
VOI/HEY/URA ownership'inin devredileceği planlanmış 48h queue kontratıydı. VOI/HEY cap'leri tamamen dolduğu için mint operasyonu kapandı; bu kontrat artık deploy edilmeyecek. CMC "Mintable" uyarısı için kalan tek yol renounceOwnership().
Operatör
Eski (Garura V2): GaruraPool V2'de admin tarafından yetkilendirilmiş, gorevTamamlandi çağırabilen ama para çekemeyen backend adresi.
Pool-based Quote
DEX adapter'da Quoter kontratı çalışmayınca devreye giren fallback. Factory'den pool adresini al, slot0.sqrtPriceX96'yı oku, (sqrtPriceX96)² / 2²⁰⁰ formülüyle fiyat hesapla. Sushi V3 için ana yol (Quoter'ı atlanır).
Venue
DEX aggregator'da bir Polygon DEX'i (univ3 / sushiv3 / quickv3). Her venue kendi quoter, router ve position manager adresleriyle tanımlı.
Partner
.heylogramtv domain NFT'sine sahip, kendi görevlerini açan ve havuza VOI yatıran site sahibi.
partnerCount
HeylagramGaruraBadge'te şu ana kadar oluşturulmuş partner koleksiyonu sayısı (1'den başlar).
Random TokenId
HeylagramGaruraBadge'in keccak256 ile ürettiği rastgele NFT ID — domain'in 1,2,3 çakışma sorunu yok.
Refund Timeout
LiquidityMining'de backend 48 saat içinde LP NFT bağlamazsa kullanıcı parasını geri alabilir.
Sezon
Garura sisteminde belirli bir süre + token havuzu olan dağıtım dönemi. Tamamen Firestore'da tutulur.
Soulbound
Heylogram TV'de yok — projedeki tüm tokenler devredilebilir. (SALKIM'den ayrı.)
tokenIdToPartner
HeylagramGaruraBadge'te bir tokenId hangi partner koleksiyonuna ait — uri() çağrısında kullanılır.
Vault
URA tıklama oyunu kontratı; GARURA tokeninin deploy anında gönderildiği adres.
Webhook Secret
Partner sitesi ile Heylogram TV arasında HMAC imza için kullanılan paylaşılan sır. Firestore'da plaintext (W12 uyarısı).

Heylogram TV — Polygon mainnet · 6 token · 17 kontrat · open source
Site: web3.jjvoi.com ·  X: @heylogramtv ·  Email: web3@jjvoi.com