> 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/tr/gelistir/gelismis/omnichain-token-kullanimi/baseden-chiliz-chaine-kopru.md).

# Base'den Chiliz Chain'e Köprü

Mevcut bir token'ı Base'den Chiliz Chain'e köprülemek için iki ayrı akıllı sözleşme yazıp deploy etmeniz gerekir: token'ın halihazırda var olduğu zincirde (Base) bir OFT Adapter ve hedef zincirde (Chiliz Chain) bir Yerel OFT.

{% hint style="info" %}
LayerZero'nun [OFT sözleşmeleri için kendi QuickStart rehberini](https://docs.layerzero.network/v2/developers/evm/oft/quickstart) ve Chiliz Chain gibi başka bir EVM zincirine [Base'den nasıl basım yapılacağına dair öğreticiyi](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart) sağladığını unutmayın. Bu öğretici hedef zincir olarak Optimism kullanmaktadır, ancak bunu [Chiliz Chain'in ayrıntılarıyla](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart) değiştirebilirsiniz.
{% endhint %}

## Ön Koşullar

Bu rehber için şunlar gereklidir:

* Base'de bir ERC20 token sözleşme adresi.
* Hem Base hem de Chiliz Chain ile çalışacak şekilde yapılandırılmış 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/gelistir/temel-ogeler/chiliz-chaine-baglanma/rpc-ile-baglanma.md).
* Her iki zincirde sözleşme deploy maliyetleri ve mesaj gönderme gas ücretlerini karşılayacak yeterli gas token'ı.
  * Base'de: ETH token'ları.
  * Chiliz Chain'de: CHZ token'ları.

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

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

### Base'de `OFTAdapter` Hazırlama

{% hint style="warning" %}
Bu hazırlık adımıdır, hemen deploy etmeyin!\
Adım 3'te deploy edeceksiniz.
{% endhint %}

`OFTAdapter` sözleşmesi, mevcut token'ınız için bir kilitli kutu işlevi görür. Kullanıcılar token'larını Base'den köprülediğinde, bu sözleşme orijinal ERC20 token'larını kilitler.

Contracts klasörünüzde `BaseTokenAdapter.sol` adında yeni bir dosya oluşturun:

```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,      // Base'deki MEVCUT token'ınızın adresi
        address _lzEndpoint, // Base'deki LayerZero V2 Endpoint adresi
        address _delegate    // Yapılandırma değişikliklerini yapabilecek adres (genellikle cüzdanınız)
    ) OFTAdapter(_token, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
Bu sözleşmenin hem [LayerZero OFT Adapter sözleşmesini](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFTAdapter.sol) hem de yönetici anahtarlarını vermek için standart bir `Ownable.sol` sözleşmesini genişlettiğini görebilirsiniz. Zincirleri güvenli biçimde birbirine bağlamak için her ikisine de ihtiyacınız var.
{% endhint %}

Bunu Base Mainnet'e deploy ederken mevcut token'ınızın sözleşme adresini `_token` olarak ve Base Endpoint V2 adresini (`0x1a44076050125825900e736c501f859c50fE728c`) `_lzEndpoint` olarak geçirmeniz gerekir.

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

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

### Chiliz Chain'de `OFT` Hazırlama

Token henüz Chiliz Chain'de yerel olarak mevcut olmadığından standart bir OFT sözleşmesi deploy etmeniz gerekir. Bu sözleşme, Base'de deploy edilen OFT Adapter'dan geçerli bir mesaj aldığında yeni token basma ve kullanıcılar geri köprülerken token'ları yakma yetkisine sahiptir.

Contracts klasörünüzde `ChilizTokenOFT.sol` adında yeni bir dosya oluşturun:

```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,   // 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'deki LayerZero V2 Endpoint adresi
        address _delegate      // Yapılandırma değişikliklerini yapabilecek adres
    ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
Bu sözleşmenin hem [LayerZero OFT sözleşmesini](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFT.sol) hem de yukarıda belirtilen aynı nedenlerle standart bir `Ownable.sol` sözleşmesini genişlettiğini görebilirsiniz.
{% endhint %}

Bunu Chiliz Chain'e deploy ederken kullanıcıların kafasını karıştırmamak için `_name` ve `_symbol` değerlerinin Base'deki orijinal token'ınızla eşleştiğinden emin olun. Chiliz Chain Endpoint V2 adresini (`0x6F475642a6e85809B1c36Fa62763669b1b48DD5B`) `_lzEndpoint` olarak geçirin.

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

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

## Adım 2: LayerZero Yapılandırması

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

Bu yapılandırma dosyası, çapraz zincir mimariniz için bir plan niteliği taşır. Deploy edilen akıllı sözleşmelerinizi ilgili LayerZero Endpoint ID'leri (EID) ile eşler ve aralarındaki yolları (bağlantıları) tanımlar.

