В настоящее время я пишу смарт-контракт «Торговля», который похож на смарт-контракт «Краудсейл». Единственная функция, которую я хочу добавить, это функция «продать». В целом смарт-контракт Crowdsale используется для того, чтобы люди покупали свои токены. Нет проблем с реализацией функции «купить» благодаря расширению payable
. Он не только может заставить смарт-контракт получать эфир, но также может выполнять транзакцию определенной платежной функции (т.е. function buy() payable public {}
).
Мне нужно то Token Fallback function
же, что и эфиру, поэтому я нашел ERC223
улучшенный на основе ERC20. Мне интересно, могу ли я использовать функцию возврата токена в другом смарт-контракте. Я имею в виду еще один развернутый контракт. Например, давайте предположим, что кто-то переводит/отправляет мои пользовательские токены erc20 на смарт-контракт «Торговля», потому что он/она хочет продать некоторое количество токенов и получить обратно пропорциональное количество эфира (используя Web3, как это myContract.methods.transfer()
). После того, как смарт-контракт «Торговля» получил токен, Token Fallback Function
смарт-контракт «Торговля» вызывается и выполняет функцию «Продать» в этом контракте. Это имеет смысл?
Проблема в том, как я могу это реализовать?
function transfer(address _to, uint _value, bytes _data) public {
require(_value > 0 );
if(isContract(_to)) {
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
receiver.tokenFallback(msg.sender, _value, _data);
}
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value, _data);
}
(См . https://gist.github.com/anonymous/eb7be71f34911b013552960cc4ac0f45 )
Это ERC223 Token transfer function
и ERC223ReceivingContract
импортируется import 'browser/ERC223ReceivingContract.sol';
вот так. Я не хочу импортировать Контракт, потому что на случай, если мне придется позже обновить свой Контракт. Я хочу, чтобы мой токен-контракт имел только несколько необходимых функций.
Я также нашел другую функцию под названием TransferAndCall()
. Я не могу найти подробное объяснение, как его использовать. Это похоже на функцию Fallback.
В любом случае, у вас, ребята, есть какое-нибудь решение для этого? Почему я хочу разделить смарт-контракт «Торговля» и смарт-контракт «Токен», так это в том случае, если мне нужно обновить свой контракт «Торговля» позже, как я уже упоминал. Помогите, пожалуйста, умные знатоки солидности!
После того, как смарт-контракт «Торговля» получил токен, вызывается функция возврата токена в смарт-контракте «Торговля» и выполняется функция «Продать» в этом контракте.
Да.
Как видите, в transfer
функции, если получателем является контракт, то у него должна быть резервная функция для токена, иначе он не будет работать.
Вам необходимо реализовать эту функцию в вашем контракте.
if(isContract(_to)) {
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
receiver.tokenFallback(msg.sender, _value, _data);
}
Как видите, исходя из абстрактного контракта ERC223ReceivingContract
, сигнатура функции должна быть:
function tokenFallback(address _from, uint _value, bytes _data) public