# Что такое апрувы токенов (Token Approvals)?

Апрувы токенов (token approvals) используются для того, чтобы дать смарт-контракту разрешение тратить ваши токены от вашего имени. Это общая схема, используемая DEX-биржами, протоколами кредитования и другими Dapp-приложениями. Например, если вы хотите торговать своими токенами на децентрализованной бирже (DEX), вам нужно будет дать бирже разрешение на обмен этих токенов от вашего имени.

Апрувы токенов также используются с NFT. Например, если вы хотите продать свой NFT на торговой площадке, вам нужно будет дать торговой площадке разрешение на передачу NFT от вашего имени. Или если вы хотите использовать свой NFT в качестве залога для получения кредита (loan), вам нужно будет дать протоколу кредитования (lending protocol) разрешение на передачу NFT от вашего имени.

### Как работают апрувы токенов (Token Approvals)?

В большинстве смарт-контрактов \[взаимозаменяемых токенов] (/learn/basics/what-are-tokens) и \[NFT] (/learn/basics/what-are-nfts) есть структура *mapping*, при помощи которой отслеживаются все разрешения, которые выдал пользователь, а также кому и на какой объём. Каждый раз, когда вы предоставляете или отменяете одно из этих разрешений, *mapping* обновляется.

Когда контракт пытается потратить ваши токены от вашего имени, смарт-контракт токена проверяет *mapping*, чтобы узнать, есть ли у тратящего разрешение на трату токенов. Если да, то токены тратятся. Если нет, транзакция не проходит.

#### Апрувы взаимозаменяемых (fungible) токенов

Во взаимозаменяемых (fungible) токенах смарт-контракты содержат функцию `approve()`, позволяющую дать разрешение другому адресу потратить ваши токены от вашего имени. Эта функция принимает два параметра: адрес расходующего и количество токенов. Отмена разрешения осуществляется путем повторного вызова функции `approve()` с теми же параметрами, но с суммой, равной 0.

Например, если вы хотите дать разрешение децентрализованной бирже (DEX) потратить 1000 USDC от вашего имени, вы должны вызвать `approve()` следующим образом:

![Approve USDC](https://revoke.cash/assets/images/learn/approvals/what-are-token-approvals/erc20-approve.png)

#### NFT Апрувы (Approvals)

Для NFT существует два различных типа апрувов: ограниченное и неограниченное. Ограниченные разрешения (Limited approvals) используются для того, чтобы дать смарт-контракту разрешение на передачу конкретного NFT (с определенным id). Неограниченные разрешения (Unlimited approvals) используются для предоставления смарт-контракту разрешения на передачу любого вашего NFT. Ограниченные разрешения могут быть предоставлены только одному адресу за раз, и поэтому большинство NFT-маркетплейсов используют неограниченные разрешения.

**Ограниченные апрувы NFT (Limited Approvals)**

Для ограниченных апрувов NFT контракты содержат функцию `approve()`, позволяющую дать разрешение другому адресу на перевод определенного NFT от вашего имени. Эта функция принимает два параметра: адрес отправителя и id нужного NFT. Отзыв апрува осуществляется повторным вызовом функции `approve()` с теми же параметрами, но с указанием адреса отправителя `0x000...`. Этот вид апрува также автоматически отменяется при переводе.

Например, если вы хотите дать разрешение OpenSea на передачу вашего Pudgy Penguin с ID 4420 от вашего имени, вы должны вызвать `approve()` следующим образом:

![Approve Pudgy Penguins 4420](https://revoke.cash/assets/images/learn/approvals/what-are-token-approvals/erc721-approve.png)

**Неограниченные апрувы NFT (Unlimited Approvals)**

Для неограниченного количества апрувов NFT-контракты содержат функцию `setApprovalForAll()`, позволяющую дать разрешение другому адресу на перевод любого NFT из кошелька от вашего имени. Эта функция принимает два параметра: адрес отправителя и значение true/false. Апрув осуществляется вызовом функции `setApprovalForAll()` с параметром `true`, а отзыв - с параметром `false`.

Например, если вы хотите дать апрув OpenSea на передачу любого вашего NFT от вашего имени, вы должны вызвать `setApprovalForAll()` следующим образом:

![Approve All Pudgy Penguins](https://revoke.cash/assets/images/learn/approvals/what-are-token-approvals/erc721-setApprovalForAll.png)

#### Апрувы полувзаимозаменяемых токенов (Semi-Fungible)

Полувзаимозаменяемые (Semi-Fungible) токены - это особый тип NFT, который может использоваться для представления нескольких копий одного и того же актива. Как вы можете понять, эти токены имеют много общего с NFT, поэтому их система апрувов также выглядит очень похоже. Самое большое различие заключается в том, что у semi-fungible токенов есть функция `setApprovalForAll()`, но нет функции `approve()`.

### Риски при апруве токенов (Token Approvals)

Апрувы токенов - это ключевая часть экосистемы смарт-контрактов. Без них многие DeFi приложения были бы нежизнеспособны. Но есть и риски, связанные с апрувами токенов. Если вы даете смарт-контракту разрешение тратить ваши токены, он может потратить их в любой момент. Поэтому если смарт-контракт взломают или он будет атакован, ваши токены могут быть украдены.

#### Эксплойты смарт-контрактов

Один из рисков при апруве токенов заключается в том, что смарт-контракт, которому вы даете апрув, может быть взломан. Даже достаточно популярные проекты могут стать жертвой взлома, как мы видели в случае с [SushiSwap эксплойтом](https://revoke.cash/ru/exploits/sushiswap) в апреле 2023 года. В таких случаях хакеры могут украсть токены из вашего кошелька, если вы давали какие-либо разрешения взломанному смарт-контракту.

Чтобы предупредить такие ситуации, мы создали [обозреватель эксплойтов](https://revoke.cash/ru/exploits), который содержит список известных эксплойтов для смарт-контрактов. Вы можете использовать этот инструмент, чтобы проверить, есть ли у вас активные одобрения во взломанных смарт-контрактах.

#### Скам и фишинг-атаки

Помимо взлома настоящих проектов, в крипте также существует множество мошеннических и фишинговых атак. Скамеры часто используют апрувы, чтобы украсть ваши деньги. К числу распространенных фишингов, использующих апрувы, относятся:

1. **Прямой апрув скамеру**: Скамер обманом заставляет вас апрувнуть смарт-контракт, который он контролирует, что позволяет ему забрать деньги непосредственно из вашего кошелька.
2. **Размещение объявлений на NFT-маркетплейсе**: Скамер обманом заставит вас апрувнуть подпись, в которой ваши активы выставлены на продажу на NFT-маркетплейсе за 0 ETH, что позволит ему "купить" ваши NFT за 0 ETH.