[Simple Config Generator](https://docs.layerzero.network/v2/tools/simple-config), çift yönlü bağlantıları otomatikleştirdiği ve önerilen güvenlik yapılandırmalarını otomatik olarak uyguladığı için bağlantı yapılandırması oluşturmak için önerilen yöntemdir.

Hardhat projenizin kökünde `layerzero.config.ts` dosyasını 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ımlayın
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ımlayın (Zorunlu Seçenekler)
const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1,  // Standart OFT Transferi
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000, // Çalıştırma gas limiti
        value: 0,    // Yerel bırakma (standart transferler için 0)
    },
];

// Oluşturulan Yapılandırmayı Dışa Aktarın
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], // Çalıştırma Seçenekleri [Chiliz'e, Base'e]
            ],
        ]),
    };
}
```

`[EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS]` dizisi, LayerZero Executor'a Chiliz'e mesaj iletirken ve Base'e mesaj döndürürken 200.000 gas birimi uygulamasını söyler.

## Adım 3: Deploy İş Akışı

Sözleşmeleriniz yazıldı ve `layerzero.config.ts`'niz hazırlandı; artık sözleşmeleri ilgili ağlara deploy etme zamanı. LayerZero V2 araç seti, deploy işlemlerini verimli biçimde yönetmek için `hardhat-deploy` eklentisine dayanır.

Projenizin `deploy/` dizininde iki deploy betiği oluşturmanız gerekecektir: biri Base Mainnet için diğeri Chiliz Chain Mainnet için.

### Base Adapter Deploy Betiği

`deploy/` klasörünüzde `01_deploy_base_adapter.ts` adında bir dosya oluşturun. Bu betik, mevcut token adresinizi ve Base Endpoint V2 adresini constructor'a geçirir.

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

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

    // Base'deki mevcut ERC-20 token'ınızın adresi
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // Base Mainnet Endpoint V2 Adresi
    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 (Sahip)
        ],
        log: true,
        waitConfirmations: 2,
    });
};

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

### Chiliz Chain OFT Deploy Betiği

`deploy/` klasörünüzde `02_deploy_chiliz_oft.ts` adında ikinci bir dosya oluşturun. Bu betik, Chiliz Chain'de yeni Yerel 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 Detayları (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("Deploying Native OFT to Base Mainnet...");

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

### Deploy İşlemlerini Çalıştırma

`hardhat.config.ts` dosyanızda hem Base hem de Chiliz Chain için RPC URL'lerinin ve private key'lerin doğru şekilde yapılandırıldığından emin olun.

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

[RPC ile Bağlanma](/tr/gelistir/temel-ogeler/chiliz-chaine-baglanma/rpc-ile-baglanma.md)

Sözleşmeleri deploy etmek için terminalinizde şu komutları çalıştırın:

```bash
# 1. Adapter'ı Base'e deploy edin
npx hardhat deploy --network chiliz --tags BaseTokenAdapter

