April 10, 2023

SmartContract на LayerZero

  1. Идём в наш любимый всеми REMIX - https://remix.ethereum.org/
  2. Создаём файл с любым названиям.

3. Вставляем код:

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.17;

import https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/lzApp/NonblockingLzApp.sol;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Harmony is NonblockingLzApp, ERC20 {
    uint16 destChainId;

    constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) ERC20("Cross Chain Token", "CCT") {
        if (_lzEndpoint == 0x9740FF91F1985D8d2B71494aE1A2f723bb3Ed9E4) destChainId = 109;
        if (_lzEndpoint == 0x3c2269811836af69497E5F486A85D7316753cf62) destChainId = 116;
        _mint(msg.sender, 1000000 * 10 ** decimals());
    }

    function _nonblockingLzReceive(uint16, bytes memory, uint64, bytes memory _payload) internal override {
       (address toAddress, uint amount) = abi.decode(_payload, (address,uint));
       _mint(toAddress, amount);
    }

    function bridge(uint _amount) public payable {
        _burn(msg.sender, _amount);
        bytes memory payload = abi.encode(msg.sender, _amount);
        _lzSend(destChainId, payload, payable(msg.sender), address(0x0), bytes(""), msg.value);
    }

    function trustAddress(address _otherContract) public onlyOwner {
        trustedRemoteLookup[destChainId] = abi.encodePacked(_otherContract, address(this));   
    }
}

Проверяйте, в том ли “рабочем пространстве” вы работаете.

В контракте есть Endpoint и ChainId тех сетей в которых мы будем деплоить контракт. Для других сетей список Endpoint и ChainId смотрим тут: https://layerzero.gitbook.io/docs/technical-reference/mainnet/supported-chain-ids

ВАЖНО: Endpoint из списка выше не должны быть одинаковыми, то есть нельзя деплоить Arbitrum-Optimism, на нашем примере мы будем деплоить за копейки в Fantom и Polygon. У вас должно быть немного токенов в обеих сетях для оплаты комиссии, так как сети популярны, они у вас должны быть. Если нет, ищите сети где есть(и деплойте там, просто поменяв значения).

ВАЖНО: Endpoint и ChainId уже вписаны в контракте (ChainId всегда нужно вставлять перекрестно, если будете деплоить в других сетях)

Сравните:

Чтобы вам было проще и интереснее, перед каждым деплоем лучше переименовывать контракт названием сети в которой будем деплоить. Для Polygon уже всё готово, поэтому контракт выглядит так:

4. Приступим к самому деплою. Нажимаем Ctrl+S или зеленый треугольник сверху и компилируем наш контракт. Дальше, в METAMASK выставляем сеть деплоя(у нас это Polygon) Polygon, нажимаем на значок эфира слева, выбираем в ENVIRONMENT как обычно Injected Provider и вставляем эндпоинт Polygon (0x3c2269811836af69497E5F486A85D7316753cf62) в окошко Deploy и нажимаем саму кнопку, предварительно выставив Gas Limit вверху на 3000000. И подтверждаем транзакцию в метамаске.

Дальше проверяем снизу, должно быть так. Готово:

После чего, деплоим в сети Fantom. Для этого в контракте меняем название на "Fantom", и меняем ENDPOINT около кнопки Deploy на ендпоинт Fantomа и жмём Деплой(не забыв при этом сменить сеть на Fantom в метамаске) + подтверждаем транзакцию:

После того как у нас получилось 2 контракта. Нам нужно сделать эти контракты доверенными.

Для этого:

  1. Находясь в сети Polygon копируем адрес созданного контракта Fantom
  2. Открываем функции контракта Polygon галочкой слева
  3. Вставляем его в TrustAddress
  4. Нажимаем кнопку(TrustAddress) и подтверждаем в Метамаске
  5. Меняем сеть на Fantom, копируем контракт Polygon и вставляем в TrustAddress.

Дальше видим такую картинку и радуемся, гайд подошёл к концу и вы справились. Поздравляю.