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

Base'den Chiliz Chain'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 (Base) bir OFT Adapter ve hedef zincirde (Chiliz Chain) 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 [Base'den başka bir EVM zincirine basım yapılacağını öğrenmek için bir öğretici](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart) Chiliz Chain gibi. O öğretici hedef zincir olarak Optimism'i kullanıyor, ancak bunu [Chiliz Chain'in ayrıntılarıyla](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart).
{% endhint %}

## Ön Koşullar

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

* Base üzerinde bir ERC20 token sözleşme adresi.
* Base ve Chiliz Chain ile çalışacak şekilde ayarlanmış bir Web3 cüzdanı (MetaMask gibi).
  * [Base Mainnet RPC yapılandırması için buraya bakın](https://docs.base.org/base-chain/quickstart/connecting-to-base).
  * [Chiliz Chain RPC yapılandırması için buraya bakın](/tr-ai/develop/basics/connect-to-chiliz-chain/connect-using-rpc.md).
* Sözleşme dağıtımları ile mesaj gönderme için gereken gas ücretlerini ödeyecek kadar her zincirde yeterli gas tokenı.
  * Base üzerinde: ETH tokenları.
  * Chiliz Chain’de: CHZ 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` Base ü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şmesi, mevcut tokenınız için bir kilit kutusu gibi davranır. Kullanıcılar tokenlarını Base'den köprüleyerek çıkardığında, bu sözleşme orijinal ERC20 tokenlarını kilitler.

Şu adla yeni bir dosya oluşturun: `BaseTokenAdapter.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 BaseTokenAdapter is OFTAdapter {
    constructor(
        address _token,      // Base üzerindeki MEVCUT tokenınızın adresi
        address _lzEndpoint, // Base ü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 Base Mainnet'e dağıtırken, mevcut tokenınızın sözleşme adresini `_token` olarak ve Base Endpoint V2 adresini (`0x1a44076050125825900e736c501f859c50fE728c`) `_lzEndpoint`.

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

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

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

Token henüz Chiliz Chain üzerinde doğal olarak mevcut olmadığından, standart bir OFT sözleşmesi dağıtmanız gerekir. Bu sözleşme, Base üzerinde dağıtılmış OFT Adapter'dan geçerli bir mesaj aldığında yeni tokenlar mint etme ve kullanıcılar geri köprülediğinde bunları yakma yetkisine sahiptir.

Şu adla yeni bir dosya oluşturun: `ChilizTokenOFT.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 ChilizTokenOFT is OFT {
    constructor(
        string memory _name,   // Tokenın adı (Base tokenınızla eşleşmeli)
        string memory _symbol, // Tokenın sembolü (Base tokenınızla eşleşmeli)
        address _lzEndpoint,   // Chiliz Chain ü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 Chiliz Chain'e dağıtırken, kullanıcıların kafasını karıştırmamak için `_name` ve `_symbol` orijinal tokenınızla Base üzerinde eşleştiğinden emin olun. Chiliz Chain 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>" %}

## 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 baseContract: OmniPointHardhat = {
    eid: EndpointId.BASE_V2_MAINNET,
    contractName: 'BaseTokenAdapter',
};

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

// 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, // Yürütme gas limiti
        value: 0,    // Native drop (standart transferler için 0)
    },
];

// Oluşturulan Yapılandırmayı Dışa Aktar
export default async function () {
    return {
        contracts: [
            { contract: baseContract },
            { contract: chilizContract },
        ],
        // Oluşturucu otomatik olarak A->B ve B->A yollarını oluşturur!
        connections: await generateConnectionsConfig([
            [
                baseContract,      // Kaynak
                chilizContract,    // 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]
            ],
        ]),
    };
}
```

Dizi `[EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS]` LayerZero Executor'a mesajı Chiliz'e teslim ederken 200.000 gas birimini ve aynı şekilde mesajı Base'e geri gönderirken de 200.000 gas birimini zorunlu kılmasını söyler.

## 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/` dizininde iki dağıtım betiği oluşturmanız gerekecek: biri Base Mainnet için, biri de Chiliz Chain Mainnet için.

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

şu adda bir dosya oluşturun `01_deploy_base_adapter.ts` klasörünüzde. `deploy/` Bu betik, mevcut token adresinizi ve Base 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();

    // Base üzerindeki mevcut ERC-20 tokenınızın adresi
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // Base Mainnet Endpoint V2 Adresi
    const BASE_ENDPOINT_V2 = "0x1a44076050125825900e736c501f859c50fE728c";

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

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

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

### Chiliz Chain OFT Dağıtım Betiği

ikinci bir dosya oluşturun `02_deploy_chiliz_oft.ts` klasörünüzde. `deploy/` klasör. Bu betik, Chiliz Chain ü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ı (Base tokenınızla eşleşmeli)
    const TOKEN_NAME = "My Token";
    const TOKEN_SYMBOL = "TKN";

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

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

    await deploy('BaseTokenOFT', {
        from: deployer,
        args: [
            TOKEN_NAME,           // _name
            TOKEN_SYMBOL,         // _symbol
            CHILIZ_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 Base hem de Chiliz Chain için RPC URL'lerinin ve özel anahtarların doğru şekilde yapılandırılmış olduğundan emin olun.

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

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

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

```bash
# 1. Adapter'ı Base'e dağıtın
npx hardhat deploy --network chiliz --tags BaseTokenAdapter

# 2. Native OFT'yi Chiliz Chain'e dağıtın
npx hardhat deploy --network base --tags ChilizTokenOFT
```

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, `BaseTokenAdapter` ve `ChilizTokenOFT` sözleşmeleriniz her zincirde dağıtılmıştır, ancak tamamen izoledir.\
Chiliz Chain sözleşmesi token mint etmeyi söyleyen bir mesaj alırsa, mesajın gerçekten *sizin* Base üzerindeki Adapter'ınızdan geldiğini, kötü niyetli bir aktörden gelmediğini bilmesi gerekir.

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 ayarlar. Bir kullanıcı Base'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ıyla işleyebilmesi için yeterli gas ödemelerini sağlar.
* `setPeer`: Bir hedef Endpoint ID'sini (EID) güvenilen bir sözleşme adresine bağlar. Base sözleşmesine Chiliz Chain sözleşmesine, Chiliz Chain sözleşmesine de Base 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ıdır ve tamamen yapılandırılmıştır! Base Adapter artık Chiliz Chain'e mint komutları göndermeye yetkilidir ve Chiliz Chain de Base'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ıktan sonra, tokenınız artık omnichain'dir. Son adım, Base Mainnet'ten Chiliz Chain Mainnet'e çapraz zincir transferi 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 çapraz zincir gas ücretini tahmin edecek, cüzdanınızdan $ETH ile ücretlendirecek (kaynak zincirdeki yerel gas tokenı, Base) ve transferi başlatacaktır.

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 30184 --to-eid 30409 --amount 10
```

{% endcode %}

Bu komutun yaptığı şey:

1. Base Mainnet'i (`30184`) ve Chiliz Mainnet'i (`30409`) 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 Base Adapter'ınız üzerinde.
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ı Base'den Chiliz Chain'e bir token köprülediğinde, gas ücretini *her iki* zincir için Base üzerinde tek bir işlemde peşin öder ( `$ETH`kullanarak). LayerZero daha sonra bu ücretin bir kısmını, Chiliz Chain üzerinde mint işlemini yürütmek için gereken gerçek ETH gas ücretini ö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: 'BaseTokenAdapter',
        to: 'ChilizTokenOFT',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,        // 1 = Standart OFT Transferi (SEND)
                    optionType: 1,     // 1 = lzReceive Seçeneği
                    gas: 200000,       // Chiliz Chain'de 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: 'ChilizTokenOFT',
        to: 'BaseTokenAdapter',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,
                    optionType: 1,
                    gas: 200000,       // Base ü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 Base hem de Chiliz üzerindeki sözleşmelerinize gönderecektir. Artık bir kullanıcı bridge tetiklediğinde, sözleşmeler kullanıcıdan hedef zincirde en az 200.000 gas birimi için ödeme yapmasını 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-base-to-chiliz-chain.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.
