首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:从地址到应付款地址的隐式转换无效

TypeError:从地址到应付款地址的隐式转换无效
EN

Ethereum用户
提问于 2021-10-13 22:03:07
回答 1查看 193关注 0票数 0

大家好啊!

我正在为我的ERC-721智能合同增加版税。我的目标是每当有人制造一个新的标记或转让一个令牌时,将版税返还给艺术家。

然而,现在当我试图迁移我的合同时,我得到了一个错误。

代码语言:javascript
复制
TypeError: Invalid type for argument in function call. Invalid implicit conversion from address to address payable requested

           setRoyalties(_tokenIdTracker.current(),devAddress,2000);
                                                  ^^^^^^^^^

这是我的合同

代码语言:javascript
复制
//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合同作为参考智能合同代码,他们似乎在做类似的事情,我可能错过了一个步骤。如有任何帮助将不胜感激,谢谢。

我试过的是:

  • 地址应付常数artistAddress = 0xcBC0x0x0x0x0x0x0x0;
EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-10-14 18:10:50

您的调用是将devAddress发送到setRoyalties方法,该方法期望它的位置是address payable _royaltiesReceipientAddress。由于它期望函数上有一个paybale地址,所以必须在它转到方法之前转换它,因此可以在调用函数时将其转换为payable

setRoyalties(_tokenIdTracker.current(),payable(devAddress),2000);

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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