> 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-solanaya-kopru.md).

# Chiliz Chain'den Solana'ya Köprü

Mevcut bir token'ı Chiliz Chain'den Solana'ya 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 (Solana) bir Yerel OFT.

*LayerZero'nun OFT sözleşmeleri için kendi QuickStart rehberini sağladığını unutmayın:*

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

## Ön Koşullar

{% hint style="info" %}
Chiliz Chain'den (EVM) Solana'ya (EVM Dışı) köprüleme, çift yığın geliştirme gerektirir.\
Her iki ekosistem için de ortamlar ve cüzdanlar kurmanız gerekecektir.

Bu nedenle şu ortamlara ihtiyacınız olacak:

* Chiliz Chain etkileşimleri için: Node/npx ve Hardhat.
* Solana etkileşimleri için: [Rustup](https://rustup.rs/) (Solana akıllı sözleşmeleri Rust programlama dili kullanır), [Solana CLI ve Anchor çerçevesi](https://solana.com/docs/intro/installation) ve [LayerZero'nun Solana SDK'sı](https://docs.layerzero.network/v2/tools/sdks/solana-sdk).
  {% endhint %}

Bu rehber için şunlar gereklidir:

* Chiliz Chain'de bir token sözleşme adresi. Sahibi olmanız gerekmez.
* Her zincir için bir Web3 cüzdanı (MetaMask EVM dışı zincirleri desteklemez):
  * Chiliz Chain için: [Chiliz Chain RPC yapılandırmasıyla](/tr/gelistir/temel-ogeler/chiliz-chaine-baglanma/rpc-ile-baglanma.md) MetaMask cüzdanı.
  * Solana için: [Solana Mainnet yapılandırmasıyla](https://solana.com/docs/references/clusters) [Solflare](https://www.solflare.com/) cüzdanı. İşte [kurulum kılavuzları](https://www.solflare.com/guides/how-to-set-up-your-first-crypto-wallet-with-solflare-step-by-step/).
* 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ı.
  * Solana'da: SOL token'ları.

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

{% hint style="info" %}
**"Shared Decimals" Sorunu**

Solana token matematiğini Ethereum Sanal Makinesinden (EVM) farklı biçimde yönettiğinden, ondalık basamakları doğru işlememiz gerekir:

* Chiliz Chain (EVM): Standart ERC-20 token'ları genellikle 18 ondalık basamağa sahiptir.
* Solana: Yerel SPL Token'ları genellikle 9 ondalık basamağa sahiptir.

Chiliz'den Solana'ya $1 \times 10^{18}$ birim gönderirseniz, Solana sözleşmesi miktarı yanlış yorumlar ve hedef zincirde token'ın büyük bir enflasyonuna yol açar.

Matematiği normalleştirmek için LayerZero bir `sharedDecimals` yapılandırması kullanır. Varsayılan olarak, LayerZero V2 OFT standardı `sharedDecimals` değerini 6 olarak ayarlar.

* Bir kullanıcı Chiliz'den 1.00 token köprülediğinde, Adapter en düşük 12 ondalık basamağı ("toz" olarak değerlendirerek) bırakır ve sayıyı 6 ondalık basamağa indirir.
* Mesaj köprü üzerinden gönderilir.
* Solana programı 6 ondalık basamaklı sayıyı alır ve basmadan önce yerel 9 ondalık basamağa yükseltir.

[Daha fazla bilgi için buraya bakın](https://docs.layerzero.network/v2/faq#what-is-shareddecimals-can-i-override-default-shareddecimals-in-an-oft-contract).
{% endhint %}

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

{% hint style="info" %}
LayerZero'nun `OFTAdapter`'ı varsayılan olarak `sharedDecimals` değerini 6 olarak ayarladığından, standart uygulamayı kullanabilirsiniz. Bunu değiştirmeniz gerekirse (örneğin 8'e), `sharedDecimals()` fonksiyonunu geçersiz kılarsınız.
{% endhint %}

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 ChilizSolanaAdapter is OFTAdapter {
    constructor(
        address _token,      // Chiliz Chain'deki MEVCUT Token'ınızın adresi (18 ondalık basamak)
        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 %}

### Solana'da `OFT` Hazırlama ve Deploy Etme

Chiliz Chain'in aksine, Solana Ethereum Sanal Makinesini (EVM) veya Solidity dilini kullanmaz. Solana akıllı sözleşmeleri ("Programlar") [Rust](https://rust-lang.org/) dilinde yazılır.

Token'ınızı köprülemek için Solana'ya bir OFT programı deploy etmeniz gerekir. Bu program, Chiliz'de deploy edilen OFTAdapter'ınızdan doğrulanmış bir mesaj aldığında, karşılık gelen SPL token'ını kullanıcının Solana cüzdanına basacaktır.

{% embed url="<https://docs.layerzero.network/v2/developers/solana/oft/overview>" %}

LayerZero, Rust köprü mantığını sıfırdan yazmanıza gerek kalmayacak şekilde [kullanıma hazır bir Anchor örneği](https://github.com/LayerZero-Labs/devtools/tree/main/examples/oft-solana) sağlar.

#### 1. LayerZero OFT Solana örneğini klonlayın:

```bash
git clone https://github.com/LayerZero-Labs/devtools.git
cd devtools/examples/oft-solana
npm install
```

#### 2. Rust programını derleyin

Bu işlem aynı zamanda benzersiz Solana Program ID'nizi de oluşturur (EVM'deki sözleşme adresine eşdeğer):

```bash
anchor build
```

Derleme tamamlandıktan sonra Anchor, `target/deploy/oft_solana-keypair.json` dosyasında yeni bir anahtar çifti oluşturacaktır.\
Yeni Program ID'nizi şunu çalıştırarak alabilirsiniz:

```bash
anchor keys list
```

#### 3. Solana Mainnet'e deploy edin

Solana CLI'nizin Mainnet için yapılandırıldığından ve yerel cüzdanınızın deploy ve depolama kirası için yeterli $SOL'a sahip olduğundan emin olun.\
Deploy etmeden önce `Anchor.toml` dosyasını ve `lib.rs`'deki declare\_id! makrosunu bu yeni Program ID ile güncellemeyi unutmayın.

```bash
solana config set --url mainnet-beta
anchor deploy
```

#### 4. OFT'yi ve SPL Mint'i başlatın

Solana'da token'ın mantığı ve defteri ayrılmıştır. Yeni bir Mint Hesabı (SPL Token) başlatmanız ve yeni deploy edilen OFT Programınızı Mint Authority olarak atamanız gerekir. Bu, yalnızca LayerZero köprüsünün Solana'da yeni token basabilmesini sağlar.

LayerZero SDK, bu başlatmayı doğrudan komut satırından gerçekleştirmek için Hardhat/TypeScript görevleri sağlar. `oft-solana` projenizde LayerZero Endpoint'inizi Solana için (`30168`) yapılandırın ve başlatma betiğini çalıştırın:

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

```bash
npx hardhat lz:oft-solana:init --program-id <YOUR_NEW_PROGRAM_ID> --mint-decimals 9 --shared-decimals 6
```

{% endcode %}

{% hint style="info" %}
Kritik Parametreler:

* `--mint-decimals 9`: Solana'da standart SPL token hassasiyetini ayarlar.
* `--shared-decimals 6`: Chiliz Chain `OFTAdapter`'ınızda yapılandırdığınız (veya varsayılan) shared decimals değeriyle eşleşmelidir. Bu, 1 Chiliz token = 1 Solana token garantisini sağlar.
  {% endhint %}

Bu başlatma işlemi Solana blockchain'inde onaylandıktan sonra, yerel OFT programınız tam olarak kurulmuş ve Chiliz OFTAdapter'a bağlanmaya hazır!

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

Chiliz Adapter'ınız deploy edildi ve Solana OFT programınız başlatıldı; şimdi bağlantılarını yapılandırmanız gerekir. Bu noktada EVM ve EVM dışı ağlar arasındaki fark belirginleşir.

{% hint style="info" %}
Adres Formatlaması:

* Chiliz Chain (EVM): Standart 20 baytlık onaltılık adresler kullanır (örn. `0x123...`).
* Solana: Base58 kodlu adresler kullanır (örn. `YourProgramId111111111111111111111111111111`).
  {% endhint %}

LayerZero'nun çapraz zincir mesajlaşması, tüm [eş adreslerinin](https://docs.layerzero.network/v2/concepts/glossary#peer) `bytes32` olarak formatlanmasını gerektirir. Neyse ki, endpoint'leri yapılandırmanızda doğru biçimde tanımladığınız sürece LayerZero V2 Hardhat araçları Base58'den Bytes32'ye dönüştürmeyi otomatik olarak gerçekleştirir.

[Simple Config Generator](https://docs.layerzero.network/v2/tools/simple-config), çift yönlü bağlantıları otomatikleştirdiği için önerilen yöntemdir.

Hardhat projenizin kökünde `layerzero.config.ts` dosyasını oluşturun veya güncelleyin:

{% code lineNumbers="true" %}

```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: 'ChilizSolanaAdapter', // EVM üzerindeki Hardhat deploy adınız
};

const solanaContract: OmniPointHardhat = {
    eid: EndpointId.SOLANA_V2_MAINNET,
    address: 'YourSolanaProgramIdHereInBase58', // Solana için Base58 adres formatı
};

// Solana için Çalıştırma Seçeneklerini Tanımlayın (Compute Unit & Lamport)
const SOLANA_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1,
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000,    // Hedef yürütme için gereken Solana Compute Unit
        value: 2500000, // Potansiyel ATA oluşturma kira ücretini karşılamak için Lamport
    },
];

// Chiliz'e dönüş yolculuğu için Çalıştırma Seçeneklerini Tanımlayın (EVM Gas)
const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1, 
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000, // Chiliz'de token açmak için standart EVM gas birimi
        value: 0,
    },
];

// Oluşturulan Yapılandırmayı Dışa Aktarın
export default async function () {
    return {
        contracts: [
            { contract: chilizContract },
            { contract: solanaContract },
        ],
        connections: await generateConnectionsConfig([
            [
                chilizContract, 
                solanaContract,
                [['LayerZero Labs'], []], 
                [1, 1], 
                [SOLANA_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Seçenekler [Solana SVM'ye, Chiliz EVM'ye]
            ],
        ]),
    };
}
```

{% endcode %}

LayerZero wire görevi bunu okuyacak, Base58 dizesini çözecek, 32 bayta dolduracak ve güvenli biçimde Chiliz OFTAdapter'ın `setPeer` fonksiyonuna geçirecektir.

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

Sözleşmeleriniz yazıldı ve `layerzero.config.ts`'niz hazırlandı; Chiliz OFTAdapter'ı deploy etme zamanı. Adım 1'de Anchor kullanarak Solana yerel OFT programını zaten oluşturup deploy ettiğinizden, bu adım Hardhat kullanarak köprünün EVM tarafını deploy etmeye odaklanmaktadır.

### **Chiliz OFTAdapter Sözleşmesinin Deploy Edilmesi**

Hardhat projenizde, `deploy/` dizininde `01_deploy_chiliz_solana_adapter.ts` adında bir deploy betiği oluşturun. Bu betik, mevcut token adresinizi ve Chiliz Endpoint V2 adresini (EID) constructor'a geçirir.

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

```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 (18 ondalık basamak)
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // Chiliz Mainnet Endpoint V2 Adresi
    const CHILIZ_ENDPOINT_V2 = "0x6F475642a6e85809B1c36Fa62763669b1b48DD5B";

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

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

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

{% endcode %}

### **Chiliz OFTAdapter'ın Deploy Edilmesi**

{% hint style="info" %}
Devam etmeden önce şunlardan emin olun:

* Elde edilen Base58 Program ID'yi `layerzero.config.ts` dosyanıza kopyaladınız.
* `hardhat.config.ts` dosyanızda Chiliz Chain Mainnet için RPC URL'si ve private key doğru şekilde yapılandırıldı.
  {% endhint %}

EVM Adapter'ı deploy etmek için terminalinizde şu komutu çalıştırın:

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

```bash
npx hardhat deploy --network chiliz --tags ChilizSolanaAdapter
```

{% endcode %}

Deploy tamamlandıktan sonra Hardhat, Chiliz sözleşme adresini `deployments/` klasörüne kaydedecektir.

Bu noktada hem Chiliz Chain'de (EVM) hem de Solana'da (SVM) canlı sözleşmeleriniz var, ancak henüz birbirlerine güvenmiyorlar. Onları tanıştırma zamanı!

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

OFTAdapter sözleşmenizin ve OFT programınızın iletişim kurmasını sağlamak için onları güvenilir eşler olarak "bağlamanız" gerekir.

İki tamamen farklı Sanal Makine (EVM ve SVM) arasında köprü kurduğumuzdan, yapılandırma özel dikkat gerektirir.

{% hint style="info" %}
**EVM gas ile Solana compute unit karşılaştırması**

Bir kullanıcı Chiliz Chain'den başka bir EVM zincirine (Base gibi) token köprülediğinde, LayerZero Executor'ın `lzReceive` fonksiyonunu çağırması için EVM gas'ına ihtiyacı vardır.

Ancak Chiliz Chain'den Solana'ya köprülerken, hedef zincir EVM gas kullanmaz. [Compute Unit ve Lamport ($SOL'un kesintileri) kullanır](https://solana.com/docs/core/fees).\
Ayrıca, bir kullanıcı token'ları henüz token'ınızı tutmayan bir Solana cüzdanına köprülerse, Executor onlar için bir İlişkili Token Hesabı (ATA) oluşturmak için Solana'nın "kira muafiyeti" ücretini ödemek zorundadır. Bu, hedefe gerçek $SOL değeri bırakmayı gerektirir.
{% endhint %}

Executor'ın Solana'da token basacak ve ATA oluşturacak yeterli Compute Unit ve Lamport'a sahip olmasını garanti etmek için, bağlamadan *önce* bu limitleri `layerzero.config.ts` dosyanızda tanımlamanız gerekir.

Terminalinizde otomatik wire komutunu çalıştırın:

{% code lineNumbers="true" %}

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

{% endcode %}

Bu, 6 gerekli yapılandırma işlemini hazırlayacaktır:

1. `setSendLibrary`: Giden paketler için MessageLib'i atar.
2. `setReceiveLibrary`: Gelen paketler için MessageLib'i atar.
3. `setConfig`: DVN'leri ve Executor'ı yapılandırır.
4. `setConfig`: Gelen doğrulama için DVN'leri yapılandırır.
5. `setEnforcedOptions`: Tutarlı çalıştırma parametrelerini sağlar (kullanıcının Solana Compute Unit'i ve Lamport kirasını karşılayacak yeterli miktarı peşin ödemesini garanti etmek için kritiktir).
6. `setPeer`: Solana EID'yi hedef Base58 Program ID'nize bağlar.

LayerZero V2 araç seti ağır işi otomatikleştirir: Base58 Solana adresini çözecek, gerekli `bytes32` EVM formatına dolduracak ve her iki zincire de `setPeer` ve `setEnforcedOptions` işlemlerini gönderecektir.

Bağlantı işlemleri onaylandıktan sonra EVM'den Solana'ya köprünüz aktif ve güvenli biçimde izin verilmiş olacaktır.

Token'ınız artık resmi olarak EVM/SVM engelini aşmaya hazır!

## Adım 5: Operasyon ve Test

Chiliz Adapter'ınız deploy edildi, Solana Yerel OFT'niz başlatıldı ve ikisi düzgün biçimde bağlandı; token'ınız artık resmi olarak EVM/SVM engelini aşmaya hazır. Son adım, Chiliz Chain'den Solana'ya bir test transferi gerçekleştirmek ve izlemektir.

### 1) Solana'ya Çapraz Zincir Mesajı Gönderme

LayerZero V2 araç seti, doğrudan komut satırından OFT transferleri göndermek için bir Hardhat görevi içerir.

EVM'den EVM'ye transferlerin aksine, hedefiniz burada bir Base58 Solana cüzdan adresidir. LayerZero CLI, mesaj payload'ı için Base58'den Bytes32'ye dönüşümü otomatik olarak gerçekleştirir.

Terminalinizde ş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 30168 --to <YOUR_SOLANA_WALLET_ADDRESS_BASE58> --amount 10
```

{% endcode %}

{% hint style="info" %}
Burada neler oluyor?

1. Betik çapraz zincir ücretini $CHZ cinsinden hesaplar (EVM gas, doğrulayıcı ağ ücretleri ve Solana hedef ücretlerini kapsar).
2. Chiliz Adapter'ınızda `send()` fonksiyonunu çağırır.
3. Adapter 10 token'ı kilitler (18 ondalık basamak). Payload'ı 6 `sharedDecimal`'e indirmek için en düşük 12 ondalık basamağı "toz" olarak bırakır (Chiliz cüzdanınızda kalır).
4. LayerZero Endpoint, paketi Solana Mainnet'e doğru yayınlar.
   {% endhint %}

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

Solana'ya köprüleme, iki tamamen farklı konsensüs mekanizması arasında çeviri yapmayı ve SVM kesinliğini beklemeyi içerdiğinden, eşzamansız bir 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.

Bu araç hakkında daha fazla bilgi edinin:

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

{% hint style="info" %}

#### Ondalık Çeviri

Solana Yerel OFT, köprüden gelen 6 ondalık basamaklı payload'ı otomatik olarak standart SPL 9 ondalık basamağına yükseltecektir; böylece Solana cüzdanınız tam olarak 10 token alır.
{% endhint %}

**4) Takılı Mesajlarda Sorun Giderme**

İşleminiz Chiliz'de onaylandı ancak Solana'da yürütülmedi olarak işaretlendiyse, en yaygın neden Yetersiz Lamport veya Compute Unit hatasıdır.

* Hedef Solana cüzdanı belirtilen token için zaten bir İlişkili Token Hesabına (ATA) sahip değilse, LayerZero Executor bunu oluşturmak için Solana'nın "kira muafiyeti" ücretini ödemek zorunda kaldı.
* `enforcedOptions`'daki `value` parametresi (Lamport) bu kirayı karşılayacak kadar düşük ayarlandıysa veya `gas` (Compute Unit) yetersizse, Executor kendi cebinden ödemeyi reddedecek ve mesaj takılı kalacaktır.
* Çözüm: Token'larınızı kaybetmiyorsunuz. Takılı bir mesajı LayerZero Scan arayüzü aracılığıyla manuel olarak ilerletebilirsiniz. Solana cüzdanınızı bağlayın, blok gezginindeki "Force Resume" veya "Execute" düğmesine tıklayın ve basımı sonlandırmak için yerel hedef ücretini ($SOL cinsinden Compute Unit + ATA Kirası) kendiniz ödeyin.


---

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