我最近开发了一个智能契约,它实现了ERC2981 (https://eips.ethereum.org/EIPS/eip-2981)令牌标准。
我实现的royaltyInfo函数符合标准,在每个令牌的基础上获得版税。这是函数。
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令牌标准的同时返回正确的值?
如果没有,是否有办法避免人们没有像上面的例子那样得到版税,你将如何实现这一点?
发布于 2022-09-07 11:25:22
阅读环境影响指数:
基于前面提到的原因,所使用的百分比价值必须独立于销售价格(即,如果百分比值为10%,那么无论_salePrice是10、10000还是1234567890,都必须应用10% )。如果版权费计算结果为剩余部分,实现者可以将其集合或舍入到最接近的整数。例如,如果版权费为10%,而_salePrice为999,则实现者可以返回royaltyAmount的99或100,两者都有效。
所以四舍五入是可以接受的,你可以这样做:
// 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)。在这种情况下,值的最后一个数字并不那么重要,这就是为什么人们通常会向下看。
https://ethereum.stackexchange.com/questions/135109
复制相似问题