Обнаружить транзакцию токена к контракту

Есть ли способ определить, когда мой контракт получает токены? У меня нет контракта с токеном, я хочу знать только адрес и количество токенов, отправленных на мой контракт.

Ответы (1)

Если вы знаете, какой токен ожидает получить ваш контракт, вы можете прослушивать событие, Transferвыдаваемое контрактом токена. (Не ваш контракт!)

Стандартное событие ERC20 Transfer выглядит так:

event Transfer(address indexed _from, address indexed _to, uint _value);

... так что слушайте контракт токена для события, где _toнаходится адрес вашего контракта.

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

Вышеупомянутый подход работает только для процесса вне блокчейна, который может прослушивать журналы. Чаще всего это код JavaScript, использующий функции watchи listenвweb3.js. Если вы хотите, чтобы ваш код контракта Solidity отвечал на перевод ERC 20, вам, вероятно, не повезло; Стандартный токен ERC20 не вызовет для вас код вашего контракта, как обычный перевод ETH. Теоретически вы могли бы побудить кого-то прослушать события и отправить транзакцию для передачи этой информации в ваш контракт, возможно, с доказательством Меркла, чтобы показать, что они действительно видели то, что предлагают в журналах, но это не будет быть тривиальным сделать. В качестве альтернативы вы можете настроить рабочий процесс таким образом, чтобы пользователь вызывал ваш контракт, чтобы выполнить транзакцию, а ваш контракт, в свою очередь, вызывал контракт токена; Таким образом, ваш контракт знает о передаче, потому что он сам руководил передачей. и approve_transferFromметоды в стандарте ERC20 предназначены для таких случаев.

Спасибо за ваш ответ. Я так и думал. К сожалению, я хочу, чтобы контракт был полностью децентрализован, а контракт с токеном не реализовывался.
Еще один вариант может состоять в том, чтобы обернуть исходный контракт токена более продвинутым прокси-контрактом, который реализует утверждение, или другой код, который вам нужен. Однако вам придется заставить своих пользователей использовать ваш прокси-контракт.