首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ERC2981版税四舍五入

ERC2981版税四舍五入
EN

Ethereum用户
提问于 2022-09-06 15:09:12
回答 1查看 59关注 0票数 1

我最近开发了一个智能契约,它实现了ERC2981 (https://eips.ethereum.org/EIPS/eip-2981)令牌标准。

我实现的royaltyInfo函数符合标准,在每个令牌的基础上获得版税。这是函数。

代码语言:javascript
复制
function royaltyInfo(uint256 tokenId, uint256 value)
    external
    view
    override
    returns (address receiver, uint256 royaltyAmount)
{
    RoyaltyInfo memory royalties = _royalties[tokenId];
    receiver = royalties.recipient;
    royaltyAmount = (value * royalties.amount) / 10000;
}

问题是,当我有一些版税金额时,退还的金额会四舍五入。

例如,如果令牌的版税金额为50 (即版税的0.5% ),并且输入函数的value参数为1000,则返回5。这是正确的值。

但是,当我输入100作为value参数时,当0.5是正确的值时,则返回0。

是否在仍然遵守ERC2981令牌标准的同时返回正确的值?

如果没有,是否有办法避免人们没有像上面的例子那样得到版税,你将如何实现这一点?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-09-07 11:25:22

阅读环境影响指数:

基于前面提到的原因,所使用的百分比价值必须独立于销售价格(即,如果百分比值为10%,那么无论_salePrice是10、10000还是1234567890,都必须应用10% )。如果版权费计算结果为剩余部分,实现者可以将其集合或舍入到最接近的整数。例如,如果版权费为10%,而_salePrice为999,则实现者可以返回royaltyAmount的99或100,两者都有效。

所以四舍五入是可以接受的,你可以这样做:

代码语言:javascript
复制
// return royaltyAmount rounded up
function royaltyInfo(uint256 tokenId, uint256 value)
    external
    view
    override
    returns (address receiver, uint256 royaltyAmount)
{
    RoyaltyInfo memory royalties = _royalties[tokenId];
    receiver = royalties.recipient;

    uint256 tmp = value * royalties.amount;
    if (tmp == 0) {
        royaltyAmount = 0;
    } else {
        royaltyAmount = (tmp - 1) / 10000 + 1;
    }
}

然而,市场通常会使用带有大量小数的标记(WETH有18,USDC有6)。在这种情况下,值的最后一个数字并不那么重要,这就是为什么人们通常会向下看。

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

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

复制
相关文章

相似问题

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