Событий не было - Обмен токенов ERC721 - PullRequest
0 голосов
/ 18 января 2019

Функция для обмена токенами ERC721 между двумя адресами. Я реализую это на трюфеле и openzeppelin 2.10. Два разных токена должны быть обменены между двумя адресами.

Вот моя контрактная функция для обмена токенами ERC721:

функция exchangeStars (uint256 token1, uint256 token2, адрес starOwner2) public { require (this.ownerOf (token1) == msg.sender);

    transferFrom(msg.sender, starOwner2, token1);
    transferFrom(starOwner2, msg.sender, token2);
}

Это тест, который я пишу для создания токенов и обмена между двумя адресами.

describe('Exchange Stars', () =>  {
    let token1 = 101;
    let token2 = 202;

    it('User 1 creates Star', async() => {
      await this.contract.createStar(starName, story, ra, dec, mag, token1, {from: account1});
      assert.equal(await this.contract.ownerOf.call(token1), account1);
    });

    it('User 2 creates Star', async() => {
      await this.contract.createStar(starName2, story, ra, dec, mag, token2, {from: account2});
      assert.equal(await this.contract.ownerOf.call(token2), account2);
    });

    it('Users exchange Stars', async() => {
      await this.contract.exchangeStars(token1, token2, account2);
      assert.equal(await this.contract.ownerOf.call(token2), account2);
      console.log(await this.contract.ownerOf.call(token2));
    });

  });

Вот результат для моих тестов:

Exchange Stars
  √ User 1 creates Star (129ms)
  √ User 2 creates Star (116ms)
  1) Users exchange Stars
> No events were emitted

1 Ответ

0 голосов
/ 21 января 2019

Задача

Мы хотим заключить простой договор ERC-721, в котором владельцы токенов могут (с односторонним согласием) обменять их на любой другой существующий токен.

Эта реализация должна соответствовать стандартам ERC-721 и генерировать два события Transfer при выполнении этого обмена.

Решение

Давайте начнем с базовой реализации, не основанной на эталонной реализации, и включающей функцию mint, чтобы мы могли создать несколько токенов для игры:

pragma solidity 0.5.1;

import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token.sol";

contract ExchangeableTokens is ERC721 {

    /**
    * @dev Mints a new NFT.
    * @param _to The address that will own the minted NFT.
    * @param _tokenId of the NFT to be minted by the msg.sender.
    */
    function mint(
        address _to,
        uint256 _tokenId
    )
        external
        onlyOwner
    {
        super._mint(_to, _tokenId);
    }
}

Теперь мы можем добавить желаемое поведение:

function exchangeStars(uint256 myToken, uint256 theirToken, address them) 
    public
{
    require (idToOwner[myToken] == msg.sender);
    require (idToOwner[theirToken] == them);
    require (them != address(0));
    _transfer(them, myToken);
    _transfer(msg.sender, theirToken);
}

Обсуждение

Эта реализация следует стандарту и генерирует события по мере необходимости.

...