Solidity

我收到錯誤 ERC1155: transfer to non erc1155 receiver implementationer 的意思

  • January 14, 2022
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: transfer to non erc1155 receiver implementationer means 。

當您在其中一個合約上createContract呼叫該mint函式時,newToken它將變為msg.sender. 因此它會給newToken你的createContract.

根據定義,ERC-1155 合約將檢查代幣轉移的接收者是否是合約,以及是否是這種情況呼叫onERC1155Received(請參閱ERC-1155 代幣接收者)。這也適用於你鑄造一個新的代幣(因為它被轉移)。因此,您newToken嘗試在您的createContract契約上呼叫此方法,但此方法並未實現。

有一些方法可以解決這個問題。例如,將 添加receiver到 mint 函式並將其指定為呼叫createContract.

目前,您newToken也可以由任何人鑄造,因此使其可擁有並使其成為createContract唯一可以鑄造代幣的帳戶也可能是有意義的……但這更多是您方面的設計決定;)

引用自:https://ethereum.stackexchange.com/questions/118923