在MakerDao合同中,年化的百分比率和每秒的百分比率之间有转换.例如,他们的稳定费文档给出了这个示例:
如果稳定费设置为2%,它将累积为每秒1.00000000627937924910298109948%。在第一年年底,用户将完全欠本金的2%。
将年化格式转换为每秒格式(反之亦然)的基本方法如下所示,其中31536000是一年中的秒数:
1.0000000006279371924910298109948^31536000 = 2% 1.02^(1/31536000) =1.00000006279279371924910298109948%
由于稳健性只支持整数,因此可以使用定点算法在年化率和每秒汇率之间进行转换。My第一个问题:这两个速率的整数表示(以射线表示)是什么?
My的下一个问题是如何使用BigNumber.js实用程序将每秒/年化的汇率转换为-和--?
下面的JavaScript代码不起作用。
PER_SECOND_RATE.pow(toBN(SECONDS_IN_YEAR).toString())
ANNUALIZED_RATE.pow(toBN(-SECONDS_IN_YEAR).toString())发布于 2021-03-31 20:34:07
Maker协议不使用或存储年率,也没有内部表示。
所有的速率都是每秒的,它使用的是RAY数格式,它是常规的uint256值,并且总是由特殊的数学函数处理,比如rmul或rdiv,它们自动地将27个最右边的数字视为射线不动点数的十进制部分。
因此,1.02%的整数表示将是uint256值10000000006279371924910298109948。
我试过使用BN.js,但这两种计算都不起作用,可能是因为所涉及的数字和指数的大小。
对于使用javascript中的bc命令,有一种稍微有点麻烦的方法,对我来说效果很好。
函数的输入是年率。例: 5.6432%的bc输出小数点值和27小数位数。从输出中删除小数点,以获得智能契约使用的RAY格式的数字。
public async getRatePerSecond(annual: number) {
let annRate = ((annual / 100) + 1).toFixed(4);
const { stdout, stderr } = await exec(
"bc -l <<< 'scale=27; e( l(" +
annRate.toString() +
")/31557600 )'"
);
if (stderr) {
console.error(`error: ${stderr}`);
return;
}
let ratePerSec = BigNumber.from(
stdout
.toString()
.replace(".", "")
.replace(/(\r\n|\n|\r)/gm, "")
);
return ratePerSec;
}Ex:getRatePerSecond(2.75) = 1000000000859655594846036300
这并没有回答你的问题,但是我把这个python脚本留给其他人去寻找一种简单的计算方法,
$ python -c "print 1.000000000627507392906712186**31557600"1.01999999956
如果您有兴趣了解更多信息,率机制介绍指南将介绍Maker协议中的费率。
https://ethereum.stackexchange.com/questions/96452
复制相似问题