ethereum - 在 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 中使用吗?提前致谢。
解决方案
在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;
}
我的代码中的半衰期是两天内的秒数。
推荐阅读
- java - java中用户输入的重复项的升序
- java - 在用户做出选择之前调用 onRequestPermissionsResult?
- ios - Swift Combine:一个接一个地运行发布者列表,并发布第一个非零元素
- c - 当 malloc/calloc/realloc 失败时,是否有任何极端情况?
- r - 用于 R 数据分解的 ifelse 函数
- java - 删除特定行 Apache Poi
- python - 如何在python中对具有相似文本的数据框进行分组
- google-sheets - 搜索框(过滤器)谷歌表
- ruby - 等到值出现在哈希中
- javascript - 角度中的 Unicode 字符