一、概述
IBC ERC20功能是通过Cosmos IBC跨链协议,将Cosmos生态中的native token与OKC生态中erc20 token关联起来,实现资产跨链转换。主要包括两部分:
- 将Cosmos生态中的native token跨链到OKC,成为OKC EVM erc20 token,参与OKC EVM生态;同时,可以将该OKC erc20 token通过IBC跨链协议原路返回到Cosmos生态链,转换为cosmos native token;
- 将OKC原生EVM erc20 token跨链到Cosmos生态中成为native token,同时也可以将该cosmos native token通过IBC跨链协议原路返回到OKC,成为EVM erc20 token。
注意区分以上两种情况,一中token是来源于OKC外其他cosmos链的native token;二中token为OKC上原本就存在的erc20 token,并非是来自于一中的自动部署。
二、Cosmos Native token跨链到OKC
1. 如何确定对应的erc20合约?
通过IBC 将Cosmos生态中的native token转到OKC上成为erc20 token,需要在OKC上部署对应的ERC20合约。这个ERC20合约有两个来源:
OKC链内自动部署
OKC中内置了IBC ERC20合约,该合约实现了所需的必要接口。如果OKC erc20模块参数enable_auto_deployment=true
,IBC跨链过来的是cosmos native token时,自动部署合约,并维护该ibc token(来自于cosmos native token)与合约地址的映射关系,将native token转化为同等数量的erc20 token给目标账户。
项目方/用户手动部署
如果项目方对ERC20合约有个性化的功能需求,可以自己编写合约代码,部署到OKC,并通过发起币对映射提案(TokenMappingProposal)实现IBC token与ERC20合约的映射关系。
此时,请务必参照内置合约,严格实现以下内容,才能准确的实现该功能:
2. 跨链到OKC的cosmos native token一定会转换为erc20 token吗?
默认情况下,IBC跨链到OKC上的cosmos native token会在OKC中依然保持为ibc token,但denom按IBC协议规则变为ibc/xxxxx
这种形式。
只有在以下两种情况下,OKC才会将IBC token转换为ERC20 token:
OKC开启自动部署合约
通过erc20模块参数enable_auto_deployment=true
开启。
OKC链上有对应ibc token与ERC20合约的映射关系
通过发起币对映射提案(TokenMappingProposal)开启。
否则,IBC跨链过来的cosmos native token会在OKC中依然保持为ibc token,即ibc/xxxxx。
3. 跨链过来的erc20 token如何返回源链,成为cosmos native token?
根据以上描述,Cosmos native token跨链到OKC上后,有以下两种状态并需要用不同的方式才能将token转回到源链:
使用基本的IBC操作方式即可将token转回到源链。比如keplr钱包。
此时需要调用对应erc20合约的send_to_ibc
,该方法只需提供源链的接收账户地址和转账金额,即可将erc20 token原路返回到源链,恢复成为原来的cosmos native token。
三、原生的OKC erc20 token跨链到Cosmos
1. 该功能对erc20合约的规范要求
支持原生OKC erc20 token通过IBC跨链转出,erc20合约代码必须参照这里,实现如下内容:
- Method:
mint_by_okc_module
- Method:
send_native20_to_ibc
- Event:
__OKCSendNative20ToIbc
2. 必须提案币种映射才能将erc20通过IBC跨链出去
该应用场景中的erc20是在OKC上原本就存在的,如果需要支持IBC跨链转出,除了合约必须实现上面提到的method和event外,还必须通过发起提案,建立erc20合约地址与OKC token的映射关系,投票通过后生效。
操作示例如下:
exchaincli tx gov submit-proposal token-mapping okb 0x45dD91b0289E60D89Cec94dF0Aac3a2f539c514a --title="token-mapping" --description="token-mapping" --deposit 1000okt --from=userA
其中,
okb
为指定的OKC上token名,可使用任意符合币名规范的值。
0x45dD91b0289E60D89Cec94dF0Aac3a2f539c514a
为erc20合约地址。此处也可填写""
,表示删除已经存在的token映射关系。
可以通过exchaincli query erc20 token-mapping
查询OKC链上存在的映射关系。
3. 如何操作erc20跨链
erc20合约与映射关系准备完成后,即可开始操作erc20的IBC跨链。
调用合约send_native20_to_ibc
指定目标链接收账户地址、转账数量、IBC portID和IBC channelID。其中portID和channelID可以参照这里。
4. 跨链出去的erc20如何返回OKC
erc20跨链转出后,在目标链上以cosmos ibc token形式存在(如果目标链没有做特殊处理)。此时可以通过目标链提供的IBC转账工具,如keplr钱包、跨链桥等,指定对应的channel和port(转出时所对应的channel和port)将token转回至OKC。
OKC收到转回的token后,
- 如果映射关系存在且合约正常,则转换为erc20 token
- 如果映射关系存在,但合约执行出错,则本次IBC跨链失败
- 如果映射关系已被删除,则在OKC中维持为token状态,对应的token为之前注册映射关系使用的token。