> For the complete documentation index, see [llms.txt](https://docs.chiliz.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chiliz.com/pl/tworzenie/zaawansowane/tokeny-omnichain/mostek-base-chiliz-chain.md).

# Most z Base do Chiliz Chain

Aby zmostkować istniejący token z Base do Chiliz Chain, musisz napisać i wdrożyć dwa osobne smart contracty: OFT Adapter na łańcuchu, na którym token już istnieje (Base), oraz Native OFT na łańcuchu docelowym (Chiliz Chain).

{% hint style="info" %}
Pamiętaj, że LayerZero udostępnia [własny QuickStart dla kontraktów OFT](https://docs.layerzero.network/v2/developers/evm/oft/quickstart), a także tutorial uczący, jak [mintować z Base na inny łańcuch EVM](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart), taki jak Chiliz Chain. Ten tutorial używa Optimism jako łańcucha docelowego, ale możesz go zastąpić [szczegółami Chiliz Chain](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart).
{% endhint %}

## Wymagania wstępne

Ten przewodnik wymaga następujących elementów:

* Adresu kontraktu tokena ERC20 na Base.
* Portfela Web3 (takiego jak MetaMask) skonfigurowanego do pracy zarówno z Base, jak i Chiliz Chain.
  * [Zobacz tutaj konfigurację RPC dla Base Mainnet](https://docs.base.org/base-chain/quickstart/connecting-to-base).
  * [Zobacz tutaj konfigurację RPC dla Chiliz Chain](/pl/tworzenie/podstawy/polaczenie-z-chiliz-chain/polaczenie-przez-rpc.md).
* Wystarczającej ilości tokenów gas na każdym łańcuchu, aby opłacić wdrożenia kontraktów oraz opłaty gas za wysyłanie wiadomości.
  * Na Base: tokeny ETH.
  * Na Chiliz Chain: tokeny CHZ.

Użyjemy [Hardhat](https://hardhat.org/) jako środowiska deweloperskiego oraz Node/npx.

## Krok 1: Tworzenie kontraktów

### Przygotowanie `OFTAdapter` na Base

{% hint style="warning" %}
To jest krok przygotowawczy, nie wdrażaj od razu!\
Wdrożenie nastąpi w Kroku 3.
{% endhint %}

Kontrakt `OFTAdapter` działa jako sejf (lockbox) dla twojego istniejącego tokena. Gdy użytkownicy mostkują swoje tokeny z Base, ten kontrakt blokuje oryginalne tokeny ERC20.

Stwórz nowy plik o nazwie `BaseTokenAdapter.sol` w folderze contracts:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

import { OFTAdapter } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTAdapter.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

contract BaseTokenAdapter is OFTAdapter {
    constructor(
        address _token,      // The address of your EXISTING token on Base
        address _lzEndpoint, // The LayerZero V2 Endpoint address on Base
        address _delegate    // The address capable of making configuration changes (usually your wallet)
    ) OFTAdapter(_token, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
Jak widać, ten kontrakt rozszerza [kontrakt OFT Adapter od LayerZero](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFTAdapter.sol), a także standardowy kontrakt `Ownable.sol`, który nadaje klucze administracyjne. Potrzebujesz obu, aby ty, i tylko ty, mógł bezpiecznie połączyć łańcuchy ze sobą.
{% endhint %}

Wdrażając ten kontrakt na Base Mainnet, musisz przekazać adres kontraktu swojego istniejącego tokena jako `_token` oraz adres Base Endpoint V2 (`0x1a44076050125825900e736c501f859c50fE728c`) jako `_lzEndpoint`.

Zobacz wszystkie dostępne endpointy dla Chiliz Chain tutaj:

{% embed url="<https://docs.layerzero.network/v2/deployments/chains/base>" %}

### Przygotowanie `OFT` na Chiliz Chain

Ponieważ token nie istnieje jeszcze natywnie na Chiliz Chain, musisz wdrożyć standardowy kontrakt OFT. Ten kontrakt ma uprawnienia do mintowania nowych tokenów, gdy otrzyma prawidłową wiadomość od OFT Adaptera wdrożonego na Base, oraz do ich palenia, gdy użytkownicy mostkują z powrotem.

Stwórz nowy plik o nazwie `ChilizTokenOFT.sol` w folderze contracts:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

contract ChilizTokenOFT is OFT {
    constructor(
        string memory _name,   // The name of the token (Should match your Base token)
        string memory _symbol, // The symbol of the token (Should match your Base token)
        address _lzEndpoint,   // The LayerZero V2 Endpoint address on Chiliz Chain
        address _delegate      // The address capable of making configuration changes
    ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
Jak widać, ten kontrakt rozszerza [kontrakt OFT od LayerZero](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFT.sol), a także standardowy kontrakt `Ownable.sol`, z tych samych powodów, które wymieniono powyżej.
{% endhint %}

Wdrażając ten kontrakt na Chiliz Chain, upewnij się, że `_name` i `_symbol` pasują do twojego oryginalnego tokena na Base, aby nie wprowadzać użytkowników w błąd. Przekaż adres Chiliz Chain Endpoint V2 (`0x6F475642a6e85809B1c36Fa62763669b1b48DD5B`) jako `_lzEndpoint`.

Zobacz wszystkie dostępne endpointy dla Chiliz Chain tutaj:

{% embed url="<https://docs.layerzero.network/v2/deployments/chains/chiliz>" %}

## Krok 2: Konfiguracja LayerZero

Gdy twoje kontrakty są gotowe, musisz poinformować narzędzia LayerZero, jak się ze sobą łączą. Robi się to za pomocą pliku `layerzero.config.ts` znajdującego się w katalogu głównym twojego projektu Hardhat.

Ten plik konfiguracyjny działa jak plan architektury cross-chain. Mapuje twoje wdrożone smart contracty na ich odpowiednie LayerZero Endpoint ID (EID) i definiuje ścieżki (połączenia) między nimi.

[Simple Config Generator](https://docs.layerzero.network/v2/tools/simple-config) jest zalecanym sposobem generowania konfiguracji okablowania (wiring), ponieważ automatyzuje dwukierunkowe okablowanie i stosuje pod maską zalecane konfiguracje bezpieczeństwa.

Stwórz lub zaktualizuj plik `layerzero.config.ts` w katalogu głównym twojego projektu Hardhat:

```typescript
import { ExecutorOptionType } from '@layerzerolabs/lz-v2-utilities';
import { OAppEnforcedOption, OmniPointHardhat } from '@layerzerolabs/toolbox-hardhat';
import { EndpointId } from '@layerzerolabs/lz-definitions';
import { generateConnectionsConfig } from '@layerzerolabs/metadata-tools';

// Define the Contracts
const baseContract: OmniPointHardhat = {
    eid: EndpointId.BASE_V2_MAINNET,
    contractName: 'BaseTokenAdapter',
};

const chilizContract: OmniPointHardhat = {
    eid: EndpointId.CHILIZ_V2_MAINNET,
    contractName: 'ChilizNativeOFT',
};

// Define standard EVM Gas Limits (Enforced Options)
const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1,  // Standard OFT Transfer
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000, // Execution gas limit
        value: 0,    // Native drop (0 for standard transfers)
    },
];

// Export the Generated Configuration
export default async function () {
    return {
        contracts: [
            { contract: baseContract },
            { contract: chilizContract },
        ],
        // The generator automatically creates the A->B and B->A pathways!
        connections: await generateConnectionsConfig([
            [
                baseContract,      // Source
                chilizContract,    // Destination
                [['LayerZero Labs'], []], // Default DVN Configuration
                [1, 1],                   // Block Confirmations
                [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Execution Options [To Chiliz, To Base]
            ],
        ]),
    };
}
```

Tablica `[EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS]` mówi Executorowi LayerZero, aby wymusił 200 000 jednostek gas przy dostarczaniu wiadomości do Chiliz oraz identycznie 200 000 jednostek gas przy zwracaniu wiadomości do Base.

## Krok 3: Proces wdrożenia

Gdy twoje kontrakty są napisane, a plik `layerzero.config.ts` przygotowany, nadszedł czas, aby wdrożyć kontrakty do ich odpowiednich sieci. Toolbox LayerZero V2 polega na pluginie `hardhat-deploy`, aby efektywnie zarządzać wdrożeniami.

Będziesz musiał stworzyć dwa skrypty wdrożeniowe w katalogu `deploy/` swojego projektu: jeden dla Base Mainnet i jeden dla Chiliz Chain Mainnet.

### Skrypt wdrożenia Base Adapter

Stwórz plik o nazwie `01_deploy_base_adapter.ts` w folderze `deploy/`. Ten skrypt przekazuje adres twojego istniejącego tokena oraz adres Base Endpoint V2 do konstruktora.

```typescript
import { DeployFunction } from 'hardhat-deploy/types';

const deployAdapter: DeployFunction = async ({ getNamedAccounts, deployments }) => {
    const { deploy } = deployments;
    const { deployer } = await getNamedAccounts();

    // The address of your existing ERC-20 token on Base
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // The Base Mainnet Endpoint V2 Address
    const BASE_ENDPOINT_V2 = "0x1a44076050125825900e736c501f859c50fE728c";

    console.log("Deploying OFTAdapter to Base Mainnet...");

    await deploy('BaseTokenAdapter', {
        from: deployer,
        args: [
            TOKEN_ADDRESS,       // _token
            BASE_ENDPOINT_V2,    // _lzEndpoint
            deployer             // _delegate (Owner)
        ],
        log: true,
        waitConfirmations: 2,
    });
};

export default deployAdapter;
deployAdapter.tags = ['BaseTokenAdapter'];
```

### Skrypt wdrożenia OFT na Chiliz Chain

Stwórz drugi plik o nazwie `02_deploy_chiliz_oft.ts` w folderze `deploy/`. Ten skrypt inicjalizuje nowy Native OFT na Chiliz Chain.

```typescript
import { DeployFunction } from 'hardhat-deploy/types';

const deployOFT: DeployFunction = async ({ getNamedAccounts, deployments }) => {
    const { deploy } = deployments;
    const { deployer } = await getNamedAccounts();

    // Token Details (Must match your Base token)
    const TOKEN_NAME = "My Token";
    const TOKEN_SYMBOL = "TKN";

    // The Chiliz Chain Mainnet Endpoint V2 Address 
    const CHILIZ_ENDPOINT_V2 = "0x6F475642a6e85809B1c36Fa62763669b1b48DD5B";

    console.log("Deploying Native OFT to Base Mainnet...");

    await deploy('BaseTokenOFT', {
        from: deployer,
        args: [
            TOKEN_NAME,           // _name
            TOKEN_SYMBOL,         // _symbol
            CHILIZ_ENDPOINT_V2,   // _lzEndpoint
            deployer              // _delegate (Owner)
        ],
        log: true,
        waitConfirmations: 2,
    });
};

export default deployOFT;
deployOFT.tags = ['BaseTokenOFT'];
```

### Wykonanie wdrożeń

Upewnij się, że twój `hardhat.config.ts` ma poprawnie skonfigurowane adresy URL RPC oraz klucze prywatne zarówno dla Base, jak i Chiliz Chain.

{% embed url="<https://docs.base.org/base-chain/quickstart/connecting-to-base>" %}

[polaczenie-przez-rpc.md](/pl/tworzenie/podstawy/polaczenie-z-chiliz-chain/polaczenie-przez-rpc.md)

Uruchom następujące polecenia w terminalu, aby wdrożyć kontrakty:

```bash
# 1. Deploy the Adapter to Base
npx hardhat deploy --network chiliz --tags BaseTokenAdapter

# 2. Deploy the Native OFT to Chiliz Chain
npx hardhat deploy --network base --tags ChilizTokenOFT
```

Po zakończeniu wdrożeń Hardhat zapisze adresy kontraktów w folderze `deployments/`. Narzędzia LayerZero automatycznie odczytają te adresy, gdy uruchomimy polecenie okablowania (wiring) w następnym kroku.

## Krok 4: Okablowanie i parowanie

Na tym etapie twoje kontrakty `BaseTokenAdapter` i `ChilizTokenOFT` są wdrożone na każdym łańcuchu, ale są całkowicie odizolowane.\
Jeśli kontrakt na Chiliz Chain otrzyma wiadomość nakazującą mu mintowanie tokenów, musi wiedzieć, że wiadomość rzeczywiście pochodzi od *twojego* Adaptera na Base, a nie od złośliwego aktora.

Musisz ustanowić to zaufanie, kryptograficznie „okablowując" kontrakty ze sobą jako peery.

Robi się to poprzez uruchomienie polecenia `wire`, które wygeneruje i wykona transakcje zarówno na Chiliz, jak i na Base.

{% hint style="info" %}
**Co dzieje się pod maską?**

Pełna konfiguracja ścieżki LayerZero V2 wymaga w rzeczywistości 6 transakcji na każdym łańcuchu:

* `setSendLibrary`: Przypisuje LayerZero MessageLib odpowiedzialny za wysyłanie wiadomości (np. konfiguruje go do używania V2 Send Library).
* `setReceiveLibrary`: Przypisuje MessageLib odpowiedzialny za odbieranie wiadomości. (Zawiera `gracePeriod`, zwykle ustawiony na `0`).
* `setConfig` (Send Library): Ustawia konkretne Decentralized Verifier Networks (DVN) oraz Executory dla wiadomości wychodzących.
* `setConfig` (Receive Library): Ustawia konkretne DVN wymagane do weryfikacji wiadomości przychodzących.
* `setEnforcedOptions`: ustawia wymagane limity gas dla wykonania. Gdy użytkownik wysyła wiadomość z Base, płaci za gas docelowy z góry. Ustawienie wymuszonych opcji gwarantuje, że płaci wystarczająco dużo gas, aby LayerZero Executor mógł pomyślnie przetworzyć transakcję na Chiliz Chain.
* `setPeer`: Łączy docelowy Endpoint ID (EID) z zaufanym adresem kontraktu. Musisz powiedzieć kontraktowi na Base, aby ufał kontraktowi na Chiliz Chain, oraz kontraktowi na Chiliz Chain, aby ufał kontraktowi na Base.
  {% endhint %}

### Wykonanie zadania Wire

Uruchom następujące polecenie w terminalu:

```bash
npx hardhat lz:oapp:wire --oapp-config layerzero.config.ts
```

Toolchain automatycznie obliczy wymagane parametry, wyświetli ci tabelę transakcji, które zamierza wykonać, i prześle je do Chiliz oraz Base, używając twojego portfela deployera.

Gdy transakcje potwierdzą się w obu sieciach, twój token bridge jest oficjalnie aktywny i w pełni skonfigurowany! Base Adapter jest teraz autoryzowany do wysyłania poleceń mint do Chiliz Chain, a Chiliz Chain jest autoryzowany do wysyłania poleceń unlock z powrotem do Base.

## Krok 5: Działanie i testowanie

Gdy twoje kontrakty są wdrożone i bezpiecznie okablowane ze sobą, twój token jest teraz omnichain. Ostatnim krokiem jest wykonanie transferu cross-chain z Base Mainnet do Chiliz Chain Mainnet.

### 1) Wykonanie transferu cross-chain

Toolbox LayerZero V2 udostępnia wbudowane zadanie Hardhat do testowania transferów OFT bezpośrednio z terminala. To polecenie oszacuje opłatę gas cross-chain, obciąży twój portfel w $ETH (natywnym tokenie gas na łańcuchu źródłowym, Base) i zainicjuje transfer.

Uruchom następujące polecenie:

{% code overflow="wrap" lineNumbers="true" %}

```bash
npx hardhat lz:oft:send --oapp-config layerzero.config.ts --from-eid 30184 --to-eid 30409 --amount 10
```

{% endcode %}

Co robi to polecenie:

1. Wyszukuje Base Mainnet (`30184`) i Chiliz Mainnet (`30409`) w twojej konfiguracji.
2. Wycenia opłatę cross-chain wymaganą przez LayerZero Executor.
3. Wywołuje funkcję `send()` na twoim Base Adapter.
4. Adapter blokuje 10 tokenów i emituje pakiet do LayerZero Endpoint.

### 2) Śledzenie pakietu na LayerZero Scan

Transakcje cross-chain są asynchroniczne. Podczas gdy twoja transakcja na Chiliz potwierdzi się w ciągu kilku sekund, wiadomość nadal musi zostać zweryfikowana i wykonana na Base.

Aby śledzić tę podróż w czasie rzeczywistym, kliknij link LayerZero Scan, który pojawia się w wyjściu CLI.

Dowiedz się więcej o tym narzędziu tutaj:

{% embed url="<https://docs.layerzero.network/v2/developers/evm/tooling/layerzeroscan>" %}

## Ustawianie limitów gas

Bardzo ważne jest, aby ustawić limity gas, ponieważ ich nieustawienie może spowodować, że twoje wiadomości cross-chain zakończą się niepowodzeniem w sieci docelowej.

Gdy użytkownik mostkuje token z Base do Chiliz Chain, płaci opłatę gas za *oba* łańcuchy z góry w jednej transakcji na Base (używając `$ETH`). LayerZero używa następnie części tej opłaty, aby zapłacić rzeczywisty gas ETH wymagany do wykonania transakcji mintowania na Chiliz Chain.

Aby zapewnić, że LayerZero ma wystarczająco dużo gas, by pomyślnie przetworzyć funkcję `lzReceive` na łańcuchu docelowym, musisz ustawić Enforced Options. Jeśli nie zostaną one ustawione, transakcja może zostać cofnięta na łańcuchu docelowym z powodu błędu „Out of Gas".

### **Konfiguracja opcji**

Ta opcja jest ustawiana w twoim pliku `layerzero.config.ts`. Zaktualizuj tablicę `connections`, aby zawierała blok `enforcedOptions` dla każdej ścieżki:

{% code overflow="wrap" %}

```typescript
import { EndpointId } from '@layerzerolabs/lz-definitions';

// ... (contract definitions as before)

connections: [
    {
        from: 'BaseTokenAdapter',
        to: 'ChilizTokenOFT',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,        // 1 = Standard OFT Transfer (SEND)
                    optionType: 1,     // 1 = lzReceive Option
                    gas: 200000,       // Estimated gas limit to mint on Chiliz Chain
                },
                {
                    msgType: 2,        // 2 = OFT Transfer with payload (SEND_AND_CALL)
                    optionType: 1,
                    gas: 250000,       // Slightly higher gas limit for complex calls
                }
            ]
        },
    },
    {
        from: 'ChilizTokenOFT',
        to: 'BaseTokenAdapter',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,
                    optionType: 1,
                    gas: 200000,       // Estimated gas limit to unlock on Base
                }
            ]
        },
    },
],
// ...
```

{% endcode %}

Wyjaśnienie parametrów:

* `msgType: 1`: Reprezentuje standardowy transfer tokena. `msgType: 2` jest używany dla wywołań „złożonych" (np. zmostkowanie tokena i natychmiastowe jego stakowanie jednym kliknięciem).
* `optionType: 1`: Instruuje Executora, aby po prostu wykonał funkcję `lzReceive`.
* `gas: 200000`: Bezpieczny bazowy limit gas dla standardowych operacji mint i unlock OFT. Możesz go dostosować w oparciu o konkretne zużycie gas twoich wdrożonych kontraktów.

Jeśli ustawiłeś tę opcję po już wykonanym okablowaniu łańcuchów, możesz ponownie wykonać okablowanie z wprowadzonymi teraz opcjami, używając tego samego polecenia:

{% code overflow="wrap" %}

```bash
npx hardhat lz:oapp:wire --oapp-config layerzero.config.ts
```

{% endcode %}

Narzędzia automatycznie wykryją zmiany i prześlą transakcję `setEnforcedOptions()` do twoich kontraktów zarówno na Base, jak i Chiliz. Teraz, ilekroć użytkownik uruchomi bridge, kontrakty będą wymagać, aby użytkownik zapłacił za co najmniej 200 000 jednostek gas na łańcuchu docelowym, zapewniając niezawodne dostarczenie.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.chiliz.com/pl/tworzenie/zaawansowane/tokeny-omnichain/mostek-base-chiliz-chain.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
