Solidity
我收到錯誤 ERC1155: transfer to non erc1155 receiver implementationer 的意思
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
唯一可以鑄造代幣的帳戶也可能是有意義的……但這更多是您方面的設計決定;)