首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我得到了错误的ERC1155:向非erc1155接收器实现者传输

我得到了错误的ERC1155:向非erc1155接收器实现者传输
EN

Ethereum用户
提问于 2022-01-14 11:17:46
回答 3查看 2.4K关注 0票数 2
代码语言:javascript
复制
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接收器实现者方法。

EN

回答 3

Ethereum用户

回答已采纳

发布于 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,这是唯一的帐户,可以铸币.但这更多的是你的设计决策;)

票数 2
EN

Ethereum用户

发布于 2022-11-10 17:47:16

在你的合同中需要ERC1155Holder

代码语言:javascript
复制
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";

contract myContract is ERC1155Holder{}
票数 1
EN

Ethereum用户

发布于 2022-07-06 09:23:54

参见https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/mocks/ERC1155ReceiverMock.sol的示例

任何接收ERC1155的合同都应该这样写:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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