jackygu's blog

Posted on Aug 09, 2023Read on Mirror.xyz

关于FERC V3代币发行的几个问题

关于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%

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");
    ...
}