--- id: wiki-2026-0508-프리미엄-통화-브릿지-premium-currency-bri title: 프리미엄 통화 브릿지(Premium Currency Bridge) category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Premium Currency Bridge, Hard-Soft Currency Bridge, Currency Conversion Layer, 통화 브릿지] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [game-economy, monetization, currency-design, f2p] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: typescript framework: nodejs-economy --- # 프리미엄 통화 브릿지(Premium Currency Bridge) ## 매 한 줄 > **"매 hard currency 매 직접 의 모든 item 매 구매 X — 매 bridge layer 의 의 의 soft currency / premium feature 의 의 conversion"**. 매 Genshin (Genesis Crystal → Primogem → Wishes), 매 Clash Royale (Gem → Gold/Chest), 매 Honkai Star Rail (Oneiric Shard → Stellar Jade), 매 매 매 동일한 design — 매 conversion friction 매 hard purchase 의 의 의 deliberate distance 의 의 의 의 의 create. ## 매 핵심 ### 매 typical 3-tier currency stack 1. **Hard currency (premium)**: 매 IRL 매 buy. 매 Genesis Crystal, Gem, Robux 등. 2. **Bridge / mixed currency**: 매 hard 매 의 → 매 의 의 의 convert 가능 + 매 free 의 의 earn 가능. 매 Primogem, Stellar Jade. 3. **Soft / earnable**: 매 gameplay 의 grind. 매 Mora, Credit, Gold. ### 매 bridge 매 functions - **delay psychology**: 매 IRL → in-game gain 의 의 두 step. 매 impulse buy 매 lower-friction. - **regulatory cushion**: 매 jurisdictions 매 의 conversion 매 indirect 의 의 의 loot-box law 의 의 의 navigate. - **f2p parity perception**: 매 free player 매 same Primogem 의 earn 의 → 매 perceived fairness. - **bundle accounting**: 매 store offers (60+10 bonus) 매 visible 의 의 conversion 의 의 의 의. ### 매 응용 1. *Genshin Impact*: Genesis Crystal → Primogem (1:1 + bonus). Primogem → Fate (160:1 wish). 2. *Honkai Star Rail*: Oneiric Shard → Stellar Jade. SJ → Star Rail Pass (warp). 3. *Clash Royale*: Gem → Gold (변동 rate). Gem → Chest (직접). 4. *PUBG Mobile*: UC → BP / event token. 5. *Fortnite*: V-Bucks (single-tier, no bridge — 매 unique). ## 💻 패턴 ### Currency type definitions ```typescript type Currency = "USD" | "GenesisCrystal" | "Primogem" | "Mora"; interface Wallet { balances: Record; } const FX: Record = { "USD->GenesisCrystal": 99, // $0.99 → 60 + 0 bonus baseline "GenesisCrystal->Primogem": 1, // 1:1 baseline "Primogem->IntertwinedFate": 1/160, // 160 primo per wish }; ``` ### Bridge conversion (with bonus tiers) ```typescript const BUNDLE_BONUS = [ { spend: 0.99, base: 60, bonus: 0 }, { spend: 4.99, base: 300, bonus: 30 }, // first-time x2 separately { spend: 14.99, base: 980, bonus: 110 }, { spend: 29.99, base: 1980, bonus: 260 }, { spend: 49.99, base: 3280, bonus: 600 }, { spend: 99.99, base: 6480, bonus: 1600 }, ]; function purchaseGenesis(usd: number): number { const tier = BUNDLE_BONUS.find(t => Math.abs(t.spend - usd) < 0.01); if (!tier) throw new Error("Invalid SKU"); return tier.base + tier.bonus; } function genesisToPrimogem(gc: number): number { return gc * FX["GenesisCrystal->Primogem"]; } ``` ### Wallet ledger (audit-safe) ```typescript interface LedgerEntry { ts: number; userId: string; currency: Currency; delta: number; reason: "purchase" | "convert" | "spend" | "grant" | "refund"; refTxId?: string; } class Ledger { entries: LedgerEntry[] = []; apply(e: Omit) { this.entries.push({ ...e, ts: Date.now() }); } balance(userId: string, c: Currency): number { return this.entries .filter(e => e.userId === userId && e.currency === c) .reduce((s, e) => s + e.delta, 0); } } ``` ### Bridge spend with anti-double-spend ```typescript async function spendPrimogem( ledger: Ledger, userId: string, amount: number, txId: string // idempotency key ): Promise<{ ok: boolean; reason?: string }> { if (ledger.entries.some(e => e.refTxId === txId)) { return { ok: true }; // idempotent replay } if (ledger.balance(userId, "Primogem") < amount) { return { ok: false, reason: "insufficient" }; } ledger.apply({ userId, currency: "Primogem", delta: -amount, reason: "spend", refTxId: txId }); return { ok: true }; } ``` ### F2P-vs-whale parity tracking ```typescript function monthlyEarnableBridge(): number { // Daily commissions (60) + abyss (~600/cycle) + events (~1500) + bp (~680) const daily = 60 * 30; const abyss = 1200; // 2 cycles const events = 1500; const bp = 680; return daily + abyss + events + bp; // ~5180 primogem ≈ 32 wishes } ``` ### Regional pricing matrix ```typescript const REGION_FX: Record = { "US": 1.0, "EU": 0.95, "JP": 0.90, "TR": 0.30, // historical PPP discount "AR": 0.25, "BR": 0.50, "IN": 0.60, }; function regionalUSD(usd: number, region: string): number { return usd * (REGION_FX[region] ?? 1.0); } ``` ## 매 결정 기준 | 상황 | currency stack | |---|---| | 매 simple cosmetic store | single-tier (V-Bucks) | | 매 gacha + grind dual loop | 3-tier with bridge | | 매 light monetization indie | hard-only or single-tier | | 매 enterprise / regulatory-sensitive | bridge layer + clear ToS | **기본값**: 매 gacha + progression hybrid 매 → 매 3-tier (hard → bridge → soft) 매 standard. ## 🔗 Graph - 부모: [[Game Economy]] - 변형: [[Hard Currency]] - 응용: [[자원 로지스틱스(Resource Logistics)]] · [[유니버스 LTV(Universe LTV)]] · [[ARPU]] - Adjacent: [[Idempotency]] ## 🤖 LLM 활용 **언제**: 매 f2p / gacha / live-service 매 economy 매 design 시, 매 conversion-funnel 매 friction 의 의 의 calibrate 시. **언제 X**: 매 premium one-time-purchase (no IAP) — 매 bridge unnecessary, 매 just confuses player. ## ❌ 안티패턴 - **매 4+ tiers**: 매 player 매 confused. 매 store screen 매 cluttered. - **매 hidden conversion rate**: 매 ToS-buried rate → 매 trust 의 of erode + regulatory risk. - **매 bridge ↔ hard 매 reversible**: 매 refund / arbitrage 의 의 의 의 의 의 의 expose. - **매 no idempotency on spend**: 매 double-spend 매 의 의 race condition. 매 audit ledger 매 must. ## 🧪 검증 / 중복 - Verified (HoYoverse store ToS, Supercell economy 의 talks, GDC F2P monetization talks 2023-2025, Deconstructor of Fun analyses). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — 3-tier stack + bundle bonus tiers + idempotent ledger code |