关于FERC V3
平台所发行的代币涉及的较多关心的问题,做如下解释:
1- 发币为什么采取合约铸造方式而不是发放方式?
合约中使用_mint()
方法实现铸币,并通过maxRollups
来控制总量。
铸造(mint)方式与一次性发放全部数量到某个地址的发放(issue)方式的不同之处在于:
-
铸造(mint)方式:
铸币人(或称受益人)主动触发智能合约的mint方法,从
0x0
地址发送代币至受益人地址(或其指定的地址)。对于无owner
权限的合约,一般采取此方式。为了防止无限量铸造(增发),通常会设置一个不可更改的顶(Cap)来控制总量;其特点有:
- 总量,即在区块链浏览器中会看到
total supply
会随着铸造进程增长,直到触及实际发行总量; - 从用户角度看,币是从
0x0
地址发放到他们账户的; - 铸造过程完全由发起铸币的人控制,不受任何第三方(包括项目方)控制;
- 总量,即在区块链浏览器中会看到
-
发放(issue)方式:
一般由合约部署人(owner)主动触发mint方法,一次性将所有代币从
0x0
地址发送至部署人地址或其指定的收币人地址,然后由部署人转分发至其他受益人。一般这类合约会将mint方法放在合约的构造方法中在部署合约时一次性执行,也就是不允许之后再次铸造(增发)。其特点有:
- 总量不变
- 从用户角度看,币是从部署人(或项目方)账户发放到他们账户的;
- 铸造过程一般会由项目方手动(或通过智能合约)操作,比如确定收到参与人一定款项后,再将币发送至参与人;
2- FERC V3版的顶(Cap)如何计算?
Ferc V3
有免费和Fair Token Offering(FTO)
两种铸币模式,前者的顶(Cap)与通常的理解无二,而对于FTO,因为部署人(Deployer)可自行设定进入流动池的Token数量,所以将无法用Cap来简单的控制总量,所以我们使用最大铸造次数(Max Rollup)
来控制总量。而由此得到的实际顶(Actural Cap)
通常会小于部署时设定的理论顶 Cap
,之间的差额将永远无法被铸造出来。
公式如下:
Max Rollup = Math.floor(Cap * (1- Rate of token to LP) / LimitPerMint)
Actural Cap = Max Rollup * LimitPerMint / (1 - Rate of token to LP)
举例:
- 理论硬顶(Cap):10,000,000 个
- 单次铸造数量(LimitPerMint):3,000 个/次
- 流动性占比(TLR Rate of token to LP): 41.18%
计算结果:
- Max Rollup = Math.floor(10,000,000 * (1 - 41.18%)/3,000 = 1960
- Actural Cap = 1960 * 3,000 / (1 - 41.18%) = 9,996,599.80
- 相差:
3400.2
个,将永远无法铸造,占理论总量的0.034%
为了部署人方便评估,V3版在前端提供了计算器,如下图:
3- 如何确保发行总量不可篡改?
从上述公式可知,代币的实际发行总量(Actura Cap)
由以下三个参数决定:
- 部署人设定的
理论顶(Cap)
流动性占比(Rate of token to LP)
单次铸造数量(Limit Per Mint)
在已验证的代币合约源码中,可以看到上述三个参数均在代币构造函数中一次性设定,且代币合约无owner权限,该三项属性的不可篡改性决定了实际硬顶无法被突破。
在mint()方法中,只要通过检验maxRollups
即可方便的判断是否超过实际硬顶:
function mint(address _to) payable public {
equire(totalRollups + 1 <= ferc20.maxRollups, "Touched cap");
...
}