Проверяйте адреса EIP-55, Bitcoin, TRON и Solana и получайте правильную форму с контрольной суммой.
Проверка запросов на подпись
Сам инструмент доступен на английском языке; на этой странице приведено его описание на вашем языке.
Используйте Проверка запросов на подпись
Для чего это нужно
Вставьте то, что кошелёк или сайт просит вас подписать, и узнайте простыми словами, что это разрешит. Разрешения на токены (approvals), 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, отклоните запрос в кошельке и проверьте адреса в обозревателе блоков. Copy report даёт текстовую сводку с обезвреженными ссылками.
Пример
Подпись 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, и ни разрешение, ни подпись не истекают. Вычисляется дайджест 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. Spender сможет забрать весь ваш баланс этого токена, сейчас и в будущем. |
| Сумма с учётом десятичных знаков токена | Для USDC, USDT, DAI и WETH в Ethereum сырое число пересчитывается, например 1000000 превращается в 1 USDC. Для других токенов показывается сырое целое число, прочитанное с 18 и с 6 знаками после запятой. |
| Срок действия и дедлайн | Фактически бессрочно (после 5000 года), действует больше года или уже истёк. Permit или разрешение, которые никогда не истекают, остаются рабочими долго после того, как вы о них забудете. |
| Слепая подпись 32-байтного хеша | Кошелёк не может показать, что стоит за хешем, а при eth_sign это может быть транзакция или permit. Подписывайте только хеш, который вы вычислили сами. |
| Проверки ордеров Seaport | Листинг по нулевой цене, другие получатели получают больше, чем предлагающий, или предложенные предметы снова появляются с другим получателем — типичные признаки поддельных NFT-листингов, которые платят злоумышленнику. |
| Домен Sign-In with Ethereum | Сообщение для входа называет сайт, который его запрашивает. Если этот домен не совпадает в точности с сайтом, на котором вы находитесь, подпись может позволить кому-то другому войти под вашим именем. |
| Два прочтения одного селектора | approve(address,uint256) — один и тот же вызов в ERC-20 и ERC-721. Если контракт не входит в число немногих токенов, известных инструменту, показываются оба прочтения. |
Еще примеры
Разрешение на NFT для всей коллекции
0xa22cb465000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000000000000000000000000000000000000000000001Read as: transaction calldata (known function selector). Dangerous: setApprovalForAll — контроль над ВСЕМИ вашими NFT в этой коллекции. Operator 0x000000000000000000000000000000000000dEaD, Approved true, Collection (to) не указан.
Ограниченное разрешение на 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 — 32-байтный хеш вместо текста, с пометкой, что большинство кошельков отключили или скрыли eth_sign, потому что его использовали дрейнеры.
Часто задаваемые вопросы
Что проверяет Signature Request Inspector?
Он декодирует typed data EIP-712, calldata транзакций, объекты транзакций и сообщения personal_sign или eth_sign и вычисляет дайджест EIP-712. Он отмечает разрешения на токены, setApprovalForAll, permit по EIP-2612 и DAI, подписи Permit2, ордера Seaport, которые платят не вам, и слепые подписи 32-байтного хеша.
Может ли запрос, не отмеченный красным, всё равно быть вредным?
Да. Инструмент читает только сам запрос: он не видит балансы и существующие разрешения и не знает, вредоносен ли контракт, а функции вне его таблицы показываются как неизвестные. Разрешения для законных приложений тоже отмечаются красным, потому что подпись в любом случае даёт те же полномочия.
Отправляется ли вставленный запрос куда-нибудь?
Нет. Декодирование и хеширование выполняются в вашем браузере, и страница не делает сетевых запросов с вашими данными. Запрос на подпись не содержит секретов, но никогда не вставляйте приватный ключ или сид-фразу ни на один сайт.
Делает ли маленькая сумма разрешение безопасным?
Она ограничивает то, что можно забрать, этой суммой, но spender может воспользоваться разрешением в любой момент, не спрашивая вас снова. Поэтому инструмент всё равно показывает разрешение на 1 USDC как Dangerous. Разрешайте только нужную сумму и только проверенному spender.
Почему для одного approve показываются прочтения ERC-20 и ERC-721?
Оба стандарта используют одинаковое имя функции и типы аргументов, поэтому по одним данным 0x нельзя понять, какой это стандарт. Вставьте всю транзакцию с адресом to и проверьте в обозревателе блоков, является ли этот контракт токеном или NFT-коллекцией.
Я уже подписал запрос, который здесь отмечен красным. Что делать?
Действуйте быстро. Отзовите ончейн-разрешения и переведите то, что осталось, на новый кошелёк. Подписанный, но ещё не использованный permit не отображается как разрешение, поэтому перевод токенов — более надёжный шаг. Порядок действий описан в экстренном руководстве (Emergency Guide).