⚔️ 1️⃣ permit() = الموافقة بدون الحاجة إلى إجراء معاملة

عندما تقوم بتوقيع رسالة EIP-2612 أو EIP-712، فإنك تقول:

"أسمح للعنوان X بإنفاق Y من توكناتي حتى الوقت Z."

وفقط مع هذا التوقيع (v، r، s)، يمكن للشخص الذي يمتلكه استدعاء token.permit(...)
→ على السلسلة يعادل أمر approve() فعليًا.
→ يمكنهم transferFrom() سحب توكناتك دون أن تقوم بإرسال أي معاملة.

⸻

🧨 2️⃣ كيف يستغل القراصنة

سيقوم المهاجم بإرسال نافذة منبثقة لك من MetaMask مثل:

"وقع للتحقق من المحفظة" أو "وقع الرسالة لـ dApp"

لكن في الحقيقة هو permit() أو Permit2 مع
spender = محفظة القراصنة، value = 2^256-1.

عندما تضغط "وقع" → تُعتبر توكناتك قد تمت الموافقة عليها بالكامل للقراصنة.
لا غاز. لا سجل مستكشف. لكن التوكنات لا تزال تطير 🕳️

⸻

🧩 3️⃣ سبب جعل MetaMask يجعلك تتساهل

تظهر MetaMask "وقع بيانات مكتوبة" أو "وقع للتحقق"
دون أن توضح من الذي تقوم بالتوقيع على permit() له.
هذا هو السبب في أن العديد من الأشخاص فقدوا توكناتهم دون معرفة السبب.

⸻

🧰 4️⃣ كيفية الحماية

1️⃣ انظر إلى نافذة محفظة (MetaMask / WalletConnect)
•"طلب توقيع" / "وقع" / "وقع بيانات مكتوبة" → توقف، لا توقع إذا لم تكن واضحًا
•"اتصل" / "الاتصال بالموقع" → غالبًا ما ترى فقط العنوان، أكثر أمانًا ولكن لا يزال يتعين الحذر

2️⃣ افتح تفاصيل الطلب
•اضغط على "عرض التفاصيل" / "متقدم" / النقاط الثلاث → عرض البيانات الخام
•إذا رأيت JSON يتضمن domain، types، message، primaryType → هذه هي بيانات مكتوبة EIP‑712، يجب التحقق بعناية

3️⃣ ابحث عن الكلمات الرئيسية الخطيرة في البيانات الخام
•spender، owner، value، deadline، nonce، permit، PermitSingle/Batch/Transfer → 🚩 تحذير permit/approval
•إذا كان هناك نص بسيط مثل "أوافق على الاتصال" → خطر أقل، ولكن ليس مطلقًا