Страница переведена сообществом и носит справочный характер; актуальна английская версия.
Оригинал ↗

Переводы HyperCore <> HyperEVM

Введение

Спот-активы можно отправлять между HyperCore и HyperEVM. В контексте этих переводов спот-активы на HyperCore называются Core spot, а на EVM — EVM spot. Деплойер спота может связать свой Core-спот-актив с любым ERC20-контрактом, развёрнутым в EVM. Core-спот-актив и ERC20-токен могут быть развёрнуты в любом порядке.

Как нативный токен HyperCore, HYPE также связывается с нативным балансом HyperEVM, а не с ERC20-контрактом.

Системные адреса

Каждый токен имеет системный адрес в Core: это адрес с первым байтом 0x20 и остальными байтами, равными нулю, за исключением индекса токена, закодированного в формате big-endian. Например, для индекса токена 200 системный адрес будет 0x20000000000000000000000000000000000000c8 .

Исключение — HYPE, его системный адрес 0x2222222222222222222222222222222222222222 .

Перевод HYPE

HYPE — особый случай, поскольку это нативный газовый токен HyperEVM. На стороне EVM при переводе HYPE принимается как нативный газовый токен, а не как ERC20-токен. Для перевода обратно в HyperCore HYPE можно отправить как значение транзакции. EVM-адрес перевода 0x222..2 — системный контракт, который эмиссирует event Received(address indexed user, uint256 amount) в своей payable-функции receive(). Здесь user — это msg.sender, поэтому такая реализация позволяет и смарт-контрактам, и EOA переводить HYPE обратно в HyperCore. Обратите внимание, что эмиссия этого лога на стороне EVM имеет небольшую стоимость газа.

Переводы между Core и EVM

Только после привязки токена его можно конвертировать между спотом HyperCore и HyperEVM действием sendAsset (или через фронтенд), а на EVM — с помощью ERC20-перевода.

Перевод токенов из HyperCore в HyperEVM выполняется действием sendAsset (или через фронтенд) с соответствующим системным адресом в качестве получателя. Токены зачисляются системной транзакцией, которая вызывает transfer(recipient, amount) на привязанном контракте от имени системного адреса, где recipient — отправитель действия sendAsset.

Перевод токенов из HyperEVM в HyperCore выполняется ERC20-переводом с соответствующим системным адресом в качестве получателя. Токены зачисляются в Core на основе эмиссии Transfer(address from, address to, uint256 value) из привязанного контракта.

Не следует слепо предполагать точную взаимозаменяемость между Core-спотом и EVM-спотом. Подробнее см. #caveats.

Стоимость газа

Перевод из HyperEVM в HyperCore стоит примерно столько же газа, сколько эквивалентный перевод ERC20-токена или HYPE на любой другой адрес HyperEVM с существующим балансом.

Перевод из HyperCore в HyperEVM стоит 200k газа по базовой цене газа следующего блока HyperEVM.

Привязка спот-активов Core и EVM

Чтобы переводы между Core-спотом и EVM-спотом работали, системный адрес токена должен располагать всем не-системным балансом на другой стороне. Например, для развёртывания ERC20-контракта под существующий Core-спот-актив системный контракт должен содержать всё EVM-спот-предложение, равное максимальному предложению Core-спота.\ \ Когда это сделано, деплойеру спота нужно отправить deploy-действие спота для привязки токена к 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 одним из двух способов:

  1. Если EVM-контракт был развёрнут из EOA, пользователь EVM может отправить действие с nonce, который использовался для развёртывания EVM-контракта.
  2. Если EVM-контракт был развёрнут другим контрактом (например, create2 через мультисиг), первый слот хранения контракта или слот по keccak256("HyperCore deployer") должен хранить адрес пользователя-финализатора.

Для финализации привязки пользователь-финализатор отправляет следующее действие (обратите внимание, что оно не вложено в deploy-действие спота). В случае "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, поэтому будьте осторожны при отправке средств.

В частности, привязанный контракт может иметь произвольный байткод, поэтому благоразумно проверить корректность его реализации. Нет никаких гарантий относительно того, что делает вызов transfer на EVM, поэтому обязательно проверьте исходный код и общий баланс привязанного EVM-контракта.

Если EVM-контракт имеет дополнительные знаки Wei, и соответствующий эмиссируемый лог имеет некруглое значение (не заканчивается на extraEvmWeiDecimals нулей), некруглая часть сжигается (гарантированно <1 Wei). Это верно как для HYPE, так и для любых других спот-токенов.

PURR майннета

PURR майннета развёрнут как ERC20-контракт по адресу 0x9b498C3c8A0b8CD8BA1D9851d40D186F1872b44E со следующим кодом. Он будет привязан к PURR на HyperCore, когда привязка будет включена на майннете.

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

Официальный источник: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/hyperevm/hypercore-less-than-greater-than-hyperevm-transfers
Дата снимка: · Дата сборки: · Перевод сообщества; приоритет у английской версии
Неофициальный перевод сообщества. Права на контент принадлежат Hyperliquid; актуальна английская версия. Источник: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/hyperevm/hypercore-less-than-greater-than-hyperevm-transfers