آدرسهای EIP-55، Bitcoin، TRON و Solana را اعتبارسنجی کنید و شکل درست چکسامدار را ببینید.
بازرسی درخواست امضای کیف پول
خود ابزار به زبان انگلیسی است؛ این صفحه آن را به زبان شما توضیح میدهد.
از بازرسی درخواست امضای کیف پول استفاده کنید
کارکرد
آنچه را کیف پول یا یک سایت از شما میخواهد امضا کنید بچسبانید و به زبان ساده ببینید چه چیزی را مجاز میکند. مجوزهای توکن (approval)، permitها، امضاهای Permit2 و فهرستگذاریهای Seaport که به شخص دیگری پرداخت میکنند با رنگ قرمز مشخص میشوند.
این کاملاً در مرورگر شما اجرا میشود: هیچیک از اطلاعاتی که وارد میکنید بارگذاری نمیشود.
چگونه از بازرسی درخواست امضای کیف پول استفاده کنیم
- درخواست خام را کپی کنید. متن دقیقی را که از شما خواسته شده امضا کنید بردارید: JSON مربوط به EIP-712، دادهٔ 0x یک تراکنش، کل شیء تراکنش، یک درخواست JSON-RPC یا متن پیام.
- بچسبانید و بررسی کنید. آن را در کادر بچسبانید. بررسی با چسباندن شروع میشود؛ همچنین میتوانید دکمهٔ Inspect (بررسی) یا Ctrl+Enter را بزنید.
- ببینید ورودی چگونه خوانده شده است. خط اول میگوید ورودی به چه شکلی خوانده شده است، مثلاً transaction object. اگر اشتباه است، نوع درست را در Read the input as (خواندن ورودی بهعنوان) انتخاب کنید.
- کادر رنگی را بخوانید. نشان، عنوان و خلاصه به زبان ساده میگویند امضا کردن چه اجازهای میدهد. فهرست زیر آن هشدارها را نشان میدهد؛ جدیترینها پررنگاند.
- فیلدها را بررسی کنید. در جدول به spender یا operator، توکن، مقدار، انقضا و زنجیره نگاه کنید. برای دیدن مقادیر خام، Decoded arguments یا Message fields را باز کنید.
- تصمیم بگیرید و به اشتراک بگذارید. اگر spender را نمیشناسید، درخواست را در کیف پول خود رد کنید و آدرسها را در یک block explorer جستجو کنید. Copy report (کپی گزارش) یک خلاصهٔ متنی ساده با لینکهای خنثیشده (defanged) میدهد.
مثال
امضای Permit2 برای سقف نامحدود USDC
{
"types": {
"EIP712Domain": [
{
"name": "name",
"type": "string"
},
{
"name": "chainId",
"type": "uint256"
},
{
"name": "verifyingContract",
"type": "address"
}
],
"PermitSingle": [
{
"name": "details",
"type": "PermitDetails"
},
{
"name": "spender",
"type": "address"
},
{
"name": "sigDeadline",
"type": "uint256"
}
],
"PermitDetails": [
{
"name": "token",
"type": "address"
},
{
"name": "amount",
"type": "uint160"
},
{
"name": "expiration",
"type": "uint48"
},
{
"name": "nonce",
"type": "uint48"
}
]
},
"primaryType": "PermitSingle",
"domain": {
"name": "Permit2",
"chainId": 1,
"verifyingContract": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
},
"message": {
"details": {
"token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"amount": "1461501637330902918203684832716283019655932542975",
"expiration": "281474976710655",
"nonce": "0"
},
"spender": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB",
"sigDeadline": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
}
}Read as: EIP-712 typed data. Change this with “Read the input as”.
DangerousPermit2 PermitSingle: token allowance by signature (UNLIMITED)
Signing lets 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB move an unlimited amount of 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (USDC token on Ethereum) out of your wallet through Permit2. The allowance never expires in practice. The spender submits this signature itself, so you will not see another prompt. Drainers favour Permit2 because many wallets have already approved Permit2 for apps such as Uniswap.
Unlimited amount: the spender can take your whole balance of the token.
The allowance never expires in practice.
The signature never expires in practice.
SPENDER 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB
TOKEN 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
USDC token on Ethereum
AMOUNT Unlimited: 2^160−1, the Permit2 maximum (1461501637330902918203684832716283019655932542975)
ALLOWANCE EXPIRES 2^48−1 (Permit2 maximum): no practical expiry (beyond the year 5000)
NONCE 0
SIGNATURE VALID UNTIL (SIGDEADLINE) 2^256−1: no practical expiry (beyond the year 5000)
DOMAIN name "Permit2"
CHAIN Ethereum (chain ID 1)
VERIFYING CONTRACT 0x000000000022D473030F116dDEE9F6B43aC78BA3
Permit2 (Uniswap)
EIP-712 DIGEST (WHAT IS SIGNED) 0x579baa31b8f7279c82034e935d103d07caa27a817903937e201389d81d55984c
DOMAIN SEPARATOR 0x866a5aba21966af95d6c7ab78eb2b2fc913915c28be3b9aa07cc04ff903e3f28
MESSAGE HASH (HASHSTRUCT) 0xb646364eb4dc82faf68b61d79beb585797490532ff745845f3821e6f8573463c
PRIMARY TYPE PermitSingle(PermitDetails details,address spender,uint256
…کادر قرمز: خرجکننده (spender) 0xbBbB…BBbB میتواند مقدار نامحدودی USDC را از طریق Permit2 جابهجا کند و نه سقف مجاز (allowance) و نه امضا منقضی نمیشود. digest مربوط به EIP-712 محاسبه میشود.
آنچه بررسی میکند
| سیگنال | معنای آن |
|---|---|
| نشان خطر: Dangerous، Check carefully، Low risk یا Note | Dangerous (خطرناک) یعنی درخواست میتواند توکنها یا NFTها را واگذار کند. مجوزها حتی برای یک برنامهٔ شناختهشده هم این نشان را میگیرند، چون اختیار دادهشده همان است. لغو مجوز، مانند approve با مقدار 0، بهصورت Low risk (کمخطر) نمایش داده میشود. |
| Spender یا operator با رنگ قرمز | آدرسی که حق جابهجایی داراییهای شما را میگیرد. چند قرارداد با نام نمایش داده میشوند، مانند Permit2، Seaport و OpenSea conduit؛ هر آدرس دیگری نیاز به بررسی دارد. |
| مقدار نامحدود | برای 2^256−1 یا هر مقدار 2^255 یا بیشتر، و در درخواستهای Permit2 برای 2^160−1 نمایش داده میشود. خرجکننده میتواند کل موجودی شما از آن توکن را، اکنون و در آینده، بردارد. |
| مقدار با اعشار توکن | برای USDC، USDT، DAI و WETH روی Ethereum عدد خام تبدیل میشود، مثلاً 1000000 به 1 USDC تبدیل میشود. برای توکنهای دیگر، عدد صحیح خام را با ۱۸ و با ۶ رقم اعشار خواندهشده میبینید. |
| انقضا و مهلت (deadline) | عملاً هرگز منقضی نمیشود (پس از سال ۵۰۰۰)، بیش از یک سال اعتبار دارد، یا قبلاً منقضی شده است. permit یا سقف مجازی که هرگز منقضی نمیشود، مدتها پس از آنکه آن را فراموش کردهاید همچنان قابل استفاده میماند. |
| امضای کور یک هش ۳۲ بایتی | کیف پول نمیتواند نشان دهد این هش نمایانگر چیست و با eth_sign ممکن است یک تراکنش یا permit باشد. فقط هشی را امضا کنید که خودتان تولید کردهاید. |
| بررسیهای سفارش Seaport | فهرستگذاری با قیمت صفر، گیرندگان دیگری که بیش از پیشنهاددهنده دریافت میکنند، یا اقلام پیشنهادی که با گیرندهٔ دیگری دوباره ظاهر میشوند: الگوی معمول فهرستگذاریهای جعلی NFT که به مهاجم پرداخت میکنند. |
| دامنه در Sign-In with Ethereum | پیام ورود، نام سایتی را که درخواست داده است میآورد. اگر آن دامنه دقیقاً همان سایتی نیست که در آن هستید، امضا ممکن است شخص دیگری را به نام شما وارد کند. |
| دو خوانش از یک selector | approve(address,uint256) در ERC-20 و ERC-721 همان فراخوانی است. مگر اینکه قرارداد یکی از معدود توکنهایی باشد که ابزار میشناسد، هر دو خوانش نمایش داده میشوند. |
نمونههای بیشتر
مجوز NFT برای کل یک کلکسیون
0xa22cb465000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000000000000000000000000000000000000000000001Read as: transaction calldata (known function selector). نشان Dangerous: setApprovalForAll: control of ALL your NFTs in this collection (کنترل همهٔ NFTهای شما در این کلکسیون). Operator 0x000000000000000000000000000000000000dEaD، Approved true، Collection (to) not given.
مجوز محدود USDC در یک تراکنش
{"to":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","data":"0x095ea7b3000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000000f4240","value":"0x0","chainId":1}Read as: transaction object. نشان Dangerous: ERC-20 approval. خلاصه میگوید 0x000000000000000000000000000000000000dEaD میتواند بدون درخواست دوباره تا 1000000 واحد از توکن USDC را روی Ethereum جابهجا کند. جدول Chain Ethereum (chain ID 1)، Value 0 ETH (0 wei) و Amount 1000000 را با یادداشت 1 USDC (6 decimals) نشان میدهد.
درخواست کور eth_sign
{"method":"eth_sign","params":["0x0000000000000000000000000000000000000001","0xabababababababababababababababababababababababababababababababab"]}Read as: JSON-RPC eth_sign request. نشان Dangerous: Blind signature: a 32-byte hash instead of text (امضای کور: یک هش ۳۲ بایتی بهجای متن)، همراه با این هشدار که بیشتر کیف پولها eth_sign را غیرفعال یا پنهان کردهاند، چون درینرها (drainer) از آن استفاده میکردند.
سوالات متداول
Signature Request Inspector چه چیزی را بررسی میکند؟
دادههای typed در EIP-712، calldata تراکنش، اشیای تراکنش و پیامهای personal_sign یا eth_sign را کدگشایی میکند و digest مربوط به EIP-712 را محاسبه میکند. مجوزهای توکن، setApprovalForAll، permitهای EIP-2612 و DAI، امضاهای Permit2، سفارشهای Seaport که به کسی غیر از شما پرداخت میکنند و امضاهای کور روی یک هش ۳۲ بایتی را علامتگذاری میکند.
آیا درخواستی که قرمز نشده هم میتواند زیانبار باشد؟
بله. ابزار فقط خود درخواست را میخواند: موجودیها، مجوزهای موجود یا مخرب بودن یک قرارداد را نمیبیند و توابعی که در جدول آن نیستند بهصورت ناشناخته نمایش داده میشوند. مجوزها برای برنامههای مشروع هم قرمز میشوند، چون امضا در هر حال همان اختیار را میدهد.
آیا درخواست چسباندهشده به جایی فرستاده میشود؟
خیر. کدگشایی و هشکردن در مرورگر شما انجام میشود و صفحه با ورودی شما هیچ درخواست شبکهای نمیفرستد. درخواست امضا هیچ رازی در خود ندارد، اما هرگز کلید خصوصی یا عبارت بازیابی (seed phrase) را در هیچ وبسایتی نچسبانید.
آیا مقدار کم، یک مجوز را امن میکند؟
مقدار قابل برداشت را به همان اندازه محدود میکند، اما خرجکننده میتواند هر زمان و بدون پرسیدن دوباره از شما از آن استفاده کند. به همین دلیل ابزار مجوز 1 USDC را هم Dangerous نشان میدهد. فقط به اندازهٔ مورد نیاز و برای خرجکنندهای که بررسی کردهاید مجوز بدهید.
چرا برای یک approve، هم خوانش ERC-20 و هم ERC-721 را میبینم؟
هر دو استاندارد از نام تابع و انواع آرگومان یکسان استفاده میکنند، پس دادهٔ 0x بهتنهایی نمیگوید کدام است. کل تراکنش را همراه با آدرس to بچسبانید و در یک block explorer بررسی کنید که آن قرارداد یک توکن است یا یک کلکسیون NFT.
درخواستی را امضا کردهام که اینجا قرمز نشان داده میشود. حالا چه کنم؟
سریع اقدام کنید. مجوزهای روی زنجیره (on-chain) را لغو کنید و باقیمانده را به یک کیف پول جدید منتقل کنید. permit امضاشدهای که هنوز استفاده نشده، بهصورت مجوز نمایش داده نمیشود، پس انتقال توکنها گام امنتری است. Emergency Guide (راهنمای اضطراری) ترتیب اقدامها را فهرست کرده است.