Может ли смарт-контракт знать, какой адрес отправил ему токен ERC20?

Я хочу иметь возможность отправлять токен ERC20 на смарт-контракт и иметь возможность отслеживать, с какого адреса отправлен токен ERC20 и на какую сумму. Например, адрес отправляет токены X в смарт-контракт, и после того, как они осуществят передачу, адрес теперь может запустить функцию в смарт-контракте, чтобы зарегистрировать доменное имя. Указанная функция не сможет работать без депозита токена ERC20. Обратите внимание, что есть два вызова смарт-контракта: один для передачи токенов и один для смарт-контракта, получающего токен ERC20.

Когда я читаю код смарт-контракта ERC20 Solidity, я вижу сопоставление балансов. Я не понимаю, как я могу отслеживать, кто какие суммы отправил.

вы имеете в виду, что у вас есть контракт, и вы хотите, чтобы контракт получал платежи, верно? Ваша проблема заключается в том, что когда кто-то отправляет токены, ваш контракт не может знать, потому что ваш контракт не получает никакого уведомления. Это твой вопрос?

Ответы (1)

После успешной передачи токена ERC20 генерируется событие, содержащее адреса сторон и переданную сумму. Событие Transfer выглядит так:

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

Ваш контракт может прослушивать контракт токена для событий Transfer, где ваш контракт является параметром _to— вы можете сделать это вне сети, используя событие web3 api watch.

Вы можете найти эти связанные вопросы полезными:

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

Вызвать платежную функцию смарт-контракта, отправив токен erc20

Спасибо, первая ссылка, которую вы разместили, содержала ответ, который я искал. «Если вы хотите, чтобы ваш код контракта Solidity отвечал на передачу ERC 20, вам, вероятно, не повезло;» Теперь мне интересно, есть ли способ хранить все транзакции токена в цепочке в виде структуры данных, а не публиковать события, чтобы другие контракты могли читать текущие и прошлые транзакции, но я буду проводить дополнительные исследования, прежде чем задавать другой вопрос.
Привет @Paulmullins, ты смог найти решение для этого?