Questa pagina è una traduzione della community e ha solo scopo informativo; fa fede la versione originale in inglese.
Versione originale ↗

Trasferimenti HyperCore <> HyperEVM

Introduzione

Gli asset spot possono essere inviati tra HyperCore e HyperEVM. Nel contesto di questi trasferimenti, gli asset spot su HyperCore sono denominati Core spot, mentre quelli sull'EVM sono denominati EVM spot. Lo spot deployer può collegare il proprio asset Core spot a un qualsiasi contratto ERC20 distribuito sull'EVM. L'asset Core spot e il token ERC20 possono essere distribuiti in qualsiasi ordine.

In quanto token nativo su HyperCore, HYPE si collega anche al saldo nativo di HyperEVM anziché a un contratto ERC20.

Indirizzi di sistema

Ogni token ha un indirizzo di sistema su Core, ossia l'indirizzo con primo byte 0x20 e tutti i byte rimanenti a zero, a eccezione dell'indice del token codificato in formato big-endian. Ad esempio, per l'indice di token 200, l'indirizzo di sistema sarebbe 0x20000000000000000000000000000000000000c8 .

L'eccezione è HYPE, che ha un indirizzo di sistema pari a 0x2222222222222222222222222222222222222222 .

Trasferimento di HYPE

HYPE è un caso speciale in quanto token gas nativo su HyperEVM. HYPE viene ricevuto sul lato EVM di un trasferimento come token gas nativo anziché come token ERC20. Per tornare a HyperCore, HYPE può essere inviato come valore della transazione. L'indirizzo di trasferimento EVM 0x222..2 è un contratto di sistema che emette event Received(address indexed user, uint256 amount) come propria funzione payable receive(). Qui user è msg.sender, pertanto questa implementazione consente sia agli smart contract sia agli EOA di trasferire HYPE nuovamente a HyperCore. Si noti che l'emissione di questo log sul lato EVM comporta un piccolo costo in gas.

Trasferimento tra Core ed EVM

Solo dopo che un token è stato collegato, può essere convertito tra spot HyperCore e HyperEVM tramite un'azione sendAsset (oppure via frontend) e sull'EVM mediante un trasferimento ERC20.

Il trasferimento di token da HyperCore a HyperEVM può essere effettuato tramite un'azione sendAsset (oppure via frontend) con il corrispondente indirizzo di sistema come destinazione. I token vengono accreditati da una transazione di sistema che chiama transfer(recipient, amount) sul contratto collegato come indirizzo di sistema, dove recipient è il mittente dell'azione sendAsset.

Il trasferimento di token da HyperEVM a HyperCore può essere effettuato tramite un trasferimento ERC20 con il corrispondente indirizzo di sistema come destinazione. I token vengono accreditati su Core in base al Transfer(address from, address to, uint256 value) emesso dal contratto collegato.

Non dare per scontata ciecamente la fungibilità accurata tra spot Core ed EVM. Per ulteriori dettagli, si veda #caveats.

Costi del gas

Un trasferimento da HyperEVM a HyperCore comporta un costo in gas simile a quello del trasferimento equivalente del token ERC20 o di HYPE verso qualsiasi altro indirizzo su HyperEVM che abbia un saldo esistente.

Un trasferimento da HyperCore a HyperEVM costa 200k gas al prezzo base del gas del blocco HyperEVM successivo.

Collegamento degli asset spot Core ed EVM

Affinché i trasferimenti tra Core spot ed EVM spot funzionino, l'indirizzo di sistema del token deve detenere l'intero saldo non di sistema sull'altro lato. Ad esempio, per distribuire un contratto ERC20 per un asset Core spot esistente, il contratto di sistema dovrebbe detenere l'intera offerta di EVM spot pari all'offerta massima di Core spot.\ \ Una volta completata questa operazione, lo spot deployer deve inviare un'azione di spot deploy per collegare il token all'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;
}

Dopo l'invio di questa azione, HyperCore memorizzerà l'indirizzo EVM in attesa di collegamento. Il deployer del contratto EVM deve quindi confermare la propria intenzione di collegarsi al token HyperCore in uno dei due modi seguenti:

  1. Se il contratto EVM è stato distribuito da un EOA, l'utente EVM può inviare un'azione utilizzando il nonce impiegato per distribuire il contratto EVM.
  2. Se il contratto EVM è stato distribuito da un altro contratto (ad esempio create2 tramite multisig), il primo slot di storage del contratto oppure lo slot in corrispondenza di keccak256("HyperCore deployer") deve memorizzare l'indirizzo di un utente finalizzatore.

Per finalizzare il collegamento, l'utente finalizzatore invia la seguente azione (si noti che questa non è annidata in un'azione di spot deploy). Nel caso "create", l'azione viene inviata dal deployer EVM. Nei casi "firstStorageSlot" o "customStorageSlot", il finalizzatore deve corrispondere al valore nello slot corrispondente.

/**
 * @param input - One of the EVM deployer options above
 */
interface FinalizeEvmContract {
  type: “finalizeEvmContract”;
  token: number;
  input: {"create": {"nonce": number}} | "firstStorageSlot" | "customStorageSlot"};
}

Avvertenze

Attualmente non vi sono controlli che l'indirizzo di sistema disponga di un'offerta sufficiente o che il contratto sia un ERC20 valido, pertanto si presti attenzione durante l'invio dei fondi.

In particolare, il contratto collegato può avere bytecode arbitrario, quindi è prudente verificarne la correttezza dell'implementazione. Non vi sono garanzie su ciò che la chiamata transfer comporta sull'EVM, pertanto assicurarsi di verificare il codice sorgente e il saldo totale del contratto EVM collegato.

Se il contratto EVM ha decimali Wei aggiuntivi, allora se il log pertinente emesso ha un valore non tondo (che non termina con extraEvmWeiDecimals zeri), l'importo non tondo viene bruciato (garantito essere <1 Wei). Questo vale sia per HYPE sia per qualsiasi altro token spot.

PURR su mainnet

PURR su mainnet è distribuito come contratto ERC20 all'indirizzo 0x9b498C3c8A0b8CD8BA1D9851d40D186F1872b44E con il codice seguente. Verrà collegato a PURR su HyperCore una volta che il collegamento sarà abilitato su mainnet.

// 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());
    }
}

Note finali

In allegato è disponibile uno script di esempio per distribuire un token ERC20 sull'EVM e collegarlo a un token Core spot.

{% file src="/files/ByYbxCDq0BaOoY6akDhN" %}

Fonte ufficiale: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/hyperevm/hypercore-less-than-greater-than-hyperevm-transfers
Istantanea della fonte: · Mirror generato: · Traduzione della community; fa fede la versione inglese
Traduzione non ufficiale della community della documentazione Hyperliquid. Contenuti © Hyperliquid; fa fede la versione inglese. Fonte: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/hyperevm/hypercore-less-than-greater-than-hyperevm-transfers