Использование резервной функции токена ERC223

В настоящее время я пишу смарт-контракт «Торговля», который похож на смарт-контракт «Краудсейл». Единственная функция, которую я хочу добавить, это функция «продать». В целом смарт-контракт 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.

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

Ответы (1)

После того, как смарт-контракт «Торговля» получил токен, вызывается функция возврата токена в смарт-контракте «Торговля» и выполняется функция «Продать» в этом контракте.

Да.

Как видите, в transferфункции, если получателем является контракт, то у него должна быть резервная функция для токена, иначе он не будет работать.

Вам необходимо реализовать эту функцию в вашем контракте.

if(isContract(_to)) {
        ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
        receiver.tokenFallback(msg.sender, _value, _data);
    }

Как видите, исходя из абстрактного контракта ERC223ReceivingContract, сигнатура функции должна быть:

function tokenFallback(address _from, uint _value, bytes _data) public