Есть ли способ определить, когда мой контракт получает токены? У меня нет контракта с токеном, я хочу знать только адрес и количество токенов, отправленных на мой контракт.
Если вы знаете, какой токен ожидает получить ваш контракт, вы можете прослушивать событие, 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 предназначены для таких случаев.
Джереми Гренье
Эдмунд Эдгар