diff --git a/.github/workflows/quality-gate.yml b/.github/workflows/quality-gate.yml index 7ebf85a8..573f8538 100644 --- a/.github/workflows/quality-gate.yml +++ b/.github/workflows/quality-gate.yml @@ -982,17 +982,20 @@ jobs: set -euo pipefail BASE=/opt/supabase-self-hosted/deploy-staging STAGING="$BASE/tree" - VOL=/opt/supabase-self-hosted/docker/volumes/functions DB=supabase-db echo "── 0. Unpack bundle ──" rm -rf "$STAGING" && mkdir -p "$STAGING" tar xzf "$BASE/supabase-deploy.tgz" -C "$STAGING" - echo "── 1. Sync edge functions (additive, no --delete: telegram-* preserved) ──" - # __tests__ are Deno test dirs — never ship them into the runtime volume. - rsync -a --exclude='__tests__' "$STAGING/functions/" "$VOL/" - echo " synced: $(ls "$STAGING/functions" | grep -v __tests__ | tr '\n' ' ')" + echo "── 1. Sync edge functions (through the ownership gate) ──" + # The runtime volume is shared with pezkuwi-telegram-miniapp. A plain + # rsync here silently replaced that project's telegram-auth on + # 2026-06-28 and broke its sign-in for a month, so writes now go + # through a gate that refuses any name this project does not own. + # Ownership: /opt/supabase-self-hosted/functions-registry.json + # __tests__ are Deno test dirs — the gate skips __-prefixed dirs. + supabase-deploy-functions --project pwap-web --src "$STAGING/functions" echo "── 2. Pre-flight: required edge-runtime secrets ──" EF_ENV="$(docker exec supabase-edge-functions env 2>/dev/null || true)" diff --git a/shared/images/FromGremrazaToDijitalEra.png b/shared/images/FromGremrazaToDijitalEra.png new file mode 100644 index 00000000..2a9fb405 Binary files /dev/null and b/shared/images/FromGremrazaToDijitalEra.png differ diff --git a/shared/images/HEZ_Token_Logo.png b/shared/images/HEZ_Token_Logo.png index 7ccc022d..3709a561 100644 Binary files a/shared/images/HEZ_Token_Logo.png and b/shared/images/HEZ_Token_Logo.png differ diff --git a/shared/images/HEZ_Token_Logo_512.png b/shared/images/HEZ_Token_Logo_512.png deleted file mode 100644 index 03d99316..00000000 Binary files a/shared/images/HEZ_Token_Logo_512.png and /dev/null differ diff --git a/shared/images/PezkuwiChain_new_Logo2_Horizontal_Green_White.png b/shared/images/PezkuwiChain_new_Logo2_Horizontal_Green_White.png new file mode 100644 index 00000000..df54a789 Binary files /dev/null and b/shared/images/PezkuwiChain_new_Logo2_Horizontal_Green_White.png differ diff --git a/shared/images/PezkuwiChain_new_Logo_Horizontal_Green_White.png b/shared/images/PezkuwiChain_new_Logo_Horizontal_Green_White.png new file mode 100644 index 00000000..8ac0ebb3 Binary files /dev/null and b/shared/images/PezkuwiChain_new_Logo_Horizontal_Green_White.png differ diff --git a/shared/images/dijital-kurdistan-id-card.png b/shared/images/dijital-kurdistan-id-card.png new file mode 100644 index 00000000..e187924f Binary files /dev/null and b/shared/images/dijital-kurdistan-id-card.png differ diff --git a/shared/images/dijital-kurdistan-passport.png b/shared/images/dijital-kurdistan-passport.png new file mode 100644 index 00000000..942d0122 Binary files /dev/null and b/shared/images/dijital-kurdistan-passport.png differ diff --git a/shared/images/hez-token.png b/shared/images/hez-token.png deleted file mode 100644 index 816f2c7f..00000000 Binary files a/shared/images/hez-token.png and /dev/null differ diff --git a/shared/images/partial-react-logo.png b/shared/images/partial-react-logo.png deleted file mode 100644 index 66fd9570..00000000 Binary files a/shared/images/partial-react-logo.png and /dev/null differ diff --git a/shared/images/pex-mom.png b/shared/images/pex-mom.png new file mode 100644 index 00000000..d462b31b Binary files /dev/null and b/shared/images/pex-mom.png differ diff --git a/shared/images/pezWallet - white_background.png b/shared/images/pezWallet - white_background.png new file mode 100644 index 00000000..9da1bccb Binary files /dev/null and b/shared/images/pezWallet - white_background.png differ diff --git a/shared/images/pezWallet - white_background_last.png b/shared/images/pezWallet - white_background_last.png new file mode 100644 index 00000000..6c07c955 Binary files /dev/null and b/shared/images/pezWallet - white_background_last.png differ diff --git a/shared/images/pezWallet.png b/shared/images/pezWallet.png new file mode 100644 index 00000000..922f9577 Binary files /dev/null and b/shared/images/pezWallet.png differ diff --git a/shared/images/pezkuwi-ai-revolutainary.png b/shared/images/pezkuwi-ai-revolutainary.png new file mode 100644 index 00000000..043f0888 Binary files /dev/null and b/shared/images/pezkuwi-ai-revolutainary.png differ diff --git a/shared/images/pezkuwi-marketing.png b/shared/images/pezkuwi-marketing.png new file mode 100644 index 00000000..10e557c0 Binary files /dev/null and b/shared/images/pezkuwi-marketing.png differ diff --git a/shared/images/pezkuwi-wallet.png b/shared/images/pezkuwi-wallet.png new file mode 100644 index 00000000..58295532 Binary files /dev/null and b/shared/images/pezkuwi-wallet.png differ diff --git a/shared/images/pezkuwichain_logo - Copy.png:Zone.Identifier b/shared/images/pezkuwichain_logo - Copy.png:Zone.Identifier new file mode 100644 index 00000000..d6c1ec68 Binary files /dev/null and b/shared/images/pezkuwichain_logo - Copy.png:Zone.Identifier differ diff --git a/shared/images/pezkuwichain_new_logo_black.png b/shared/images/pezkuwichain_new_logo_black.png new file mode 100644 index 00000000..1a622d9d Binary files /dev/null and b/shared/images/pezkuwichain_new_logo_black.png differ diff --git a/shared/images/qazwanglass.png b/shared/images/qazwanglass.png new file mode 100644 index 00000000..1eb8a150 Binary files /dev/null and b/shared/images/qazwanglass.png differ diff --git a/shared/images/react-logo.png b/shared/images/react-logo.png deleted file mode 100644 index 9d72a9ff..00000000 Binary files a/shared/images/react-logo.png and /dev/null differ diff --git a/shared/images/referral.png b/shared/images/referral.png new file mode 100644 index 00000000..e5605767 Binary files /dev/null and b/shared/images/referral.png differ diff --git a/shared/images/wallet.png b/shared/images/wallet.png deleted file mode 100644 index de87208a..00000000 Binary files a/shared/images/wallet.png and /dev/null differ diff --git a/web/src/i18n/locales/ar.ts b/web/src/i18n/locales/ar.ts index d6c50b02..ce6459d9 100644 --- a/web/src/i18n/locales/ar.ts +++ b/web/src/i18n/locales/ar.ts @@ -1660,6 +1660,7 @@ export default { 'wallet.send': 'إرسال', 'wallet.receive': 'استقبال', 'wallet.history': 'السجل', + 'wallet.multisigOperations': 'عمليات التوقيع المتعدد', 'wallet.pezRewards': 'مكافآت PEZ', 'wallet.epochOpen': 'مفتوح', 'wallet.epochClaimPeriod': 'فترة المطالبة', @@ -3331,6 +3332,22 @@ export default { 'multisigMembers.allVisible': 'جميع المعاملات مرئية على البلوكتشين', 'multisigMembers.viewExplorer': 'عرض في المستكشف', + // عمليات التوقيع المتعدد (واجهة الموافقة/الرفض المعلّقة) + 'multisigOps.title': 'عمليات التوقيع المتعدد المعلّقة', + 'multisigOps.subtitle': '{{count}} عملية معلّقة بانتظار التوقيعات', + 'multisigOps.refresh': 'تحديث', + 'multisigOps.empty': 'لا توجد عمليات معلّقة حالياً.', + 'multisigOps.approvals': 'موافقات', + 'multisigOps.proposedBy': 'اقترحها', + 'multisigOps.youApproved': 'لقد وافقت على هذه العملية بالفعل', + 'multisigOps.unknownCallHint': 'تعذّر تحديد هذا الاستدعاء تلقائياً من التجزئة وحدها - الصق بيانات الاستدعاء المعروفة أدناه لفك ترميزها والتحقق منها.', + 'multisigOps.pasteCallData': 'الصق بيانات الاستدعاء (0x...)', + 'multisigOps.decode': 'فك الترميز', + 'multisigOps.approve': 'موافقة', + 'multisigOps.reject': 'رفض', + 'multisigOps.thresholdNote': 'يلزم {{threshold}} توقيعاً من أصل {{total}} لتنفيذ أي عملية - لا يمكن لأي موقّع منفرد، بما في ذلك هذا التطبيق، تحريك الأموال بمفرده.', + 'multisigOps.backToWallet': 'العودة إلى المحفظة', + // Batch 12: Pallets Grid 'palletsGrid.title': 'باليتات Runtime الأساسية', 'palletsGrid.description': 'مكونات بلوكتشين معيارية تدعم ميزات PezkuwiChain المتقدمة', @@ -3405,7 +3422,8 @@ export default { 'bridge.withdrawStep4': 'استلم USDT على عنوانك المحدد', 'bridge.wusdtAmount': 'مبلغ wUSDT', 'bridge.max': 'الحد الأقصى:', - 'bridge.withdrawAddress': 'عنوان السحب (حساب بنكي أو عنوان كريبتو)', + 'bridge.withdrawAddress': 'وجهة USDT (Polkadot Asset Hub)', + 'bridge.withdrawAddressAutoNote': 'مشتقّة تلقائياً من حسابك المتصل - يُطلق USDT دائماً إلى المفتاح نفسه بعد إعادة ترميزه لشبكة Polkadot.', 'bridge.addressPlaceholder': 'حساب بنكي أو عنوان كريبتو', 'bridge.withdrawTier': 'مستوى السحب:', 'bridge.securityDelay': 'تأخير الأمان:', @@ -3414,7 +3432,7 @@ export default { 'bridge.insufficientBalance': 'رصيد wUSDT غير كافٍ', 'bridge.noAddress': 'يرجى إدخال عنوان السحب', 'bridge.depositSuccess': 'تم إنشاء طلب إيداع {{amount}} USDT. اتبع التعليمات لإكمال الإيداع.', - 'bridge.withdrawSuccess': 'تم إرسال طلب السحب! تم حرق wUSDT. سيتم إرسال USDT إلى {{address}} بعد {{delay}}.', + 'bridge.withdrawSuccess': 'تم إرسال طلب السحب! أُرسل wUSDT الخاص بك إلى الجسر للمراجعة. بعد موافقة موقّعي التوقيع المتعدد، سيُطلق USDT إلى {{address}} (متوقّع خلال {{delay}}).', // Batch 12: Add Token 'addToken.title': 'إضافة رمز مخصص', diff --git a/web/src/i18n/locales/ckb.ts b/web/src/i18n/locales/ckb.ts index e00239e1..3eafe76e 100644 --- a/web/src/i18n/locales/ckb.ts +++ b/web/src/i18n/locales/ckb.ts @@ -1650,6 +1650,7 @@ export default { 'wallet.send': 'ناردن', 'wallet.receive': 'وەرگرتن', 'wallet.history': 'مێژوو', + 'wallet.multisigOperations': 'کردارەکانی مەڵتیسیگ', 'wallet.pezRewards': 'خەڵاتەکانی PEZ', 'wallet.epochOpen': 'کراوە', 'wallet.epochClaimPeriod': 'ماوەی داواکاری', @@ -3321,6 +3322,22 @@ export default { 'multisigMembers.allVisible': 'هەموو مامەڵەکان لەسەر بلۆکچەین دەردەکەون', 'multisigMembers.viewExplorer': 'بینین لە Explorer', + // کردارەکانی مەڵتیسیگ (ڕووکاری پەسەندکردن/ڕەتکردنەوەی چاوەڕوان) + 'multisigOps.title': 'کردارە چاوەڕوانەکانی مەڵتیسیگ', + 'multisigOps.subtitle': '{{count}} کردار چاوەڕوانی واژوون', + 'multisigOps.refresh': 'نوێکردنەوە', + 'multisigOps.empty': 'لە ئێستادا هیچ کردارێکی چاوەڕوان نییە.', + 'multisigOps.approvals': 'پەسەندکردن', + 'multisigOps.proposedBy': 'پێشنیارکراوە لەلایەن', + 'multisigOps.youApproved': 'تۆ پێشتر ئەم کردارەت پەسەند کردووە', + 'multisigOps.unknownCallHint': 'ئەم بانگە تەنها لە هاشەکەیەوە بە خۆکاری نەناسرایەوە - بۆ لێکدانەوە و پشتڕاستکردنەوە داتای بانگی ناسراو لە خوارەوە بلکێنە.', + 'multisigOps.pasteCallData': 'داتای بانگ بلکێنە (0x...)', + 'multisigOps.decode': 'لێکدانەوە', + 'multisigOps.approve': 'پەسەندکردن', + 'multisigOps.reject': 'ڕەتکردنەوە', + 'multisigOps.thresholdNote': 'بۆ جێبەجێکردنی هەر کردارێک {{threshold}} واژوو لە {{total}} پێویستە - هیچ واژووکارێک بە تەنها، ئەم ئەپەش لەوانەیە، ناتوانێت سامان بجوڵێنێت.', + 'multisigOps.backToWallet': 'گەڕانەوە بۆ جزدان', + // Batch 12: Pallets Grid 'palletsGrid.title': 'پالێتە سەرەکیەکانی Runtime', 'palletsGrid.description': 'پێکهاتەکانی مۆدیولاری بلۆکچەین کە تایبەتمەندیە پێشکەوتووەکانی PezkuwiChain هێز دەدەن', @@ -3395,7 +3412,8 @@ export default { 'bridge.withdrawStep4': 'USDT لە ناونیشانی دیاریکراوت وەربگرە', 'bridge.wusdtAmount': 'بڕی wUSDT', 'bridge.max': 'زۆرترین:', - 'bridge.withdrawAddress': 'ناونیشانی دەرهێنان (هەژماری بانک یان ناونیشانی کریپتۆ)', + 'bridge.withdrawAddress': 'مەبەستی USDT (Polkadot Asset Hub)', + 'bridge.withdrawAddressAutoNote': 'بە خۆکاری لە هەژماری بەستراوتەوە وەرگیراوە - USDT هەمیشە بۆ هەمان کلیل، کە بۆ Polkadot دووبارە کۆدکراوە، دەنێردرێت.', 'bridge.addressPlaceholder': 'هەژماری بانک یان ناونیشانی کریپتۆ', 'bridge.withdrawTier': 'ئاستی دەرهێنان:', 'bridge.securityDelay': 'درەنگکەوتنی ئاسایش:', @@ -3404,7 +3422,7 @@ export default { 'bridge.insufficientBalance': 'باڵانسی wUSDT بەس نییە', 'bridge.noAddress': 'تکایە ناونیشانی دەرهێنان بنووسە', 'bridge.depositSuccess': 'داواکاری پارەخستنی {{amount}} USDT دروستکرا. بۆ تەواوکردنی پارەخستن ڕێنماییەکان بشوێنە.', - 'bridge.withdrawSuccess': 'داواکاری دەرهێنان نێردرا! wUSDT سووتێنرا. USDT دوای {{delay}} بۆ {{address}} دەنێردرێت.', + 'bridge.withdrawSuccess': 'داواکاری دەرهێنان نێردرا! wUSDTەکەت بۆ پێداچوونەوە بۆ پردەکە نێردرا. دوای پەسەندکردنی واژووکارانی مەڵتیسیگ، USDT بۆ {{address}} دەنێردرێت (بە نزیکەیی لە ماوەی {{delay}}).', // Batch 12: Add Token 'addToken.title': 'زیادکردنی تۆکنی تایبەت', diff --git a/web/src/i18n/locales/en.ts b/web/src/i18n/locales/en.ts index 651c59bf..f1978edc 100644 --- a/web/src/i18n/locales/en.ts +++ b/web/src/i18n/locales/en.ts @@ -2019,6 +2019,7 @@ export default { 'wallet.send': 'Send', 'wallet.receive': 'Receive', 'wallet.history': 'History', + 'wallet.multisigOperations': 'Multisig Operations', 'wallet.pezRewards': 'PEZ Rewards', 'wallet.epochOpen': 'Open', 'wallet.epochClaimPeriod': 'Claim Period', @@ -3616,6 +3617,22 @@ export default { 'multisigMembers.allVisible': 'All transactions visible on blockchain', 'multisigMembers.viewExplorer': 'View on Explorer', + // Multisig Operations (pending approve/reject UI) + 'multisigOps.title': 'Pending Multisig Operations', + 'multisigOps.subtitle': '{{count}} pending operations awaiting signatures', + 'multisigOps.refresh': 'Refresh', + 'multisigOps.empty': 'No pending operations right now.', + 'multisigOps.approvals': 'approvals', + 'multisigOps.proposedBy': 'Proposed by', + 'multisigOps.youApproved': 'You already approved this operation', + 'multisigOps.unknownCallHint': "This call couldn't be automatically identified from its hash alone - paste the known call data below to decode and verify it.", + 'multisigOps.pasteCallData': 'Paste call data (0x...)', + 'multisigOps.decode': 'Decode', + 'multisigOps.approve': 'Approve', + 'multisigOps.reject': 'Reject', + 'multisigOps.thresholdNote': '{{threshold}} of {{total}} signatures are required to execute any operation - no single signer, including this app, can move funds alone.', + 'multisigOps.backToWallet': 'Back to Wallet', + // Batch 12: Pallets Grid 'palletsGrid.title': 'Core Runtime Pallets', 'palletsGrid.description': "Modular blockchain components powering PezkuwiChain's advanced features", @@ -3690,7 +3707,8 @@ export default { 'bridge.withdrawStep4': 'Receive USDT to your specified address', 'bridge.wusdtAmount': 'wUSDT Amount', 'bridge.max': 'Max:', - 'bridge.withdrawAddress': 'Withdrawal Address (Bank Account or Crypto Address)', + 'bridge.withdrawAddress': 'USDT Destination (Polkadot Asset Hub)', + 'bridge.withdrawAddressAutoNote': 'Automatically derived from your connected account - USDT is always released to the same underlying key, re-encoded for Polkadot.', 'bridge.addressPlaceholder': 'Bank account or crypto address', 'bridge.withdrawTier': 'Withdrawal tier:', 'bridge.securityDelay': 'Security delay:', @@ -3699,7 +3717,7 @@ export default { 'bridge.insufficientBalance': 'Insufficient wUSDT balance', 'bridge.noAddress': 'Please enter withdrawal address', 'bridge.depositSuccess': 'Deposit request for {{amount}} USDT created. Please follow the instructions to complete the deposit.', - 'bridge.withdrawSuccess': 'Withdrawal request submitted! wUSDT burned. USDT will be sent to {{address}} after {{delay}}.', + 'bridge.withdrawSuccess': 'Withdrawal request submitted! Your wUSDT has been sent to the bridge for review. Once the multisig signers approve, USDT will be released to {{address}} (expected within {{delay}}).', // Batch 12: Add Token Modal 'addToken.title': 'Add Custom Token', diff --git a/web/src/i18n/locales/fa.ts b/web/src/i18n/locales/fa.ts index 987869b4..0122e113 100644 --- a/web/src/i18n/locales/fa.ts +++ b/web/src/i18n/locales/fa.ts @@ -1882,6 +1882,7 @@ export default { 'wallet.send': 'ارسال', 'wallet.receive': 'دریافت', 'wallet.history': 'تاریخچه', + 'wallet.multisigOperations': 'عملیات چندامضایی', 'wallet.pezRewards': 'پاداش‌های PEZ', 'wallet.epochOpen': 'باز', 'wallet.epochClaimPeriod': 'دوره مطالبه', @@ -3365,6 +3366,22 @@ export default { 'multisigMembers.allVisible': 'تمام تراکنش‌ها روی بلاکچین قابل مشاهده هستند', 'multisigMembers.viewExplorer': 'مشاهده در مرورگر', + // عملیات چندامضایی (رابط تأیید/رد در انتظار) + 'multisigOps.title': 'عملیات چندامضایی در انتظار', + 'multisigOps.subtitle': '{{count}} عملیات در انتظار امضا', + 'multisigOps.refresh': 'بازخوانی', + 'multisigOps.empty': 'در حال حاضر عملیاتی در انتظار نیست.', + 'multisigOps.approvals': 'تأیید', + 'multisigOps.proposedBy': 'پیشنهاددهنده', + 'multisigOps.youApproved': 'شما قبلاً این عملیات را تأیید کرده‌اید', + 'multisigOps.unknownCallHint': 'این فراخوان تنها از روی هش قابل شناسایی خودکار نبود - داده فراخوان شناخته‌شده را در زیر بچسبانید تا رمزگشایی و راستی‌آزمایی شود.', + 'multisigOps.pasteCallData': 'داده فراخوان را بچسبانید (0x...)', + 'multisigOps.decode': 'رمزگشایی', + 'multisigOps.approve': 'تأیید', + 'multisigOps.reject': 'رد', + 'multisigOps.thresholdNote': 'برای اجرای هر عملیات {{threshold}} امضا از {{total}} امضا لازم است - هیچ امضاکننده‌ای به‌تنهایی، از جمله همین برنامه، نمی‌تواند وجوه را جابه‌جا کند.', + 'multisigOps.backToWallet': 'بازگشت به کیف پول', + // Batch 12: Pallets Grid 'palletsGrid.title': 'پالت‌های اصلی Runtime', 'palletsGrid.description': 'اجزای ماژولار بلاکچین که ویژگی‌های پیشرفته PezkuwiChain را تقویت می‌کنند', @@ -3439,7 +3456,8 @@ export default { 'bridge.withdrawStep4': 'USDT را در آدرس مشخص شده خود دریافت کنید', 'bridge.wusdtAmount': 'مبلغ wUSDT', 'bridge.max': 'حداکثر:', - 'bridge.withdrawAddress': 'آدرس برداشت (حساب بانکی یا آدرس کریپتو)', + 'bridge.withdrawAddress': 'مقصد USDT (Polkadot Asset Hub)', + 'bridge.withdrawAddressAutoNote': 'به‌طور خودکار از حساب متصل شما استخراج شده است - USDT همیشه به همان کلید، با رمزگذاری مجدد برای Polkadot، آزاد می‌شود.', 'bridge.addressPlaceholder': 'حساب بانکی یا آدرس کریپتو', 'bridge.withdrawTier': 'سطح برداشت:', 'bridge.securityDelay': 'تأخیر امنیتی:', @@ -3448,7 +3466,7 @@ export default { 'bridge.insufficientBalance': 'موجودی wUSDT کافی نیست', 'bridge.noAddress': 'لطفاً آدرس برداشت وارد کنید', 'bridge.depositSuccess': 'درخواست واریز {{amount}} USDT ایجاد شد. دستورالعمل‌ها را برای تکمیل واریز دنبال کنید.', - 'bridge.withdrawSuccess': 'درخواست برداشت ارسال شد! wUSDT سوزانده شد. USDT بعد از {{delay}} به {{address}} ارسال خواهد شد.', + 'bridge.withdrawSuccess': 'درخواست برداشت ثبت شد! wUSDT شما برای بررسی به پل ارسال شد. پس از تأیید امضاکنندگان چندامضایی، USDT به {{address}} آزاد خواهد شد (تخمینی طی {{delay}}).', // Batch 12: Add Token 'addToken.title': 'افزودن توکن سفارشی', diff --git a/web/src/i18n/locales/kmr.ts b/web/src/i18n/locales/kmr.ts index 6ea82c4a..b43b2592 100644 --- a/web/src/i18n/locales/kmr.ts +++ b/web/src/i18n/locales/kmr.ts @@ -1677,6 +1677,7 @@ export default { 'wallet.send': 'Bişîne', 'wallet.receive': 'Werbigire', 'wallet.history': 'Dîrok', + 'wallet.multisigOperations': 'Operasyonên Multisig', 'wallet.pezRewards': 'Xelatên PEZ', 'wallet.epochOpen': 'Vekirî', 'wallet.epochClaimPeriod': 'Dema Daxwazê', @@ -3348,6 +3349,22 @@ export default { 'multisigMembers.allVisible': 'Hemû danûstendin li ser blokzincîrê xuya ne', 'multisigMembers.viewExplorer': 'Li Explorer Bibîne', + // Operasyonên Multisig (navrûya erêkirin/redkirinê ya li bendê) + 'multisigOps.title': 'Operasyonên Multisig ên Li Bendê', + 'multisigOps.subtitle': '{{count}} operasyon li benda îmzeyan in', + 'multisigOps.refresh': 'Nû bike', + 'multisigOps.empty': 'Niha operasyonek li bendê tune.', + 'multisigOps.approvals': 'erêkirin', + 'multisigOps.proposedBy': 'Pêşniyar kir', + 'multisigOps.youApproved': 'Te ev operasyon berê erê kiriye', + 'multisigOps.unknownCallHint': 'Ev bang tenê ji hasha wê nehat naskirin - ji bo vekodkirin û piştrastkirinê daneya bangê ya naskirî li jêr pêve bike.', + 'multisigOps.pasteCallData': 'Daneya bangê pêve bike (0x...)', + 'multisigOps.decode': 'Vekode', + 'multisigOps.approve': 'Erê bike', + 'multisigOps.reject': 'Red bike', + 'multisigOps.thresholdNote': 'Ji bo pêkanîna her operasyonê {{threshold}} ji {{total}} îmzeyan pêwîst e - tu îmzekar bi tenê, tevî vê sepanê jî, nikare fonan bilivîne.', + 'multisigOps.backToWallet': 'Vegere Berîkê', + // Batch 12: Pallets Grid 'palletsGrid.title': 'Paletên Bingehîn ên Runtime', 'palletsGrid.description': 'Hêmanên blokzincîrê yên modular ku taybetmendiyên pêşketî yên PezkuwiChain hêz didin', @@ -3422,7 +3439,8 @@ export default { 'bridge.withdrawStep4': 'USDT li navnîşana xwe ya diyarkirî bistînin', 'bridge.wusdtAmount': 'Mîqdara wUSDT', 'bridge.max': 'Herî zêde:', - 'bridge.withdrawAddress': 'Navnîşana Derxistinê (Hesabê Bankê an Navnîşana Krîpto)', + 'bridge.withdrawAddress': 'Cihê USDT (Polkadot Asset Hub)', + 'bridge.withdrawAddressAutoNote': 'Bixweber ji hesabê te yê girêdayî hat wergirtin - USDT her tim ji heman mifteyê re, ku ji bo Polkadot ji nû ve hatiye kodkirin, tê şandin.', 'bridge.addressPlaceholder': 'Hesabê bankê an navnîşana krîpto', 'bridge.withdrawTier': 'Kademeya derxistinê:', 'bridge.securityDelay': 'Derengiya ewlehiyê:', @@ -3431,7 +3449,7 @@ export default { 'bridge.insufficientBalance': 'Balansa wUSDT têr nake', 'bridge.noAddress': 'Ji kerema xwe navnîşana derxistinê binivîsin', 'bridge.depositSuccess': 'Daxwaza depokirinê ya {{amount}} USDT hat afirandin. Ji bo temamkirina depokirinê rêwerzan bişopînin.', - 'bridge.withdrawSuccess': 'Daxwaza derxistinê hat şandin! wUSDT hat şewitandin. USDT dê piştî {{delay}} ji {{address}} re bê şandin.', + 'bridge.withdrawSuccess': 'Daxwaza derxistinê hat şandin! wUSDTya te ji bo lêkolînê ji pirê re hat şandin. Piştî ku îmzekarên multisig erê bikin, USDT dê ji {{address}} re bê şandin (texmînî di nav {{delay}} de).', // Batch 12: Add Token 'addToken.title': 'Tokenê Taybet Zêde Bike', diff --git a/web/src/i18n/locales/tr.ts b/web/src/i18n/locales/tr.ts index 96153a9d..cfd39ed8 100644 --- a/web/src/i18n/locales/tr.ts +++ b/web/src/i18n/locales/tr.ts @@ -1671,6 +1671,7 @@ export default { 'wallet.send': 'Gönder', 'wallet.receive': 'Al', 'wallet.history': 'Geçmiş', + 'wallet.multisigOperations': 'Multisig İşlemleri', 'wallet.pezRewards': 'PEZ Ödülleri', 'wallet.epochOpen': 'Açık', 'wallet.epochClaimPeriod': 'Talep Dönemi', @@ -3351,6 +3352,22 @@ export default { 'multisigMembers.allVisible': 'Tüm işlemler blokzincirde görünür', 'multisigMembers.viewExplorer': 'Explorer\'da Görüntüle', + // Multisig Operations (bekleyen onay/red arayüzü) + 'multisigOps.title': 'Bekleyen Multisig İşlemleri', + 'multisigOps.subtitle': '{{count}} işlem imza bekliyor', + 'multisigOps.refresh': 'Yenile', + 'multisigOps.empty': 'Şu anda bekleyen işlem yok.', + 'multisigOps.approvals': 'onay', + 'multisigOps.proposedBy': 'Öneren', + 'multisigOps.youApproved': 'Bu işlemi zaten onayladın', + 'multisigOps.unknownCallHint': 'Bu çağrı sadece hash\'inden otomatik tespit edilemedi - çözmek ve doğrulamak için bilinen çağrı verisini aşağıya yapıştır.', + 'multisigOps.pasteCallData': 'Çağrı verisini yapıştır (0x...)', + 'multisigOps.decode': 'Çöz', + 'multisigOps.approve': 'Onayla', + 'multisigOps.reject': 'Reddet', + 'multisigOps.thresholdNote': 'Herhangi bir işlemin yürütülmesi için {{total}} imzacıdan {{threshold}} tanesinin onayı gerekir - bu uygulama dahil hiçbir tek imzacı tek başına fon hareket ettiremez.', + 'multisigOps.backToWallet': 'Cüzdana Dön', + // Batch 12: Pallets Grid 'palletsGrid.title': 'Çekirdek Runtime Palet\'leri', 'palletsGrid.description': 'PezkuwiChain\'in gelişmiş özelliklerini destekleyen modüler blokzincir bileşenleri', @@ -3425,7 +3442,8 @@ export default { 'bridge.withdrawStep4': 'Belirttiğiniz adrese USDT alın', 'bridge.wusdtAmount': 'wUSDT Miktarı', 'bridge.max': 'Maks:', - 'bridge.withdrawAddress': 'Çekim Adresi (Banka Hesabı veya Kripto Adresi)', + 'bridge.withdrawAddress': 'USDT Hedef Adresi (Polkadot Asset Hub)', + 'bridge.withdrawAddressAutoNote': 'Bağlı hesabından otomatik türetildi - USDT her zaman aynı anahtarın Polkadot için yeniden kodlanmış haline gönderilir.', 'bridge.addressPlaceholder': 'Banka hesabı veya kripto adresi', 'bridge.withdrawTier': 'Çekim kademesi:', 'bridge.securityDelay': 'Güvenlik gecikmesi:', @@ -3434,7 +3452,7 @@ export default { 'bridge.insufficientBalance': 'Yetersiz wUSDT bakiyesi', 'bridge.noAddress': 'Lütfen çekim adresi girin', 'bridge.depositSuccess': '{{amount}} USDT yatırma talebi oluşturuldu. Yatırmayı tamamlamak için talimatları takip edin.', - 'bridge.withdrawSuccess': 'Çekim talebi gönderildi! wUSDT yakıldı. USDT {{delay}} sonra {{address}} adresine gönderilecek.', + 'bridge.withdrawSuccess': 'Çekim talebi gönderildi! wUSDT\'niz köprüye incelenmek üzere gönderildi. Multisig imzacıları onayladıktan sonra USDT {{address}} adresine (tahmini {{delay}} içinde) gönderilecek.', // Batch 12: Add Token 'addToken.title': 'Özel Token Ekle', diff --git a/web/src/pages/WalletDashboard.tsx b/web/src/pages/WalletDashboard.tsx index 6188ba0f..c45fa270 100644 --- a/web/src/pages/WalletDashboard.tsx +++ b/web/src/pages/WalletDashboard.tsx @@ -12,6 +12,8 @@ import { ArrowUpRight, ArrowDownRight, History, ArrowLeft, RefreshCw, Coins, Loa import { toast } from 'sonner'; import { getSigner } from '@/lib/get-signer'; import { getPezRewards, recordTrustScore, claimPezReward, type PezRewardInfo } from '@pezkuwi/lib/scores'; +import { isMultisigMember, BRIDGE_MULTISIG_SPECIFIC_ADDRESSES } from '@pezkuwi/lib/multisig'; +import { ShieldCheck } from 'lucide-react'; interface Transaction { blockNumber: number; @@ -38,6 +40,27 @@ const WalletDashboard: React.FC = () => { const [pezRewards, setPezRewards] = useState(null); const [isRecordingScore, setIsRecordingScore] = useState(false); const [isClaimingReward, setIsClaimingReward] = useState(false); + const [isMultisigSigner, setIsMultisigSigner] = useState(false); + + // Only show the multisig operations shortcut to the 5 real USDT bridge signatories - a + // decorative check here (the route itself is the real gate via ProtectedRoute). + useEffect(() => { + if (!api || !isApiReady || !selectedAccount) { + setIsMultisigSigner(false); + return; + } + let cancelled = false; + isMultisigMember(api, selectedAccount.address, BRIDGE_MULTISIG_SPECIFIC_ADDRESSES) + .then((result) => { + if (!cancelled) setIsMultisigSigner(result); + }) + .catch(() => { + if (!cancelled) setIsMultisigSigner(false); + }); + return () => { + cancelled = true; + }; + }, [api, isApiReady, selectedAccount]); // Fetch recent transactions (limited to last 10 blocks for performance) const fetchRecentTransactions = async () => { @@ -423,6 +446,19 @@ const WalletDashboard: React.FC = () => { + {/* Multisig Operations shortcut - only visible to the 5 real USDT bridge + signatories (route itself is the real gate; this is just discoverability) */} + {isMultisigSigner && ( + + )} + {/* PEZ Rewards Card */} {pezRewards && (
diff --git a/web/src/pages/social/KurdMediaPage.tsx b/web/src/pages/social/KurdMediaPage.tsx index 9b42faa9..84e64437 100644 --- a/web/src/pages/social/KurdMediaPage.tsx +++ b/web/src/pages/social/KurdMediaPage.tsx @@ -30,9 +30,9 @@ const MEDIA_CHANNELS: MediaChannel[] = [ ]; const SOCIAL_PLATFORMS: SocialPlatform[] = [ - { id: 'telegram', name: 'Telegram', icon: '✈️', url: 'https://t.me/pezkuwichain', color: '#0088CC' }, + { id: 'telegram', name: 'Telegram', icon: '✈️', url: 'https://t.me/kurdishmedya', color: '#0088CC' }, { id: 'discord', name: 'Discord', icon: '💬', url: 'https://discord.gg/Y3VyEC6h8W', color: '#5865F2' }, - { id: 'twitter', name: 'X', icon: '🐦', url: 'https://twitter.com/pezkuwichain', color: '#1DA1F2' }, + { id: 'twitter', name: 'X', icon: '🐦', url: 'https://x.com/bizinikiwi', color: '#1DA1F2' }, { id: 'facebook', name: 'Facebook', icon: '📘', url: 'https://www.facebook.com/profile.php?id=61582484611719', color: '#1877F2' }, { id: 'medium', name: 'Medium', icon: '📝', url: 'https://medium.com/@pezkuwichain', color: '#555555' }, { id: 'github', name: 'GitHub', icon: '💻', url: 'https://github.com/pezkuwichain', color: '#333333' },