Я просмотрел почти все сообщения по этой теме, но ни один из ответов не делает именно то, что мне нужно.
У меня есть приложение, которое позволяет пользователям отправлять свои токены из своего контракта в мой «пул» по адресу моего контракта. Я хочу, чтобы внешний адрес мог запросить мой собственный контракт на отправку им этих новых токенов после того, как он заплатит комиссию ETH. Таким образом, последовательность выглядит следующим образом, например, с использованием случайных сумм:
Я предполагаю, что мне нужно будет использовать здесь функцию пакетного добавления, чтобы выпустить токены и принять ETH, но как мне получить адрес моего пула для автоматического одобрения транзакции без моего вмешательства?
На шаге 1 пользователь просто переходит на ваш контракт в контракте токена ERC20. Ваш контракт даже не знает, что этот перевод имел место.
На шаге 2 пользователь покупает некоторый токен X из вашего контракта по определенной цене, и ваш контракт отправляет токены, если в контракте их достаточно, или транзакция завершается неудачно, и средства возвращаются пользователю, чего вы и хотите.
function(SafeERC20 token, uint amount) public payable {
require(msg.value == amount); // price is 1:1 in the example
// emit an event
token.safeTransfer(msg.sender, amount);
}
Вот об этом. Используйте реализацию openZeppelin SafeERC20 для важной защиты, поскольку она позволяет пользователю передать ненадежный адрес контракта . Более того, внесите контракты токенов в белый список, чтобы вы могли отклонять подозрительные реализации и одобрять только реализации с хорошим поведением.
mapping(SafeERC20 => bool) public isApproved;
require(isApproved[token], "Not an approved token.");
В случае, если вы отклоняете некоторые контракты с токенами, у вас есть дополнительные вопросы о том, что делать с токенами, которые выпадают из вашего контракта, но это немного выходит за рамки исходного вопроса.
Он не проверяет баланс вашего контракта в выбранном токене, потому что перевод не удастся, если в вашем контракте недостаточно средств. В случае сбоя транзакции отправленный эфир будет возвращен отправителю. Все в нужном месте. Были сделаны.
Надеюсь, поможет.
Если вы