数值限制

金额

uint112

  • 外部代币的最大合理数量(balanceOf 的结果)

  • Uniswap2 将代币数量限制于此

  • 规格:对于 18 位十进制代币,超过一百万个代币 (1e15)

少量

uint96

  • 我们预计不会持有这么大的金额,特别是准备金余额

  • 可以与一个地址一起打包在一个slot中

  • 规格:对于一个 18 位十进制代币,超过十亿个代币 (1e9)

债务金额

uint144

  • 债务的最大合理金额

  • 在单个存储slot中与数量一起打包

  • 规格:应保持最大可能金额(uint112),但按小数点后 9 位缩放(用于内部债务精度)

    • 实际:2e16

价格

  • 最低支持价格:

    • 分数:1e3 / 1e18 = 1e-15

    • tick:-345405

    • sqrtPriceX96:2505418623681149822473

  • 最高支持价格:

    • 分数:1e33 / 1e18 = 1e15

    • tick:345405

    • sqrtPriceX96:2505410343826649584586222772852783278

选择受支持的价格范围的原因如下:

  • 最大价格平方适合 uint256:6e73 < 1e77

    • 不需要使用 FullMath 库

  • 最大支持价格乘以最大支持金额,适合 uint256:5e66 < 1e77

    • 也适用于债务及其额外的 9 位精度:5e75 < 1e77

利率

int96

  • “第二个百分比收益率”

  • 分数按 1e27 缩放

    • 示例:10% APR = 1e27 * 0.1 / (86400*365) = 1e27 * 0.000000003170979198376458650 = 3170979198376458650

  • 规格:10 亿 % APR,正或负

interestAccumulator

uint256

  • 从 1e27 开始,每秒乘以 (1e27 + interestRate)

  • 规格:100% APR 100 年

-> 2^256
~= 1.1579208923e+77
-> 10^27 * (1 + (100/100 / (86400*365)))^(86400*365*100)
~= 2.6881128798e+70

已标识模块

uint32

  • 每个模块一个,所以这比需要的多

  • 分为3个部分

    • <500_000:公共单一代理

    • =500_000 和 <1_000_000:公共多代理

    • =1_000_000:内部

  • 规格:十几个模块,所有部分都有增长空间

抵押因子/借入因子

uint32

  • 0 和 1 之间的分数,按 2^32 - 1 缩放

  • 规格:至少 3 位小数(留足余量)

Last updated