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" %}