Merge pull request #22 from pezkuwichain/ci/backend-deploy-guard
ci(supabase): ownership gate for shared edge functions + complete 6-locale copy
@@ -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)"
|
||||
|
||||
|
After Width: | Height: | Size: 794 KiB |
|
Before Width: | Height: | Size: 5.0 MiB After Width: | Height: | Size: 3.7 MiB |
|
Before Width: | Height: | Size: 268 KiB |
|
After Width: | Height: | Size: 512 KiB |
|
After Width: | Height: | Size: 550 KiB |
|
After Width: | Height: | Size: 6.2 MiB |
|
After Width: | Height: | Size: 5.9 MiB |
|
Before Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 158 KiB |
|
After Width: | Height: | Size: 666 KiB |
|
After Width: | Height: | Size: 291 KiB |
|
After Width: | Height: | Size: 698 KiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 153 KiB |
|
After Width: | Height: | Size: 386 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 85 KiB |
@@ -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': 'إضافة رمز مخصص',
|
||||
|
||||
@@ -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': 'زیادکردنی تۆکنی تایبەت',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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': 'افزودن توکن سفارشی',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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' },
|
||||
|
||||