Функция ApproveAndCall для ERC20
В виду одной из известных проблем стандарта ERC20 EventHandling в контракте токена нет функции обработки получения токенов, Смарт-Контракт не сможет зафиксировать сколько, когда и от кого токенов поступило. Это приводит к безвозвратной потере огромного количества денежных средств.
Так как на контракты нельзя было высылать токены напрямую, для правильной работы было необходимо делать это в 2 шага: Approve и TransferFrom. Approve – означает одобрить определенное количество токенов для вывода определенному кошельку. TransferFrom – означает осуществить перевод одобренных к выводу токенов.
Получается следующий набор действий:
1) Держатель токенов вызывает Approve своих токенов на адрес смарт контракт.
2) Держатель токенов вызывает функцию в контракте, внутри которой осуществляется TransferFrom на адрес контракта и полученные токены успешно обрабатываются контрактом.
Как видите все довольно запутанно и осуществляется только в две транзакции. Решением проблемы работы со Смарт-Контрактами же стало внедрение функции ApproveAndCall в ERC20 токены.
Дополнительная функция ApproveAndCall позволяет упростить вышеописанный порядок действий и оставить только 1 транзакцию: Вызов функции ApproveAndCall внутри которой произойдет как Approve токенов так и transferFrom.
Пример реализации функции ApproveAndCall в коде:
Interface ApproveAndCallFallBack { function receiveApproval(address from, uint256 amount, address token, bytes data) external; } ... function approveAndCall(address spender, uint256 amount, bytes calldata extraData) external returns (bool) { require(approve(spender, amount)); ApproveAndCallFallBack(spender).receiveApproval(msg.sender, amount, address(this), extraData); return true; } ...
Итого для отсылки токенов на Смарт-Контракт требуется чтобы контракт имел функцию receiveApproval. Транзакция происходит в один шаг: вызов функции approveAndCall в контракте токена с адресом Смарт-Контракта куда средства отправляются (spender), количеством отправляемых токенов (amount) и дополотительными данными, если требуются (extraData).
Если у вас остались вопросы или вас интересует разработка/аудит Смарт-Контрактов, свяжитесь с нами и мы проконсультируем вас по всем вопросам.
С уважением, Grox Solutions.