Circle 的 FiatToken 设计

  • circlefin
  • 发布于 2023-10-14 12:28
  • 阅读 29

本文档介绍了Circle的FiatToken合约设计,它是一个兼容ERC-20的代币,允许多个实体进行代币的铸造/销毁,暂停所有活动,冻结个人地址,以及升级合约以修复错误或添加功能。文章详细的介绍了 FiatToken 合约中的各种角色及其权限,ERC-20标准接口的实现,代币的发行与销毁,黑名单机制,暂停机制,Meta交易兼容性以及合约的升级与角色重新分配。

Circle 的 FiatToken 设计

Circle 的 FiatToken 合约是一个兼容 ERC-20 的 token。它允许多个实体进行 token 的 铸造/销毁,暂停所有活动,冻结单个地址,以及一种升级合约的方式,以便可以修复 bug 或添加功能。

角色

FiatToken 有许多角色(地址),这些角色控制着不同的功能:

  • masterMinter - 添加和移除 minter,并增加他们的铸造额度
  • minters - 创建和销毁 token
  • pauser - 暂停合约,这会阻止所有转账、铸造和销毁
  • blacklister - 阻止所有与特定地址的转账,并阻止该地址进行铸造或销毁
  • owner - 重新分配除 admin 之外的任何角色
  • admin - 管理代理级别的功能,例如切换实现合约
  • rescuer - 转移锁定在合约中的任何 ERC-20 token

Circle 将控制所有角色的地址。

ERC-20

FiatToken 实现了 ERC-20 接口的标准方法,但有一些更改:

  • 黑名单地址将无法调用 transfertransferFrom,并且将无法接收 token。
    • 在 FiatToken 版本 <2.2 中,黑名单地址不允许使用 approve,但在 2.2+ 版本中可用。有关更多详细信息,请参见 "黑名单" 部分。
  • 如果合约已暂停,transfertransferFromapprove 将失败。

发行和销毁 token

FiatToken 合约允许多个实体创建和销毁 token。这些实体必须是 Circle 的成员,并且在允许他们创建新 token 之前,Circle 会对他们进行审查。

每个 minter 都有一个 minterAllowance,这是由 Circle 配置的。minterAllowance 是该 minter 可以发行的 token 数量,并且当 minter 发行 token 时,其 minterAllowance 会减少。只要 minter 与 Circle 保持良好关系,并为其发行的 token 保持足够的储备,Circle 将定期重置 minterAllowanceminterAllowance 用于限制任何特定 minter 受到攻击时造成的损害。

添加 Minter

Circle 通过 configureMinter 方法添加 minter。当配置 minter 时,会指定一个 minterAllowance,这是允许该地址铸造的 token 数量。当 minter 铸造 token 时,minterAllowance 将减少。

  • 只有 masterMinter 角色可以调用 configureMinter。

重置铸造额度

minters 需要定期重置额度,以允许他们继续铸造。当 minter 的额度较低时,Circle 可以再次调用 configureMinter 以将 minterAllowance 重置为更高的值。

移除 Minter

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 必须具有大于或等于 amountbalance。销毁 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 中,被列入黑名单的地址无法调用 approveincreaseAllowancedecreaseAllowance 或使用 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() 事件

Meta transactions 兼容性

ERC-2612

该合约与 ERC-2612 兼容。用户可以通过签署 permit 消息并将已签名消息传递给中继器来更新其 ERC-20 额度,中继器将执行链上交易,而不是自己提交交易。

ERC-3009

该合约与 ERC-3009 兼容。用户可以通过签署 EIP-3009 授权并将授权传递给中继器来将资产转移给另一个用户,中继器将执行链上授权,而不是自己提交交易。

签名验证方案

该合约支持通过以下方式进行签名验证:

  1. 外部拥有帐户 (EOA) 的 ECDSA 签名
  2. ERC-1271 用于兼容 ERC-1271 的智能合约钱包

升级

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 的逻辑。

  • 如果新版本需要初始化,Circle 将通过调用 upgradeToupgradeToAndCall 来升级 token。
  • 只有 admin 角色可以调用 upgradeToupgradeToAndCall

重新分配角色

上述角色可以重新分配。owner 角色有权重新分配除 admin 角色之外的所有角色(包括其自身)。

Admin

  • changeAdminadmin 角色更新为新地址。
  • changeAdmin 只能由 admin 角色调用。

Master Minter

  • updateMasterMintermasterMinter 角色更新为新地址。
  • updateMasterMinter 只能由 owner 角色调用。

Pauser

  • updatePauserpauser 角色更新为新地址。
  • updatePauser 只能由 owner 角色调用。

Blacklister

  • updateBlacklisterblacklister 角色更新为新地址。
  • updateBlacklister 只能由 owner 角色调用。

Owner

  • transferOwnershipowner 角色更新为新地址。
  • transferOwnership 只能由 owner 角色调用。

Rescuer

  • updateRescuerrescuer 角色更新为新地址。
  • updateRescuer 只能由 owner 角色调用。
  • 原文链接: github.com/circlefin/sta...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
circlefin
circlefin
江湖只有他的大名,没有他的介绍。