Событий не было - Обмен токенов ERC721
Функция для обмена токенами 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 ответ
проблема
Мы хотим заключить простой договор 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);
}
обсуждение
Эта реализация следует стандарту и генерирует события по мере необходимости.