Контрактное взаимодействие и пакетная транзакция с Web3

Я просмотрел почти все сообщения по этой теме, но ни один из ответов не делает именно то, что мне нужно.

У меня есть приложение, которое позволяет пользователям отправлять свои токены из своего контракта в мой «пул» по адресу моего контракта. Я хочу, чтобы внешний адрес мог запросить мой собственный контракт на отправку им этих новых токенов после того, как он заплатит комиссию ETH. Таким образом, последовательность выглядит следующим образом, например, с использованием случайных сумм:

  • Пользователь A (владелец контракта) отправляет 100 токенов со своего адреса контракта на адрес моего пула (у меня это уже работает)
  • Пользователь B (заинтересованный покупатель) нажимает кнопку в моем приложении, которая предоставит ему 20 таких токенов из моего адреса пула в обмен на сумму ETH, заранее определенную в приложении.

Я предполагаю, что мне нужно будет использовать здесь функцию пакетного добавления, чтобы выпустить токены и принять ETH, но как мне получить адрес моего пула для автоматического одобрения транзакции без моего вмешательства?

  • Примечание. Мой адрес пула может содержать несколько токенов, поэтому мне также нужно будет указать, какой токен отправляется во время транзакции.

Ответы (1)

На шаге 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.");

В случае, если вы отклоняете некоторые контракты с токенами, у вас есть дополнительные вопросы о том, что делать с токенами, которые выпадают из вашего контракта, но это немного выходит за рамки исходного вопроса.

Он не проверяет баланс вашего контракта в выбранном токене, потому что перевод не удастся, если в вашем контракте недостаточно средств. В случае сбоя транзакции отправленный эфир будет возвращен отправителю. Все в нужном месте. Были сделаны.

Надеюсь, поможет.

Если вы