首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ERC20中使用ERC721

在ERC20中使用ERC721
EN

Ethereum用户
提问于 2021-10-29 16:04:00
回答 1查看 325关注 0票数 0

我的问题可能很初级,但我找不到应用这个问题的例子或方法,为了得到更好的解释,我把我的ERC20和ERC721代码放在下面

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";

contract HeroToken is Ownable, ERC721URIStorage {
  using Counters for Counters.Counter;
  Counters.Counter private _tokenIds;
  
  //event para novos hero invocados
  event CreatedNewHero(uint heroId, string uri);
 
  constructor() ERC721("HeroToken", "HERT") {}

  function invokeRandomHero(address _player, string memory _tokenURI) public{
    
     ////// add here a verification of token ERC720. How do I do it? /////

    _tokenIds.increment();

    uint256 newHeroId = _tokenIds.current();
    _mint(_player, newHeroId);
    _setTokenURI(newHeroId, _tokenURI);

    emit CreatedNewHero(newHeroId, _tokenURI);        
  }

  function totalHeroes() public view returns(uint){
    return _tokenIds.current();
  }

}

我的ERC720

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

contract TokenCoin is ERC20, ERC20Burnable, Pausable, AccessControl, Ownable  {
    using SafeMath for uint256;

    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    constructor() ERC20("TOKEN COIN", "TCOIN") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 100000 * 10 ** decimals());
        _setupRole(MINTER_ROLE, msg.sender);                
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {
        _mint(to, amount);        
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override
    {
        super._beforeTokenTransfer(from, to, amount);
    }

}

我需要什么?我需要在调用"invokeRandomHero“函数时,检查玩家是否有来自我的”令牌币“的X号,如果他有平衡,他可以铸造一个英雄,然后需要烧掉我的ERC20 (令牌币)的X值。

剩下的问题是我该怎么做?我已经找了几天了,我找不到这种情况的例子。

我很感激你的帮助。

EN

回答 1

Ethereum用户

发布于 2021-10-29 17:25:23

试着研究ERC1155。它是将nft和令牌货币结合在一个合同中的一个更干净的标准,而且OpenZeppelin也为您准备好了一个实现。它将允许您在一个契约中操作这两者,而不会有重叠的所有权或事件或任何事情(就像您目前可能有的那样)。

OpenZeppelin文档在这里:https://docs.openzeppelin.com/contracts/3.x/api/presets#ERC1155PresetMinterPauser

伪码:

代码语言:javascript
复制
contract HeroToken is IERC1155 {
    constructor() {
        // 0 token id is TokenCoin representation
        _mint(msg.sender, 0, 100000, "");
    }

    function invokeRandomHero(address _player, string memory _tokenUri) public {
        burn(msg.sender, 0, 100);
        _tokenIds.increment();
        _mint(_player, _tokenIds.current(), 1, ""); // nft has just one

        // continue...
    }
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/112491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档