pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract newToken is ERC1155{
using Counters for Counters.Counter;
Counters.Counter private _nftIds;
constructor(string memory _uri)ERC1155(_uri){
}
function mint(uint _amount,string memory _uri)public returns(uint){
_nftIds.increment();
uint currentId=_nftIds.current();
_mint(msg.sender,currentId,_amount,"");
_setURI(_uri);
return currentId;
}
function transfer(address _to,uint _id, uint _amount)public returns(bool success){
safeTransferFrom(
msg.sender,
_to,
_id,
_amount,
""
) ;
return true;
}
}
contract createContract{
newToken[] contractAddress;
mapping(address=>newToken) public contracts;
function create(string memory _uri) public {
newToken addr=new newToken(_uri);
contractAddress.push(addr);
contracts[msg.sender]=addr;
}
function mint(string memory _uri)public returns(newToken) {
if (address(contracts[msg.sender])==address(0)){
create(_uri);
contracts[msg.sender].mint(1,_uri);
return contracts[msg.sender];
}
else{
contracts[msg.sender].mint(1,_uri);
return contracts[msg.sender];
}
}
}当我试图部署createContract和mint时,我得到了一个错误ERC1155: Transfertonon-erc1155接收器实现者方法。
发布于 2022-01-14 11:29:03
当您的createContract在您的newToken契约上调用mint函数时,它将成为msg.sender。因此,它将创建一个newToken到您的createContract。
根据定义,ERC-1155合同将检查令牌传输的接收方是否为合同,以及是否为case调用onERC1155Received (参见ERC-1155令牌接收机)。当您创建一个新令牌时(当它被传输时),这也适用于此。因此,您的newToken试图在您的createContract契约上调用这个方法,但是这个方法没有实现。
有一些方法可以解决这个问题。例如,将receiver添加到mint函数,并将其指定为调用createContract的帐户。
目前,您的newToken也可以由任何人铸造,所以它也可能有意义使它拥有,并使createContract,这是唯一的帐户,可以铸币.但这更多的是你的设计决策;)
发布于 2022-11-10 17:47:16
在你的合同中需要ERC1155Holder。
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
contract myContract is ERC1155Holder{}发布于 2022-07-06 09:23:54
任何接收ERC1155的合同都应该这样写:
import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
contract ERC1155StakingUpgradeable is
ERC165Upgradeable,
IERC1155ReceiverUpgradeable {
//copy code from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/mocks/ERC1155ReceiverMock.sol
function initialize() external initializer {
...
_recRetval = 0xf23a6e61;//function signature copied from OpenZeppelin IERC1155ReceiverUpgradeable.sol
_batRetval = 0xbc197c81;
}
}https://ethereum.stackexchange.com/questions/118923
复制相似问题