# 2. Yerel OFT'yi Chiliz Chain'e deploy edin
npx hardhat deploy --network base --tags ChilizTokenOFT
```

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

## Adım 4: Bağlantı ve Eşleşme

Bu aşamada `BaseTokenAdapter` ve `ChilizTokenOFT` sözleşmeleriniz her iki zincire deploy edildi ancak tamamen izole durumdalar.\
Chiliz Chain sözleşmesi token basmasını söyleyen bir mesaj aldığında, bu mesajın gerçekten sizin Base'deki Adapter'ınızdan geldiğini, kötü niyetli bir aktörden değil, bilmesi gerekir.

Sözleşmeleri kriptografik olarak eşler olarak "bağlayarak" bu güveni oluşturmanız gerekir.

Bu işlem, hem Chiliz hem de Base'de işlemler oluşturup yürütecek olan `wire` komutu çalıştırılarak gerçekleştirilir.

{% hint style="info" %}
**Arka Planda Neler Oluyor?**

Eksiksiz bir LayerZero V2 yol yapılandırması her iki zincirde de 6 işlem gerektirir:

* `setSendLibrary`: Mesaj gönderiminden sorumlu LayerZero MessageLib'i atar.
* `setReceiveLibrary`: Mesaj alımından sorumlu MessageLib'i atar. (Genellikle `0` olarak ayarlanan bir `gracePeriod` içerir).
* `setConfig` (Gönderme Kütüphanesi): Giden mesajlar için belirli Merkeziyetsiz Doğrulayıcı Ağlarını (DVN) ve Executor'ları ayarlar.
* `setConfig` (Alma Kütüphanesi): Gelen mesajları doğrulamak için gereken belirli DVN'leri ayarlar.
* `setEnforcedOptions`: Gerekli çalıştırma gas limitlerini ayarlar. Bir kullanıcı Base'den mesaj gönderdiğinde, hedef gas ücretini peşin öder. Zorunlu seçeneklerin ayarlanması, LayerZero Executor'ın işlemi Chiliz Chain'de başarıyla işlemesi için yeterli gas ödenmesini sağlar.
* `setPeer`: Bir hedef Endpoint ID'yi (EID) güvenilir 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üvenmesi gerektiğini belirtmeniz gerekir.
  {% endhint %}

### Wire Görevini Çalıştırma

Terminalinizde şu 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 bir tablosunu size sunacak ve bunları deployer 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 resmi olarak aktif ve tam yapılandırılmış olacaktır! Base Adapter artık Chiliz Chain'e basım komutları göndermeye yetkilidir ve Chiliz Chain, kilit açma komutlarını Base'e göndermeye yetkilidir.

## Adım 5: Operasyon ve Test

Sözleşmeleriniz deploy edildi ve güvenli biçimde bağlandı; token'ınız artık omnichain. Son adım, Base Mainnet'ten Chiliz Chain Mainnet'e çapraz zincir transferi gerçekleştirmektir.

### 1) Çapraz Zincir Transferini Gerçekleştirme

LayerZero V2 araç seti, doğrudan terminalinizden OFT transferlerini 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 (kaynak zincir olan Base'in yerel gas token'ı) ile ücret kesecek ve transferi başlatacaktır.

Şu 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 komut şunları yapar:

1. Yapılandırmanızda Base Mainnet (`30184`) ve Chiliz Mainnet (`30409`) ayarlarını bulur.
2. LayerZero Executor tarafından gereken çapraz zincir ücretini hesaplar.
3. Base Adapter'ınızda `send()` fonksiyonunu çağırır.
4. Adapter 10 token'ı kilitler ve LayerZero Endpoint'e bir paket yayınlar.

### 2) Paketi LayerZero Scan'de İzleme

Çapraz zincir işlemleri eşzamansızdır. Chiliz işleminiz birkaç saniye içinde onaylanırken mesajın hâlâ Base'de doğrulanıp yürütülmesi gerekmektedir.

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.

Bu araç hakkında daha fazla bilgi edinin:

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

## Gas Limitlerini Ayarlama

Gas limitlerini ayarlamak son derece önemlidir; aksi takdirde çapraz zincir mesajlarınız hedef ağda başarısız olabilir.

Bir kullanıcı Base'den Chiliz Chain'e token köprülediğinde, her iki zincirin gas ücretini Base'de yapılan tek bir işlemde peşin öder ($ETH kullanarak). LayerZero ardından bu ücretin bir bölümünü Chiliz Chain'deki basım işlemini yürütmek için gereken gerçek ETH gas ücretini ödemek için kullanır.

LayerZero'nun hedef zincirde `lzReceive` fonksiyonunu başarıyla işlemesi için yeterli gas'a sahip olmasını sağlamak amacıyla Zorunlu Seçenekleri ayarlamanız gerekir. Bu ayarlanmazsa işlem, hedef zincirde "Out of Gas" hatasıyla geri alınabilir.

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

Bu seçenek `layerzero.config.ts` dosyanızda ayarlanır. `connections` dizisini her yol için `enforcedOptions` bloğunu içerecek şekilde güncelleyin:

{% code overflow="wrap" %}

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

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

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 basım 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'de kilit açmak için tahmini gas limiti
                }
            ]
        },
    },
],
// ...
```

{% endcode %}

Parametrelerin açıklaması:

* `msgType: 1`: Standart bir token transferini temsil eder. `msgType: 2`, "bileşik" çağrılar için kullanılır (örneğin bir token'ı köprüleyip hemen tek tıklamayla stake etmek).
* `optionType: 1`: Executor'a yalnızca `lzReceive` fonksiyonunu yürütmesini bildirir.
* `gas: 200000`: Standart OFT basım ve kilit açma işlemleri için güvenli bir temel gas limiti. Deploy edilen sözleşmelerinizin belirli gas tüketimine göre ayarlayabilirsiniz.

Bu seçeneği zincirleri zaten bağladıktan sonra ayarladıysanız, seçenekler şimdi mevcut olduğundan aynı komutu kullanarak yeniden bağlayabilirsiniz:

{% 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 hem Base'deki hem de Chiliz'deki sözleşmelerinize bir `setEnforcedOptions()` işlemi gönderecektir. Artık bir kullanıcı köprüyü tetiklediğinde, 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
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/tr/gelistir/gelismis/omnichain-token-kullanimi/baseden-chiliz-chaine-kopru.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.
