4个稳定版本
2.4.2 | 2024年7月22日 |
---|---|
2.4.0 | 2024年7月21日 |
2.3.0 | 2023年10月18日 |
#12 in #chains
110KB
2K SLoC
cw-tokenfactory-issuer
从 osmosis-labs/cw-tokenfactory-issuer 分支。
此仓库包含一组合约,当与Osmosis、Juno和许多其他链中的x/tokenfactory模块结合使用时,将启用具有许多功能的中心发行的稳定币。
- 创建新的Token Factory代币或使用现有的代币
- 授予和撤销代币铸造和销毁的许可
- 更新代币元数据
- 更新合约所有者或Token Factory管理员
- 还有更多!(见高级功能)
它旨在在支持Token Factory的多个链上工作,并在Juno网络和Osmosis上进行了测试。
合约有一个所有者(可以通过ExecuteMsg::UpdateOwnership {}
进行移除或更新),但它可以将功能委托给其他账户。例如,合约所有者可以将1000个代币的铸造许可委托给新的地址。
此合约的拥有权功能使用cw-ownable
库实现。
cw_tokenfactory_issuer
合约也是新创建的Token Factory denom的管理员。对于铸造和销毁,用户然后通过合约的ExecuteMsg与其交互,这会触发合约的访问控制逻辑,然后合约从其自己的合约账户发送tokenfactory sdk.Msgs。
实例化
在实例化cw-tokenfactory-issuer
时,您可以创建一个new
或一个existing
。
创建新的Token Factory代币
要创建一个新的Token Factory代币,只需使用subdenom
实例化合约,这将创建一个新的合约以及一个格式为factory/{contract_address}/{subdenom}
的代币。
示例实例化消息
{
"new_token": {
"subdenom": "test"
}
}
之后的所有更新都可以通过此合约的ExecuteMsg
枚举进行。有关可用方法,请参阅src/msg.rs
。
使用现有代币
您还可以使用现有代币实例化此合约,但大多数功能将在之前的Token Factory管理员将管理权限转让给实例化合约并可选地调用ExecuteMsg::SetBeforeSendHook {}
以启用依赖功能之前不可用。
示例实例化消息
{
"existing_token": {
"denom": "factory/{contract_address}/{subdenom}"
}
}
放弃Token Factory管理员
一些DAO或协议在初始设置阶段之后可能希望使其代币不可变,永久禁用此合约的功能。
为此,他们必须执行ExcuteMessage::UpdateTokenFactoryAdmin {}
方法,将管理员设置为空地址或您各自链的银行模块。
例如,在Juno上这可以是
{
"update_token_factory_admin": {
"new_admin": "juno1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"
}
}
Token Factory标准要求每个代币都有一个Token Factory管理员,将地址设置为空将使代币不可变,并且cw-tokenfactory-issuer
将无法进行未来的更新。这是安全的,因为支撑链的密码学强制执行,即使是世界上最大的超级计算机,也需要花费极其巨大的时间来计算此地址的私钥。
高级功能
此合约支持许多高级功能,DAO或代币发行者可能希望利用这些功能
- 冻结和解冻转账,并使用白名单允许指定地址进行转账
- 黑名单以阻止某些地址进行转账
- 通过合约所有者强制转账代币
默认情况下,这些功能是禁用的,必须由合约所有者明确启用(例如通过DAO治理提案)。
此外,为了使这些功能正常工作,您的链必须支持MsgBeforeSendHook
银行模块钩子。这还不是所有使用Token Factory的链都支持的,因此如果MsgBeforeSendHook
不受支持,则黑名单和冻结功能不可用。
在支持MsgBeforeSendHook
的链上,希望利用这些功能的DAO或发行者必须使用ExecuteMsg::SetBeforeSendHook {}
设置发送前钩子。
此方法接受一个cosmwasm_address
,这是实现SudoMsg::BlockBeforeSend
入口点的合约地址。通常这将是cw_tokenfactory_issuer
合约的地址,但可以指定一个自定义合约。此合约包含一个SudoMsg::BlockBeforeSend
钩子,允许拒绝特定账户以及必要时冻结所有转账。
设置发送前钩子的示例消息
{
"set_before_send_hook": {
"cosmwasm_address": "<address of your cw_tokenfactory_issuer contract>"
}
}
DAO或发行方希望在不受支持的链上利用这些功能时,可以在支持添加后调用ExecuteMsg::SetBeforeSendHook {}
。
如果DAO或发行方希望禁用并移除发送前钩子相关的功能,他们只需调用ExecuteMsg::SetBeforeSendHook {}
,并将cosmwasm_address
设置为空字符串,如下所示
{
"set_before_send_hook": {
"cosmwasm_address": ""
}
}
依赖项
~10MB
~206K SLoC