本文档介绍了Circle的FiatToken合约设计,它是一个兼容ERC-20的代币,允许多个实体进行代币的铸造/销毁,暂停所有活动,冻结个人地址,以及升级合约以修复错误或添加功能。文章详细的介绍了 FiatToken 合约中的各种角色及其权限,ERC-20标准接口的实现,代币的发行与销毁,黑名单机制,暂停机制,Meta交易兼容性以及合约的升级与角色重新分配。
Circle 的 FiatToken 合约是一个兼容 ERC-20 的 token。它允许多个实体进行 token 的 铸造/销毁,暂停所有活动,冻结单个地址,以及一种升级合约的方式,以便可以修复 bug 或添加功能。
FiatToken
有许多角色(地址),这些角色控制着不同的功能:
masterMinter
- 添加和移除 minter,并增加他们的铸造额度minters
- 创建和销毁 tokenpauser
- 暂停合约,这会阻止所有转账、铸造和销毁blacklister
- 阻止所有与特定地址的转账,并阻止该地址进行铸造或销毁owner
- 重新分配除 admin
之外的任何角色admin
- 管理代理级别的功能,例如切换实现合约rescuer
- 转移锁定在合约中的任何 ERC-20 tokenCircle 将控制所有角色的地址。
FiatToken
实现了 ERC-20 接口的标准方法,但有一些更改:
transfer
或 transferFrom
,并且将无法接收 token。
approve
,但在 2.2+ 版本中可用。有关更多详细信息,请参见 "黑名单" 部分。transfer
、transferFrom
和 approve
将失败。FiatToken 合约允许多个实体创建和销毁 token。这些实体必须是 Circle 的成员,并且在允许他们创建新 token 之前,Circle 会对他们进行审查。
每个 minter
都有一个 minterAllowance
,这是由 Circle 配置的。minterAllowance
是该 minter 可以发行的 token 数量,并且当 minter
发行 token 时,其 minterAllowance
会减少。只要 minter
与 Circle 保持良好关系,并为其发行的 token 保持足够的储备,Circle 将定期重置 minterAllowance
。minterAllowance
用于限制任何特定 minter
受到攻击时造成的损害。
Circle 通过 configureMinter
方法添加 minter。当配置 minter 时,会指定一个 minterAllowance
,这是允许该地址铸造的 token 数量。当 minter
铸造 token 时,minterAllowance
将减少。
masterMinter
角色可以调用 configureMinter。minters
需要定期重置额度,以允许他们继续铸造。当 minter
的额度较低时,Circle 可以再次调用 configureMinter
以将 minterAllowance
重置为更高的值。
Circle 通过 removeMinter
方法移除 minter。这将从 minters
列表中移除 minter
并将其 minterAllowance
设置为 0。一旦移除 minter
,它将无法再铸造或销毁 token。
masterMinter
角色可以调用 removeMinter
。minter
通过 mint
方法铸造 token。minter
指定要创建的 token amount
,以及将拥有新创建 token 的 _to
地址。minter
只能铸造小于或等于其 minterAllowance
的数量。minterAllowance
将减少铸造的 token 数量,并且 _to
地址的余额和 totalSupply
将各自增加 amount
。
只有 minter
可以调用 mint
。
当合约 paused
时,铸造失败。
当 minter
或 _to
地址被列入黑名单时,铸造失败。
铸造会发出 Mint(minter, _to, amount)
事件和 Transfer(0x00, _to, amount)
事件。
minter
通过 burn
方法销毁 token。minter
指定要销毁的 token amount
,并且 minter
必须具有大于或等于 amount
的 balance
。销毁 token 仅限于 minter
地址,以避免最终用户意外销毁 token。minterAllowance
为 0 的 minter
允许销毁 token。minter
只能销毁它拥有的 token。当 minter 销毁 token 时,其余额和 totalSupply 都会减少 amount
。
销毁 token 不会增加执行销毁的地址的 minterAllowance。
只有 minter 可以调用 burn。
当合约暂停时,销毁失败。
当 minter 被列入黑名单时,销毁失败。
销毁会发出 Burn(minter, amount)
事件和 Transfer(minter, 0x00, amount)
事件。
地址可以被列入黑名单。被列入黑名单的地址将无法转账 token、铸造或销毁 token。
在 FiatToken 版本 <2.2 中,被列入黑名单的地址无法调用 approve
,increaseAllowance
,decreaseAllowance
或使用 permit
授权未来的拉取付款。它也不能被授权从其他地址拉取付款。这已在 v2.2 中进行了更改,其中被列入黑名单的地址可以执行上述功能。但是它们仍然被阻止以任何方式转移资产。因此,对修改黑名单地址的津贴的任何操作都被认为是毫无意义的。
Circle 通过 blacklist
方法将地址列入黑名单。指定的 account
将添加到黑名单中。
blacklister
角色可以调用 blacklist
。Blacklist(account)
事件Circle 通过 unblacklist
方法从黑名单中移除地址。指定的 account
将从黑名单中移除。
blacklister
角色可以调用 unblacklist
。UnBlacklist(account)
事件。整个合约可以暂停,以防发现严重的 bug 或存在严重密钥泄露。当合约暂停时,所有转账、铸造、销毁和添加 minter 都将被阻止。其他功能,例如修改黑名单、移除 minter、更改角色和升级将保持运行,因为可能需要这些方法来修复或缓解导致 Circle 暂停合约的问题。
Circle 将通过 pause
方法暂停合约。此方法会将暂停标志设置为 true。
只有 pauser
角色可以调用 pause。
暂停会发出 Pause()
事件
Circle 将通过 unpause
方法取消暂停合约。此方法会将 paused
标志设置为 false。当合约取消暂停时,所有功能都将恢复。
只有 pauser
角色可以调用 unpause。
取消暂停会发出 Unpause()
事件
该合约与 ERC-2612 兼容。用户可以通过签署 permit
消息并将已签名消息传递给中继器来更新其 ERC-20 额度,中继器将执行链上交易,而不是自己提交交易。
该合约与 ERC-3009 兼容。用户可以通过签署 EIP-3009 授权并将授权传递给中继器来将资产转移给另一个用户,中继器将执行链上授权,而不是自己提交交易。
该合约支持通过以下方式进行签名验证:
FiatTokenProxy 合约使用 zeppelinos Unstructured-Storage Proxy 模式
[https://github.com/zeppelinos/zos-lib/blob/8a16ef3ad17ec7430e3a9d2b5e3f39b8204f8c8d/contracts/upgradeability/AdminUpgradeabilityProxy.sol]。
FiatTokenV2_2.sol 是实现,
实际的 token 将是一个 Proxy 合约
(FiatTokenProxy.sol),它将通过 delegatecall 将所有调用转发到 FiatToken
。这种模式允许 Circle 无缝升级任何已部署 token 的逻辑。
upgradeTo
或 upgradeToAndCall
来升级 token。admin
角色可以调用 upgradeTo
或 upgradeToAndCall
。上述角色可以重新分配。owner
角色有权重新分配除 admin
角色之外的所有角色(包括其自身)。
changeAdmin
将 admin
角色更新为新地址。changeAdmin
只能由 admin
角色调用。updateMasterMinter
将 masterMinter
角色更新为新地址。updateMasterMinter
只能由 owner
角色调用。updatePauser
将 pauser
角色更新为新地址。updatePauser
只能由 owner
角色调用。updateBlacklister
将 blacklister
角色更新为新地址。updateBlacklister
只能由 owner
角色调用。transferOwnership
将 owner
角色更新为新地址。transferOwnership
只能由 owner
角色调用。updateRescuer
将 rescuer
角色更新为新地址。updateRescuer
只能由 owner
角色调用。
- 原文链接: github.com/circlefin/sta...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!