> 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/chiliz-chainden-basee-kopru.md).

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

Mevcut bir token'ı Chiliz Chain'den Base'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 (Chiliz Chain) bir OFT Adapter ve hedef zincirde (Base) 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'den Base gibi başka bir EVM zincirine [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 [Base'in ayrıntılarıyla](https://docs.layerzero.network/v2/deployments/chains/base) değiştirebilirsiniz.
{% endhint %}

## Ön Koşullar

Bu rehber için şunlar gereklidir:

* Chiliz Chain'de bir ERC20 token sözleşme adresi.
* Hem Chiliz Chain hem de Base ile çalışacak şekilde yapılandırılmış bir Web3 cüzdanı (MetaMask gibi).
  * [Chiliz Chain RPC yapılandırması için buraya bakın](/tr/gelistir/temel-ogeler/chiliz-chaine-baglanma/rpc-ile-baglanma.md).
  * [Base Mainnet RPC yapılandırması için buraya bakın](https://docs.base.org/base-chain/quickstart/connecting-to-base).
* Her iki zincirde sözleşme deploy maliyetleri ve mesaj gönderme gas ücretlerini karşılayacak yeterli gas token'ı.
  * Chiliz Chain'de: CHZ token'ları.
  * Base'de: ETH token'ları.

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

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

### Chiliz Chain'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ı Chiliz Chain'den köprülediğinde, bu sözleşme orijinal ERC20 token'larını kilitler.

Contracts klasörünüzde `ChilizTokenAdapter.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 ChilizTokenAdapter is OFTAdapter {
    constructor(
        address _token,      // Chiliz Chain'deki MEVCUT Token'ınızın adresi
        address _lzEndpoint, // Chiliz'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 Chiliz Chain Mainnet'e deploy ederken mevcut token'ınızın sözleşme adresini `_token` olarak ve Chiliz Endpoint V2 adresini (`0x6F475642a6e85809B1c36Fa62763669b1b48DD5B`) `_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/chiliz>" %}

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

Token henüz Base'de yerel olarak mevcut olmadığından standart bir OFT sözleşmesi deploy etmeniz gerekir. Bu sözleşme, Chiliz'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 `BaseTokenOFT.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 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'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 Base'e deploy ederken kullanıcıların kafasını karıştırmamak için `_name` ve `_symbol` değerlerinin Chiliz Chain'deki orijinal token'ınızla eşleştiğinden emin olun. Base Endpoint V2 adresini (`0x1a44076050125825900e736c501f859c50fE728c`) `_lzEndpoint` olarak geçirin.

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

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

## 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.

[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 chilizContract: OmniPointHardhat = {
    eid: EndpointId.CHILIZ_V2_MAINNET,
    contractName: 'ChilizTokenAdapter',
};

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

// 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, // Basım/kilit açma için güvenli temel gas limiti
        value: 0,    
    },
];

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

## 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 Chiliz Chain Mainnet için diğeri Base Mainnet için.

### Chiliz Adapter Deploy Betiği

`deploy/` klasörünüzde `01_deploy_chiliz_adapter.ts` adında bir dosya oluşturun. Bu betik, mevcut token adresinizi ve Chiliz 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();

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

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

    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 Deploy Betiği

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

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

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

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

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

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

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

```bash
# 1. Adapter'ı Chiliz Chain'e deploy edin
npx hardhat deploy --network chiliz --tags ChilizTokenAdapter

# 2. Yerel OFT'yi Base'e deploy edin
npx hardhat deploy --network base --tags BaseTokenOFT
```

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 `ChilizTokenAdapter` ve `BaseTokenOFT` sözleşmeleriniz her iki zincire deploy edildi ancak tamamen izole durumdalar.\
Base sözleşmesi token basmasını söyleyen bir mesaj aldığında, bu mesajın gerçekten sizin Chiliz'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ı Chiliz Chain'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. Chiliz Chain sözleşmesine Base sözleşmesine, Base sözleşmesine de Chiliz Chain 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! Chiliz Adapter artık Base'e basım komutları göndermeye yetkilidir ve Base, kilit açma komutlarını Chiliz'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, Chiliz Chain Mainnet'ten Base 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 $CHZ (kaynak zincirin yerel gas token'ı) ile ücret kesecek ve transferi başlatacaktır.

{% hint style="info" %}
`ChilizTokenAdapter`'ın mevcut Fan Token'larınızı kilitleme iznine ihtiyacı olduğundan, bir ERC-20 `approve()` işlemi gereklidir.

LayerZero CLI bunu algılar ve mesaj göndermeden önce onayı otomatik olarak gerçekleştirir.
{% endhint %}

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

1. Yapılandırmanızda Chiliz Mainnet (`30409`) ve Base Mainnet (`30184`) ayarlarını bulur.
2. LayerZero Executor tarafından gereken çapraz zincir ücretini hesaplar.
3. Chiliz 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ı Chiliz Chain'den Base'e token köprülediğinde, her iki zincirin gas ücretini Chiliz'de yapılan tek bir işlemde peşin öder ($CHZ kullanarak). LayerZero ardından bu ücretin bir bölümünü Base'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: 'ChilizTokenAdapter',
        to: 'BaseTokenOFT',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,        // 1 = Standart OFT Transferi (SEND)
                    optionType: 1,     // 1 = lzReceive Seçeneği
                    gas: 200000,       // Base'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: 'BaseTokenOFT',
        to: 'ChilizTokenAdapter',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,
                    optionType: 1,
                    gas: 200000,       // Chiliz'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 Chiliz'deki hem de Base'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/chiliz-chainden-basee-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.
