我的问题可能很初级,但我找不到应用这个问题的例子或方法,为了得到更好的解释,我把我的ERC20和ERC721代码放在下面
// 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
// 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值。
剩下的问题是我该怎么做?我已经找了几天了,我找不到这种情况的例子。
我很感激你的帮助。
发布于 2021-10-29 17:25:23
试着研究ERC1155。它是将nft和令牌货币结合在一个合同中的一个更干净的标准,而且OpenZeppelin也为您准备好了一个实现。它将允许您在一个契约中操作这两者,而不会有重叠的所有权或事件或任何事情(就像您目前可能有的那样)。
OpenZeppelin文档在这里:https://docs.openzeppelin.com/contracts/3.x/api/presets#ERC1155PresetMinterPauser
伪码:
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...
}
}https://ethereum.stackexchange.com/questions/112491
复制相似问题