大家好啊!
我正在为我的ERC-721智能合同增加版税。我的目标是每当有人制造一个新的标记或转让一个令牌时,将版税返还给艺术家。
然而,现在当我试图迁移我的合同时,我得到了一个错误。
TypeError: Invalid type for argument in function call. Invalid implicit conversion from address to address payable requested
setRoyalties(_tokenIdTracker.current(),devAddress,2000);
^^^^^^^^^//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "./@rarible/royalties/contracts/impl/RoyaltiesV2Impl.sol";
import "./@rarible/royalties/contracts/LibPart.sol";
import "./@rarible/royalties/contracts/LibRoyaltiesV2.sol";
contract EpicTest is ERC721, Ownable, RoyaltiesV2Impl {
using SafeMath for uint256;
using Counters for Counters.Counter;
Counters.Counter private _tokenIdTracker;
uint256 public constant MAX_ELEMENTS = 1000;
bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
uint256 private startSales = 1634124766;
address public constant artistAddress = 0xcBC0x0x0x0x0x0x0x0x0x0x0x0;
constructor() ERC721("EpicTest", "ET") {}
function mint(address _to) public onlyOwner {
super._mint(_to, _tokenIdTracker.current());
setRoyalties(_tokenIdTracker.current(),artistAddress,2000);
_tokenIdTracker.increment();
}
function setRoyalties(uint _tokenId, address payable _royaltiesReceipientAddress, uint96 _percentageBasisPoints) public onlyOwner {
LibPart.Part[] memory _royalties = new LibPart.Part[](1);
_royalties[0].value = _percentageBasisPoints;
_royalties[0].account = _royaltiesReceipientAddress;
_saveRoyalties(_tokenId, _royalties);
}
function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) {
LibPart.Part[] memory _royalties = royalties[_tokenId];
if(_royalties.length > 0) {
return (_royalties[0].account, (_salePrice * _royalties[0].value)/10000);
}
return (address(0), 0);
}
}我使用EpicEagles合同作为参考智能合同代码,他们似乎在做类似的事情,我可能错过了一个步骤。如有任何帮助将不胜感激,谢谢。
我试过的是:
发布于 2021-10-14 18:10:50
您的调用是将devAddress发送到setRoyalties方法,该方法期望它的位置是address payable _royaltiesReceipientAddress。由于它期望函数上有一个paybale地址,所以必须在它转到方法之前转换它,因此可以在调用函数时将其转换为payable:
setRoyalties(_tokenIdTracker.current(),payable(devAddress),2000);
https://ethereum.stackexchange.com/questions/111537
复制相似问题