5 个版本 (稳定)
3.0.0 | 2024 年 7 月 11 日 |
---|---|
2.0.0 | 2024 年 5 月 1 日 |
2.0.0-rc | 2024 年 4 月 25 日 |
1.4.0 |
|
1.2.2 | 2024 年 1 月 24 日 |
#245 in 魔法豆
3,170 每月下载
在 2 个 crate 中使用 (通过 abstract-cw-plus-interfac…)
120KB
2K SLoC
CW20 ICS20
这是一个 IBC 启用 合约,允许我们从一条链通过标准 ICS20 协议将 CW20 代币发送到另一条链的银行模块。简而言之,它让我们可以用 IBC 发送自定义的 CW20 代币,就像在其他链上使用原生代币一样。
它仅设计用于发送代币和赎回之前发送的代币。它不会铸造来自外链的资产所属的代币。这与 Golang 的 ibctransfer
模块不同,但我们正确实现了 ICS20 并返回错误信息……希望 Go 端能正确处理。
工作流程
合约以最小的状态开始。它仅存储所有发送数据包的默认超时时间(秒)。最重要的是,它绑定一个本地 IBC 端口以启用通道连接。
外部方首先需要使用此合约作为端点之一创建一个或多个通道。它将使用标准的 ics20 无序通道进行版本协商。一旦建立,它将管理已知通道的列表。您可以使用 ts-relayer ibc-setup ics20
命令来创建这些通道。
至少有一个通道后,您可以通过 接收模式 将任何 CW20 代币发送到该合约。接收消息必须包含要发送的通道和要发送的远程地址。它可以选择包含自定义的超时时间。
消息
它只接受来自 cw20 合约的 CW20ReceiveMsg。与该消息一起发送的数据必须是 JSON 序列化的 TransferMsg。
pub struct TransferMsg {
/// The local channel to send the packets on
pub channel: String,
/// The remote address to send to
/// Don't use HumanAddress as this will likely have a different Bech32 prefix than we use
/// and cannot be validated locally
pub remote_address: String,
/// How long the packet lives in seconds. If not specified, use default_timeout
pub timeout: Option<u64>,
}
此外,它支持通过 ExecuteMsg::Transfer(TransferMsg)
直接发送原生代币。您必须与转账消息一起发送 正好一个 代币名称,该金额将被转移到远程主机。
查询
查询相对于此合约已建立的通道才有意义。
Port{}
- 返回此合约已绑定的端口 ID,因此您可以创建通道。此信息可以通过 wasmd 合约信息查询获取,但我们在此提供了另一个方便的查询。ListChannels{}
- 返回一个(目前未分页的)列表,列出了在此合约上创建的所有通道。返回它们的本地 channelId 以及一些基本元数据,例如远程端口/通道以及它们运行的连接。Channel{id}
- 返回一个特定通道的更详细信息。除了列表视图中的信息外,它还返回该通道上的当前未结算余额以及该通道上已发送的总金额。
IBC 响应
这些由 ICS20 规范定义。
值得注意的是,每个通道都有一个在该通道上发送的代币余额。如果收到一个我们不知道的代币名称的转账请求,或者余额大于我们发送的余额,我们将在确认包中返回错误。
依赖项
~5–17MB
~191K SLoC