# Chiliz Chain'den Base'e köprüleme

Chiliz Chain’den Base’e mevcut bir token’ı köprülemek için, iki ayrı akıllı sözleşme yazıp dağıtmanız gerekir: token’ın zaten bulunduğu zincirde (Chiliz Chain) bir OFT Adapter ve hedef zincirde (Base) bir Native OFT.

{% hint style="info" %}
LayerZero'nun [kendi OFT sözleşmeleri için QuickStart sunduğunu](https://docs.layerzero.network/v2/developers/evm/oft/quickstart)ve ayrıca nasıl [Chiliz Chain’den başka bir EVM zincirine mint etmek](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart) örneğin Base. O eğitimde hedef zincir olarak Optimism kullanılıyor, ancak bunu şu zincirle değiştirebilirsiniz: [Base ayrıntıları](https://docs.layerzero.network/v2/deployments/chains/base).
{% endhint %}

## Ön Koşullar

Bu kılavuz aşağıdakileri gerektirir:

* Chiliz Chain üzerinde bir ERC20 token sözleşme adresi.
* Hem Chiliz Chain hem de Base ile çalışacak şekilde kurulmuş bir Web3 cüzdanı (MetaMask gibi).
  * [Chiliz Chain RPC yapılandırması için buraya bakın](/tr-ai/develop/basics/connect-to-chiliz-chain/connect-using-rpc.md).
  * [Base Mainnet RPC yapılandırması için buraya bakın](https://docs.base.org/base-chain/quickstart/connecting-to-base).
* Sözleşme dağıtımları ile mesaj gönderme için gereken gas ücretlerini ödeyecek kadar her zincirde yeterli gas tokenı.
  * Chiliz Chain’de: CHZ tokenları.
  * Base üzerinde: ETH tokenları.

Kullanacağız [Hardhat](https://hardhat.org/) geliştirme ortamı olarak ve Node/npx.

## 1. Adım: Sözleşme Geliştirme

### Hazırlanması `OFTAdapter` Chiliz Chain üzerinde

{% hint style="warning" %}
Bu hazırlık adımıdır, hemen dağıtım yapmayın!\
3\. adımda dağıtım yapacaksınız.
{% endhint %}

Şu `OFTAdapter` sözleşme, mevcut token’ınız için bir kilit kutusu gibi davranır. Kullanıcılar token’larını Chiliz Chain’den dışarı köprülediğinde, bu sözleşme orijinal ERC20 token’ları kilitler.

Şu adla yeni bir dosya oluşturun: `ChilizTokenAdapter.sol` sözleşmenizi contracts klasörüne koyun:

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

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

contract ChilizTokenAdapter is OFTAdapter {
    constructor(
        address _token,      // Mevcut Token’ınızın Chiliz Chain üzerindeki adresi
        address _lzEndpoint, // Chiliz üzerindeki LayerZero V2 Endpoint adresi
        address _delegate    // Yapılandırma değişiklikleri yapabilen adres (genellikle cüzdanınız)
    ) OFTAdapter(_token, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
Gördüğünüz gibi bu sözleşme [LayerZero OFT Adapter sözleşmesini](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFTAdapter.sol)ve ayrıca standart bir `Ownable.sol` sözleşmesini genişletiyor; böylece yönetim anahtarları veriliyor. Her ikisine de ihtiyacınız var; böylece siz ve yalnızca siz, zincirleri güvenli bir şekilde birbirine bağlayabilirsiniz.
{% endhint %}

Bunu Chiliz Chain Mainnet’e dağıtırken, mevcut token’ınızın sözleşme adresini şu parametre olarak vermelisiniz: `_token` ve Chiliz Endpoint V2 adresini (`0x6F475642a6e85809B1c36Fa62763669b1b48DD5B`) `_lzEndpoint`.

Chiliz Chain için mevcut tüm endpoint'leri burada görün:

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

### Hazırlanması `OFT` Base üzerinde

Token henüz Base üzerinde yerel olarak mevcut olmadığından, standart bir OFT sözleşmesi dağıtmanız gerekir. Bu sözleşme, Chiliz’e dağıtılmış OFT Adapter’dan geçerli bir mesaj aldığında yeni token’lar mint etme yetkisine sahiptir ve kullanıcılar geri köprü yaptığında bunları burn eder.

Şu adla yeni bir dosya oluşturun: `BaseTokenOFT.sol` sözleşmenizi contracts klasörüne koyun:

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

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

contract BaseTokenOFT is OFT {
    constructor(
        string memory _name,   // Token’ın adı (Chiliz Token’ınızla eşleşmeli)
        string memory _symbol, // Token’ın sembolü (Chiliz Token’ınızla eşleşmeli)
        address _lzEndpoint,   // Base üzerindeki LayerZero V2 Endpoint adresi
        address _delegate      // Yapılandırma değişiklikleri yapabilen adres
    ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
Gördüğünüz gibi bu sözleşme [LayerZero OFT sözleşmesini](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFT.sol) ve ayrıca standart bir `Ownable.sol` sözleşmesini, yukarıda belirtilen nedenlerle.
{% endhint %}

Bunu Base’e dağıtırken, kullanıcıları karıştırmamak için `_name` ve `_symbol` alanlarının Chiliz Chain üzerindeki orijinal token’ınızla eşleştiğinden emin olun. Base Endpoint V2 adresini (`0x1a44076050125825900e736c501f859c50fE728c`) `_lzEndpoint`.

Base için mevcut tüm endpoint’leri burada görün:

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

## olarak vereceksiniz

Sözleşmeleriniz hazır olduğunda, LayerZero araçlarına bunların nasıl bağlandığını söylemeniz gerekir. Bu, Hardhat projenizin kök dizininde bulunan bir `layerzero.config.ts` dosyası kullanılarak yapılır.

Bu yapılandırma dosyası, zincirler arası mimariniz için bir plan görevi görür. Dağıtılmış akıllı sözleşmelerinizi ilgili LayerZero Endpoint ID'leri (EID'ler) ile eşler ve aralarındaki yolları (bağlantıları) tanımlar.

Şu [olarak biçimlendirilmesini gerektirir. LayerZero V2 Hardhat toolbox bunu, Base58 Solana Adapter Program ID’nizi çözümleyip onu standart EVM formatına doldurarak otomatik olarak yönetir.](https://docs.layerzero.network/v2/tools/simple-config) Simple Config Generator

yapılandırma kablolamasını oluşturmak için önerilen yoldur; çünkü çift yönlü kablolamayı otomatikleştirir ve önerilen güvenlik yapılandırmalarını altyapıda uygular. `layerzero.config.ts` dosyanızı Hardhat projenizin kök dizininde oluşturun veya güncelleyin:

```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';

// Sözleşmeleri Tanımla
const chilizContract: OmniPointHardhat = {
    eid: EndpointId.CHILIZ_V2_MAINNET,
    contractName: 'ChilizTokenAdapter',
};

const baseContract: OmniPointHardhat = {
    eid: EndpointId.BASE_V2_MAINNET,
    contractName: 'BaseFanTokenOFT',
};

// Standart EVM Gas Limitlerini tanımla (Zorunlu Seçenekler)
const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1,  // Standart OFT Transferi
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000, // Mint etme/kilit açma için güvenli temel gas limiti
        value: 0,    
    },
];

// Oluşturulan Yapılandırmayı Dışa Aktar
export default async function () {
    return {
        contracts: [
            { contract: chilizContract },
            { contract: baseContract },
        ],
        connections: await generateConnectionsConfig([
            [
                chilizContract,  // Kaynak
                baseContract,    // Hedef
                [['LayerZero Labs'], []], // Varsayılan DVN Yapılandırması
                [1, 1],                   // Blok onayları
                [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Yürütme Seçenekleri [Chiliz'e, Base'e]
            ],
        ]),
    };
}
```

## 3. Adım: Dağıtım İş Akışı

Sözleşmeleriniz yazıldıktan ve `layerzero.config.ts` hazırlandıktan sonra, sözleşmeleri ilgili ağlara dağıtma zamanı gelmiştir. LayerZero V2 araç seti, dağıtımları verimli şekilde yönetmek için `hardhat-deploy` eklentiye dayanır.

Projenizin `deploy/` dizin: biri Chiliz Chain Mainnet için, biri de Base Mainnet için.

### Chiliz Adapter Dağıtım Betiği

şu adda bir dosya oluşturun `01_deploy_chiliz_adapter.ts` klasörünüzde. `deploy/` klasörü. Bu betik, mevcut token adresinizi ve Chiliz Endpoint V2 adresini kurucuya iletir.

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

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

    // Chiliz üzerindeki mevcut ERC-20 token’ınızın adresi
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // Chiliz Mainnet Endpoint V2 Adresi
    const CHILIZ_ENDPOINT_V2 = "0x6F475642a6e85809B1c36Fa62763669b1b48DD5B";

    console.log("Chiliz Mainnet’e OFTAdapter dağıtılıyor...");

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

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

### Base OFT Dağıtım Betiği

ikinci bir dosya oluşturun `02_deploy_base_oft.ts` klasörünüzde. `deploy/` klasörü. Bu betik, Base üzerinde yeni Native OFT’yi başlatır.

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

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

    // Token Ayrıntıları (Chiliz Token’ınızla eşleşmeli)
    const TOKEN_NAME = "My Token";
    const TOKEN_SYMBOL = "TKN";

    // Base Mainnet Endpoint V2 Adresi 
    const BASE_ENDPOINT_V2 = "0x1a44076050125825900e736c501f859c50fE728c";

    console.log("Native OFT Base Mainnet'e dağıtılıyor...");

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

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

### Dağıtımların Yürütülmesi

şunu yaptığınızdan emin olun `hardhat.config.ts` hem Chiliz Chain hem de Base için RPC URL’lerinin ve özel anahtarların doğru şekilde yapılandırıldığını.

{% content-ref url="/pages/d9d058cfcd7f3a03cb8206fe7450f0df30b3cf85" %}
[RPC kullanarak bağlanın](/tr-ai/develop/basics/connect-to-chiliz-chain/connect-using-rpc.md)
{% endcontent-ref %}

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

Sözleşmeleri dağıtmak için terminalinizde aşağıdaki komutları çalıştırın:

```bash
# 1. Adapter’ı Chiliz Chain’e dağıtın
npx hardhat deploy --network chiliz --tags ChilizTokenAdapter

# 2. Native OFT’yi Base’e dağıtın
npx hardhat deploy --network base --tags BaseTokenOFT
```

Dağıtımlar tamamlandıktan sonra Hardhat, sözleşme adreslerini bir `deployments/` klasörüne kaydedecektir. Bir sonraki adımda wiring komutunu çalıştırdığımızda LayerZero araçları bu adresleri otomatik olarak okuyacaktır.

## 4. Adım: Wiring ve Peering

Bu aşamada, `ChilizTokenAdapter` ve `BaseTokenOFT` sözleşmeler her zincirde dağıtılmıştır, ancak tamamen birbirlerinden yalıtılmıştır.\
Base sözleşmesi token mint etmesini söyleyen bir mesaj alırsa, mesajın gerçekten şu kaynaktan geldiğini bilmesi gerekir: *sizin* Chiliz üzerindeki Adapter’dan, kötü niyetli bir aktörden değil.

Sözleşmeleri akranlar olarak kriptografik biçimde "kablaglamak" yoluyla bu güveni tesis etmelisiniz.

Bu, `wire` komutunu çalıştırarak yapılır; bu komut hem Chiliz hem de Base üzerinde işlemler oluşturur ve yürütür.

{% hint style="info" %}
**Kaputun Altında Ne Oluyor?**

Tam bir LayerZero V2 yol yapılandırması aslında her zincirde 6 işlem gerektirir:

* `setSendLibrary`: Mesaj göndermekten sorumlu LayerZero MessageLib'i atar (örneğin, V2 Send Library'yi kullanacak şekilde yapılandırır).
* `setReceiveLibrary`: Mesaj almaktan sorumlu MessageLib'i atar. (Bir `gracePeriod`içerir, genellikle şu değere ayarlanır `0`).
* `setConfig` (Send Library): Giden mesajlar için belirli Decentralized Verifier Networks (DVN'ler) ve Executor'ları ayarlar.
* `setConfig` (Receive Library): Gelen mesajları doğrulamak için gereken belirli DVN'leri ayarlar.
* `setEnforcedOptions`: gerekli yürütme gas limitlerini belirler. Bir kullanıcı Chiliz Chain’den bir mesaj gönderdiğinde, hedef gas ücretini peşin öder. Zorunlu seçeneklerin ayarlanması, LayerZero Executor’ın işlemi Chiliz Chain üzerinde başarılı şekilde işleyebilmesi için yeterli gas ödemelerini sağlar.
* `setPeer`: Güvenilir bir sözleşme adresine bir hedef Endpoint ID’si (EID) bağlar. Chiliz Chain sözleşmesine Base sözleşmesine güvenmesini, Base sözleşmesine de Chiliz Chain sözleşmesine güvenmesini söylemelisiniz.
  {% endhint %}

### Wire Görevini Yürütme

Terminalinizde aşağıdaki komutu çalıştırın:

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

Araç zinciri gerekli parametreleri otomatik olarak hesaplayacak, yürütmek üzere olduğu işlemlerin tablosunu size gösterecek ve bunları dağıtıcı cüzdanınızı kullanarak Chiliz ve Base'e gönderecektir.

İşlemler her iki ağda da onaylandıktan sonra, token köprünüz resmen canlıya alınmış ve tamamen yapılandırılmış olur! Chiliz Adapter artık Base’e mint komutları göndermeye yetkilidir ve Base de Chiliz’e geri unlock komutları göndermeye yetkilidir.

## 5. Adım: İşletim ve Test

Sözleşmeleriniz dağıtılıp güvenli bir şekilde birbirine bağlandığında, token’ınız artık omnichain olur. Son adım, Chiliz Chain Mainnet’ten Base Mainnet’e zincirler arası bir transfer gerçekleştirmektir.

### 1) Çapraz Zincir Transferini Yürütme

LayerZero V2 araç seti, OFT transferlerini doğrudan terminalinizden test etmek için yerleşik bir Hardhat görevi sağlar. Bu komut, zincirler arası gas ücretini tahmin eder, cüzdanınızdan $CHZ (kaynak zincirdeki yerel gas token’ı) olarak ücret alır ve transferi başlatır.

{% hint style="info" %}
Çünkü `ChilizTokenAdapter` mevcut Fan Token’larınızı kilitlemek için izin gerekir, bir ERC-20 `approve()` işlemi gereklidir.

LayerZero CLI bunu algılar ve mesajı göndermeden önce onayı otomatik olarak işler.
{% endhint %}

Aşağıdaki komutu çalıştırın:

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

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

{% endcode %}

Bu komutun yaptığı şey:

1. Chiliz Mainnet’i (`30409`) ve Base Mainnet’i (`30184`) yapılandırmanızda arar.
2. LayerZero Executor tarafından gerekli olan çapraz zincir ücretini fiyatlandırır.
3. şunu çağırır `send()` fonksiyonunu Chiliz Adapter’ınızda bulur.
4. Adapter 10 tokenı kilitler ve LayerZero Endpoint'e bir paket gönderir.

### 2) Paketin LayerZero Scan üzerinde Takibi

Çapraz zincir işlemleri asenkron çalışır. Chiliz işleminiz birkaç saniye içinde onaylansa da, mesajın yine de Base üzerinde doğrulanıp yürütülmesi gerekir.

Solana’dan köprüleme, iki tamamen farklı mutabakat mekanizması arasında çeviri yapmayı ve EVM’de yürütmeden önce işlemi SVM üzerinde kesinleştirmeyi içerdiğinden, asenkron gecikme normaldir.

Bu yolculuğu gerçek zamanlı izlemek için, CLI çıktısında görünen LayerZero Scan bağlantısına tıklayın.

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

## Gas Limitlerini Ayarlama

Gas limitlerini ayarlamak son derece önemlidir; bunu yapmamak çapraz zincir mesajlarınızın hedef ağda başarısız olmasına neden olabilir.

Bir kullanıcı Chiliz Chain’den Base’e bir token köprülediğinde, gas ücretini *her iki* zincirleri için Chiliz üzerinde tek bir işlemde peşin olarak öder ( `$CHZ`). LayerZero ardından bu ücretin bir kısmını, Base üzerinde mint işlemini yürütmek için gereken gerçek ETH gas’ını ödemek için kullanır.

LayerZero'nun başarılı şekilde işlemesi için yeterli gas'a sahip olmasını sağlamak için `lzReceive` fonksiyonunu, hedef zincirdeki bir "Out of Gas" hatası nedeniyle işlemin geri dönmemesi için Enforced Options ayarlamalısınız. Bunlar ayarlanmazsa, işlem hedef zincirde geri dönebilir.

### **Seçenekleri Yapılandırma**

Bu seçenek `layerzero.config.ts` dosyanızda ayarlanır. `connections` dizisini güncelleyerek `enforcedOptions` her yol için bloğu dahil edin:

{% code overflow="wrap" %}

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

// ... (sözleşme tanımları daha önceki gibi)

connections: [
    {
        from: 'ChilizTokenAdapter',
        to: 'BaseTokenOFT',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,        // 1 = Standart OFT Transferi (SEND)
                    optionType: 1,     // 1 = lzReceive Seçeneği
                    gas: 200000,       // Base üzerinde mint etmek için tahmini gas limiti
                },
                {
                    msgType: 2,        // 2 = payload'lu OFT Transferi (SEND_AND_CALL)
                    optionType: 1,
                    gas: 250000,       // Karmaşık çağrılar için biraz daha yüksek gas limiti
                }
            ]
        },
    },
    {
        from: 'BaseTokenOFT',
        to: 'ChilizTokenAdapter',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,
                    optionType: 1,
                    gas: 200000,       // Chiliz üzerinde unlock etmek için tahmini gas limiti
                }
            ]
        },
    },
],
// ...
```

{% endcode %}

Parametrelerin açıklaması:

* `msgType: 1`: Standart bir token transferini temsil eder. `msgType: 2` "composed" çağrılar için kullanılır (örneğin, bir tokenı köprüleyip tek tıkla hemen stake etmek).
* `optionType: 1`: Executor'a yalnızca `lzReceive` fonksiyonunu yürütmesini söyler.
* `gas: 200000`: Standart OFT mint ve unlock işlemleri için güvenli bir temel gas limitidir. Bunu, dağıtılmış sözleşmelerinizin özel gas tüketimine göre ayarlayabilirsiniz.

Bu seçeneği zincirleri zaten kabloladıktan sonra ayarladıysanız, seçenekler artık yerindeyken aynı komutu kullanarak yeniden kablolayabilirsiniz:

{% code overflow="wrap" %}

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

{% endcode %}

Araçlar değişiklikleri otomatik olarak algılayacak ve bir `setEnforcedOptions()` işlemini hem Chiliz hem de Base üzerindeki sözleşmelerinize gönderir. Artık bir kullanıcı köprülemeyi başlattığında, sözleşmeler kullanıcının hedef zincirde en az 200.000 gas birimi ödemesini zorunlu kılacak ve güvenilir teslimatı sağlayacaktır.


---

# Agent Instructions: 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:

```
GET https://docs.chiliz.com/tr-ai/develop/advanced/use-omnichain-tokens/bridging-from-chiliz-chain-to-base.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
