HyperCore <> HyperEVM 이체
소개
스팟 자산은 HyperCore와 HyperEVM 간에 전송될 수 있습니다. 이 이체 맥락에서 HyperCore의 스팟 자산은 Core spot이라고 불리고, EVM의 스팟 자산은 EVM spot이라고 불립니다. 스팟 디플로이어는 자신의 Core 스팟 자산을 EVM에 배포된 임의의 ERC20 컨트랙트에 연결(link)할 수 있습니다. Core 스팟 자산과 ERC20 토큰은 어느 순서로든 배포할 수 있습니다.
HyperCore의 네이티브 토큰인 HYPE도 ERC20 컨트랙트가 아닌 HyperEVM의 네이티브 잔액에 연결됩니다.
시스템 주소
모든 토큰은 Core에 시스템 주소를 가지며, 이는 첫 번째 바이트가 0x20이고 나머지 바이트가 모두 0인 주소이되, 토큰 인덱스는 빅엔디언 형식으로 인코딩됩니다. 예를 들어 토큰 인덱스 200의 시스템 주소는 0x20000000000000000000000000000000000000c8입니다.
예외는 HYPE로, 시스템 주소가 0x2222222222222222222222222222222222222222입니다.
HYPE 이체
HYPE는 HyperEVM의 네이티브 가스 토큰이므로 특별한 경우입니다. 이체 시 HYPE는 EVM 측에서 ERC20 토큰 대신 네이티브 가스 토큰으로 수령됩니다. HyperCore로 다시 이체하려면 HYPE를 트랜잭션 값으로 보내면 됩니다. EVM 이체 주소 0x222..2는 payable receive() 함수로서 event Received(address indexed user, uint256 amount)을 발생시키는 시스템 컨트랙트입니다. 여기서 user는 msg.sender이므로, 이 구현을 통해 스마트 컨트랙트와 EOA 모두 HyperCore로 HYPE를 되돌려 보낼 수 있습니다. EVM 측에서 이 로그를 발생시키는 데 약간의 가스 비용이 든다는 점에 유의하세요.
Core와 EVM 간 이체
토큰은 연결(link)된 후에야 sendAsset 액션(또는 프론트엔드를 통해)으로 HyperCore와 HyperEVM 스팟 간에 변환될 수 있으며, EVM에서는 ERC20 transfer를 사용합니다.
HyperCore에서 HyperEVM으로 토큰을 전송하는 것은 해당 시스템 주소를 목적지로 하는 sendAsset 액션(또는 프론트엔드 사용)으로 수행할 수 있습니다. 토큰은 연결된 컨트랙트에 대해 시스템 주소로 transfer(recipient, amount)을 호출하는 시스템 트랜잭션에 의해 입금되며, 여기서 recipient는 sendAsset 액션의 발신자입니다.
HyperEVM에서 HyperCore로 토큰을 전송하는 것은 해당 시스템 주소를 목적지로 하는 ERC20 transfer로 수행할 수 있습니다. 토큰은 연결된 컨트랙트에서 발생하는 Transfer(address from, address to, uint256 value)를 기반으로 Core에 입금됩니다.
Core와 EVM 스팟 간의 정확한 교체 가능성(fungibility)을 맹목적으로 가정하지 마세요. 자세한 내용은 #caveats를 참고하세요.
가스 비용
HyperEVM에서 HyperCore로의 이체는 해당 ERC20 토큰 또는 HYPE를, HyperEVM에서 기존 잔액이 있는 다른 주소로 이체하는 것과 비슷한 가스가 듭니다.
HyperCore에서 HyperEVM으로의 이체는 다음 HyperEVM 블록의 기본 가스 가격으로 200k 가스가 듭니다.
Core와 EVM 스팟 자산 연결
Core 스팟과 EVM 스팟 간의 이체가 작동하려면 토큰의 시스템 주소가 다른 쪽의 총 비시스템 잔액을 보유해야 합니다. 예를 들어, 기존 Core 스팟 자산용 ERC20 컨트랙트를 배포하려면 시스템 컨트랙트가 최대 Core 스팟 공급량과 동일한 EVM 스팟 공급량 전체를 보유해야 합니다.\ \ 이 작업이 완료되면 스팟 디플로이어가 토큰을 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 컨트랙트를 배포하는 데 사용된 논스를 사용해 액션을 보낼 수 있습니다.
- EVM 컨트랙트가 다른 컨트랙트에 의해 배포된 경우(예: 멀티시그를 통한 create2), 해당 컨트랙트의 첫 번째 스토리지 슬롯 또는 keccak256("HyperCore deployer") 위치의 슬롯이 파이널라이저 사용자의 주소를 저장해야 합니다.
연결을 확정(finalize)하려면 파이널라이저 사용자가 다음 액션을 보냅니다(이 액션은 스팟 배포 액션 안에 중첩되지 않는다는 점에 유의). "create" 경우에는 EVM 디플로이어가 액션을 보냅니다. "firstStorageSlot" 또는 "customStorageSlot" 경우에는 파이널라이저가 해당 슬롯의 값과 일치해야 합니다.
/**
* @param input - One of the EVM deployer options above
*/
interface FinalizeEvmContract {
type: “finalizeEvmContract”;
token: number;
input: {"create": {"nonce": number}} | "firstStorageSlot" | "customStorageSlot"};
}
주의 사항
현재 시스템 주소에 충분한 공급량이 있는지 또는 컨트랙트가 유효한 ERC20인지 검사하지 않으므로, 자금을 보낼 때 주의하세요.
특히 연결된 컨트랙트는 임의의 바이트코드를 가질 수 있으므로, 해당 구현이 올바른지 확인하는 것이 신중한 접근입니다. EVM에서 transfer 호출이 수행하는 작업에 대해서는 보장이 없으므로, 연결된 EVM 컨트랙트의 소스 코드와 총 잔액을 반드시 확인하세요.
EVM 컨트랙트에 추가 Wei 소수 자릿수가 있는 경우, 관련 로그가 발생한 값이 라운드가 아니면(끝이 extraEvmWeiDecimals개의 0이 아니면), 라운드가 아닌 금액이 소각됩니다(1 Wei 미만임이 보장됨). 이는 HYPE와 다른 모든 스팟 토큰 모두에 해당합니다.
메인넷 PURR
메인넷 PURR은 다음 코드와 함께 0x9b498C3c8A0b8CD8BA1D9851d40D186F1872b44E에 ERC20 컨트랙트로 배포되어 있습니다. 메인넷에서 연결이 활성화되면 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());
}
}
마지막 참고 사항
EVM에 ERC20 토큰을 배포하고 Core 스팟 토큰에 연결하는 샘플 스크립트가 첨부되어 있습니다.
{% file src="/files/ByYbxCDq0BaOoY6akDhN" %}