HyperCore <> HyperEVM 划转
简介
现货资产可以在 HyperCore 与 HyperEVM 之间发送。在此类划转的语境中,HyperCore 上的现货资产称为 Core spot,EVM 上的称为 EVM spot。现货部署者可以将其 Core spot 资产链接到部署在 EVM 上的任意 ERC20 合约。Core spot 资产与 ERC20 代币可以按任意先后顺序部署。
作为 HyperCore 上的原生代币,HYPE 链接的是 HyperEVM 的原生余额而非 ERC20 合约。
系统地址
每个代币在 Core 上都有一个系统地址:首字节为 0x20,其余字节除以大端序编码的代币索引外全为零。例如,代币索引 200 的系统地址为 0x20000000000000000000000000000000000000c8。
例外是 HYPE,其系统地址为 0x2222222222222222222222222222222222222222。
划转 HYPE
HYPE 是特殊情况,因为它是 HyperEVM 上的原生 Gas 代币。在划转的 EVM 一侧,HYPE 以原生 Gas 代币而非 ERC20 代币的形式被接收。要划回 HyperCore,HYPE 可以作为交易值发送。EVM 划转地址 0x222..2 是一个系统合约,其 payable receive() 函数会发出 event Received(address indexed user, uint256 amount)。这里 user 即 msg.sender,因此该实现使智能合约和 EOA 都能将 HYPE 划回 HyperCore。注意,在 EVM 一侧发出该日志会产生少量 Gas 成本。
在 Core 与 EVM 之间划转
只有代币完成链接后,才可以在 HyperCore 与 HyperEVM 现货之间转换:在 HyperCore 侧使用 sendAsset 操作(或通过前端),在 EVM 侧使用 ERC20 转账。
将代币从 HyperCore 划转到 HyperEVM,可以使用 sendAsset 操作(或通过前端),并以相应的系统地址作为目的地。代币由一笔系统交易入账:该交易以系统地址身份调用链接合约上的 transfer(recipient, amount),其中 recipient 是 sendAsset 操作的发送者。
将代币从 HyperEVM 划转到 HyperCore,可以使用 ERC20 转账,并以相应的系统地址作为目的地。代币根据链接合约发出的 Transfer(address from, address to, uint256 value) 事件入账到 Core。
不要盲目假设 Core 与 EVM 现货之间具有精确的可互换性。详情参见 #caveats。
Gas 成本
从 HyperEVM 划转到 HyperCore 的 Gas 成本,与将等量 ERC20 代币或 HYPE 转账到 HyperEVM 上已有余额的其他地址相当。
从 HyperCore 划转到 HyperEVM 的成本为按下一个 HyperEVM 区块基础 Gas 价格计的 200k Gas。
链接 Core 与 EVM 现货资产
为了使 Core spot 与 EVM spot 之间的划转生效,代币的系统地址必须持有另一侧的全部非系统余额。例如,要为现有 Core spot 资产部署 ERC20 合约,系统合约应持有全部 EVM spot 供应量,等于 Core spot 的最大供应量。\ \ 完成后,现货部署者需要发送一个现货部署操作,将代币链接到 EVM:
/**
* @param token - The token index to link
* @param address - The address of the ERC20 contract on the evm.
* @param evmExtraWeiDecimals - The difference in Wei decimals between Core and EVM spot. E.g. Core PURR has 5 weiDecimals but EVM PURR has 18, so this would be 13. evmExtraWeiDecimals should be in the range [-2, 18] inclusive
*/
interface RequestEvmContract {
type: “requestEvmContract”;
token: number;
Address: address;
evmExtraWeiDecimals: number;
}
发送该操作后,HyperCore 会存储待链接的 EVM 地址。EVM 合约的部署者随后必须通过以下两种方式之一验证其链接到 HyperCore 代币的意图:
- 如果 EVM 合约由 EOA 部署,EVM 用户可以使用部署该 EVM 合约时所用的 nonce 发送操作。
- 如果 EVM 合约由另一个合约部署(例如通过多签的 create2),合约的第一个存储槽或 keccak256("HyperCore deployer") 处的存储槽必须存储一个 finalizer 用户的地址。
为完成链接,finalizer 用户发送以下操作(注意该操作不嵌套在现货部署操作中)。在 "create" 的情况下,由 EVM 部署者发送该操作;在 "firstStorageSlot" 或 "customStorageSlot" 的情况下,finalizer 必须与对应存储槽中的值匹配。
/**
* @param input - One of the EVM deployer options above
*/
interface FinalizeEvmContract {
type: “finalizeEvmContract”;
token: number;
input: {"create": {"nonce": number}} | "firstStorageSlot" | "customStorageSlot"};
}
注意事项
目前不会检查系统地址是否有足够供应量,也不会检查合约是否为有效的 ERC20,因此发送资金时请谨慎。
尤其是,被链接的合约可能包含任意字节码,因此谨慎起见应验证其实现是否正确。transfer 调用在 EVM 上的行为没有任何保证,请务必验证被链接 EVM 合约的源代码和总余额。
如果 EVM 合约存在额外的 Wei 小数位,且相关日志发出的数值不是整数(结尾没有 extraEvmWeiDecimals 个零),则非整数部分将被销毁(保证 <1 Wei)。这对 HYPE 和其他任何现货代币都成立。
主网 PURR
主网 PURR 作为 ERC20 合约部署在 0x9b498C3c8A0b8CD8BA1D9851d40D186F1872b44E,代码如下。待主网启用链接功能后,它将与 HyperCore 上的 PURR 链接。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
contract Purr is ERC20Permit {
constructor() ERC20("Purr", "PURR") ERC20Permit("Purr") {
address initialHolder = 0x2000000000000000000000000000000000000001;
uint256 initialBalance = 600000000;
_mint(initialHolder, initialBalance * 10 ** decimals());
}
}
最后说明
随附一个示例脚本,用于将 ERC20 代币部署到 EVM 并将其链接到 Core 现货代币。
{% file src="/files/ByYbxCDq0BaOoY6akDhN" %}