首页 > 解决方案 > 在 Solidity 中实现指数衰减函数

问题描述

我正在开发一个具有内置版税功能的 ERC-721 代币,即,当用户发行代币时,他选择以 ETH 为单位的版税,并且他有权在每次二级市场交易中获得该费用。此外,用户持有的属于特定发行人的代币越多,特许权使用费就越低,我需要实现指数衰减函数来计算折扣。

M = e ^ (-x / 50)
where, e is Euler's number
so the discountedFee = M * standardFee

例如,一个代币的特许权使用费是 0.01 ETH,在合约中表示为 10000000000000000 WEI。现在买方持有该发行人的 10 个代币,现在他即将购买他的第 11 个代币,因此特许权使用费将计算为

M = e ^ (-10 / 50) = 0.818
discountedFee = M * standardFee = 0.0081 ETH

这个功能可以在 Solidity 中使用吗?提前致谢。

标签: ethereumsolidity

解决方案


在solidity中实现真正的指数衰减非常困难,更不用说昂贵了,因为该语言不支持浮点运算。此链接可能会有所帮助。

就个人而言,我用一系列针对特定时间段内的半衰期的线性函数来近似指数衰减。

function getPrice(uint256 value, uint256 t, uint256 halfLife) public pure returns (uint256 price) {
    value >>= (t / halfLife);
    t %= halfLife;
    price = value - value * t / halfLife / 2;
}

我的代码中的半衰期是两天内的秒数。


推荐阅读