Merge pull request #22 from pezkuwichain/ci/backend-deploy-guard

ci(supabase): ownership gate for shared edge functions + complete 6-locale copy
This commit is contained in:
SatoshiQaziMuhammed
2026-07-30 02:05:16 -07:00
committed by GitHub
31 changed files with 166 additions and 19 deletions
+8 -5
View File
@@ -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)"
Binary file not shown.

After

Width:  |  Height:  |  Size: 794 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 MiB

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 698 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

+20 -2
View File
@@ -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': 'إضافة رمز مخصص',
+20 -2
View File
@@ -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': 'زیادکردنی تۆکنی تایبەت',
+20 -2
View File
@@ -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',
+20 -2
View File
@@ -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': 'افزودن توکن سفارشی',
+20 -2
View File
@@ -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',
+20 -2
View File
@@ -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',
+36
View File
@@ -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<PezRewardInfo | null>(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 = () => {
</Button>
</div>
{/* Multisig Operations shortcut - only visible to the 5 real USDT bridge
signatories (route itself is the real gate; this is just discoverability) */}
{isMultisigSigner && (
<Button
onClick={() => navigate('/multisig/pending')}
variant="outline"
className="w-full border-blue-700 hover:bg-blue-900/30 flex items-center justify-center gap-2"
>
<ShieldCheck className="w-5 h-5" />
<span>{t('wallet.multisigOperations')}</span>
</Button>
)}
{/* PEZ Rewards Card */}
{pezRewards && (
<div className="bg-gray-900 border border-gray-800 rounded-lg p-6">
+2 -2
View File
@@ -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' },