> 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/jp/kaihatsu/joukyu/omnichain-tokens/chiliz-kara-solana.md).

# Chiliz Chain から Solana へ bridge する

既存のトークンを Chiliz Chain から Solana へ bridge するには、2 つの別々の smart contract を記述して deploy する必要があります。トークンがすでに存在するチェーン（Chiliz Chain）上の OFT Adapter と、宛先チェーン（Solana）上の Native OFT です。

*なお、LayerZero は OFT contract 用の独自の QuickStart を提供しています:*

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

## 前提条件

{% hint style="info" %}
Chiliz Chain（EVM）から Solana（非 EVM）への bridge には、デュアルスタック開発が必要です。\
両方のエコシステム向けに環境とウォレットをセットアップする必要があります。

そのため、以下の環境が必要になります:

* Chiliz Chain とのやり取り用: Node/npx と Hardhat。
* Solana とのやり取り用: [Rustup](https://rustup.rs/)（Solana の smart contract は Rust プログラミング言語を使用します）、[Solana CLI と Anchor framework](https://solana.com/docs/intro/installation)、および [LayerZero の Solana SDK](https://docs.layerzero.network/v2/tools/sdks/solana-sdk)。
  {% endhint %}

このガイドには以下が必要です:

* Chiliz Chain 上のトークン contract アドレス。所有している必要はありません。
* 各チェーン用の Web3 ウォレット（MetaMask は非 EVM チェーンをサポートしていません）:
  * Chiliz Chain 用: [Chiliz Chain RPC 設定](/jp/kaihatsu/kihon/chiliz-chain-setsuzoku/rpc-setsuzoku.md)を備えた MetaMask ウォレット。
  * Solana 用: [Solana Mainnet 設定](https://solana.com/docs/references/clusters)を備えた [Solflare](https://www.solflare.com/) ウォレット。[セットアップガイドはこちら](https://www.solflare.com/guides/how-to-set-up-your-first-crypto-wallet-with-solflare-step-by-step/)。
* 各チェーン上で、contract の deploy 費用とメッセージ送信の gas 手数料を支払うのに十分な gas トークン。
  * Chiliz Chain 上: CHZ トークン。
  * Solana 上: SOL トークン。

## ステップ 1: Contract の開発

{% hint style="info" %}
**「Shared Decimals」の課題**

Solana は Ethereum Virtual Machine（EVM）とは異なる方法でトークンの計算を扱うため、decimals を正しく処理する必要があります:

* Chiliz Chain（EVM）: 標準的な ERC-20 トークンは通常 18 decimals の精度を持ちます。
* Solana: ネイティブな SPL Token は通常 9 decimals の精度を持ちます。

$$ $1 \times 10^{18}$ $$ 単位を Chiliz から Solana へ送信すると、Solana の contract は数量を誤って解釈し、宛先チェーン上でトークンが大幅にインフレする結果となります。

計算を正規化するため、LayerZero は `sharedDecimals` 設定を使用します。デフォルトでは、LayerZero V2 OFT 標準は `sharedDecimals` を 6 に設定します。

* ユーザーが Chiliz から 1.00 トークンを bridge すると、Adapter は最下位の 12 decimals（「dust」として扱う）を切り捨て、数値を 6 decimals に縮小します。
* メッセージが bridge を越えて送信されます。
* Solana プログラムは 6 decimals の数値を受け取り、mint する前にローカルの 9 decimals まで\_拡大\_します。

[詳しくはこちら](https://docs.layerzero.network/v2/faq#what-is-shareddecimals-can-i-override-default-shareddecimals-in-an-oft-contract)。
{% endhint %}

### Chiliz Chain 上の `OFTAdapter` の準備

{% hint style="warning" %}
これは準備のステップです。すぐに deploy しないでください！\
deploy はステップ 3 で行います。
{% endhint %}

`OFTAdapter` contract は、既存のトークンのための保管庫（lockbox）として機能します。ユーザーが Chiliz Chain からトークンを bridge して移動させると、この contract が元の ERC20 トークンをロックします。

{% hint style="info" %}
LayerZero の `OFTAdapter` はデフォルトで `sharedDecimals` を 6 に設定するため、標準の実装を使用できます。これを変更する必要がある場合（例: 8 に）、`sharedDecimals()` 関数をオーバーライドします。
{% endhint %}

contracts フォルダに `ChilizTokenAdapter.sol` という名前の新しいファイルを作成します:

```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 ChilizSolanaAdapter is OFTAdapter {
    constructor(
        address _token,      // The address of your EXISTING Token on Chiliz Chain (18 decimals)
        address _lzEndpoint, // The LayerZero V2 Endpoint address on Chiliz
        address _delegate    // The address capable of making configuration changes ( (usually your wallet)
    ) OFTAdapter(_token, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
ご覧のとおり、この contract は [LayerZero OFT Adapter contract](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFTAdapter.sol) を継承しており、管理キーを付与するための標準的な `Ownable.sol` contract も継承しています。あなた、そしてあなただけが安全にチェーン同士を接続（wire）できるようにするため、両方が必要です。
{% endhint %}

### Solana 上の `OFT` の準備と deploy

Chiliz Chain とは異なり、Solana は Ethereum Virtual Machine（EVM）や Solidity 言語を使用しません。Solana の smart contract（「Programs」と呼ばれます）は [Rust](https://rust-lang.org/) で記述されます。

トークンを bridge するには、Solana 上に OFT プログラムを deploy する必要があります。このプログラムが Chiliz に deploy された OFTAdapter から検証済みメッセージを受け取ると、対応する SPL トークンをユーザーの Solana ウォレットに mint します。

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

LayerZero は、Rust の bridge ロジックを一から記述しなくて済むよう、[すぐに使える Anchor の例](https://github.com/LayerZero-Labs/devtools/tree/main/examples/oft-solana) を提供しています。

#### 1. LayerZero OFT Solana の例を clone する:

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

#### 2. Rust プログラムをビルドする

これにより、固有の Solana Program ID（EVM における contract アドレスに相当）も生成されます:

```bash
anchor build
```

ビルドが完了すると、Anchor は `target/deploy/oft_solana-keypair.json` に新しい keypair を生成します。\
新しい Program ID は次のコマンドを実行すると取得できます:

```bash
anchor keys list
```

#### 3. Solana Mainnet に deploy する

Solana CLI が Mainnet 用に設定されており、ローカルウォレットに deploy とストレージレント用の $SOL が十分にあることを確認してください。\
deploy 前に、`Anchor.toml` ファイルと `lib.rs` の declare\_id! マクロを、この新しい Program ID で更新するのを忘れないでください。

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

#### 4. OFT と SPL Mint を初期化する

Solana では、トークンのロジックとその台帳（ledger）が分離されています。新しい Mint Account（SPL Token）を初期化し、新たに deploy した OFT プログラムを Mint Authority として割り当てる必要があります。これにより、LayerZero bridge のみが Solana 上で新しいトークンを mint できるようになります。

LayerZero SDK は、この初期化をコマンドラインから直接処理するための Hardhat/TypeScript タスクを提供しています。`oft-solana` プロジェクトで、Solana 用の LayerZero Endpoint（`30168`）を設定し、初期化スクリプトを実行します:

{% 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" %}
重要なパラメータ:

* `--mint-decimals 9`: Solana 上での標準的な SPL トークン精度を設定します。
* `--shared-decimals 6`: Chiliz Chain の `OFTAdapter` で設定した shared decimals（またはデフォルト）と一致させる必要があります。これが 1 Chiliz トークン = 1 Solana トークンを保証するものです。
  {% endhint %}

この初期化トランザクションが Solana ブロックチェーン上で確認されると、ネイティブ OFT プログラムは完全にセットアップされ、Chiliz OFTAdapter に接続（wire）する準備が整います！

## ステップ 2: LayerZero の設定

Chiliz Adapter が deploy され、Solana OFT プログラムが初期化されたら、次にそれらの接続を設定する必要があります。ここで EVM ネットワークと非 EVM ネットワークの違いが非常にはっきりと現れます。

{% hint style="info" %}
アドレスのフォーマット:

* Chiliz Chain（EVM）: 標準的な 20 バイトの 16 進数アドレスを使用します（例: `0x123...`）。
* Solana: Base58 エンコードのアドレスを使用します（例: `YourProgramId111111111111111111111111111111`）。
  {% endhint %}

LayerZero のクロスチェーンメッセージングでは、すべての [peer アドレス](https://docs.layerzero.network/v2/concepts/glossary#peer) を `bytes32` としてフォーマットする必要があります。幸いなことに、設定でエンドポイントを正しく定義していれば、LayerZero V2 の Hardhat ツールが Base58 から Bytes32 への変換を自動的に処理してくれます。

[Simple Config Generator](https://docs.layerzero.network/v2/tools/simple-config) は、wiring 設定を生成するための推奨される方法です。双方向の wiring を自動化し、内部で推奨されるセキュリティ設定を適用します。

Hardhat プロジェクトのルートに `layerzero.config.ts` ファイルを作成または更新します:

{% 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';

// Define the Contracts
const chilizContract: OmniPointHardhat = {
    eid: EndpointId.CHILIZ_V2_MAINNET,
    contractName: 'ChilizSolanaAdapter', // Your Hardhat deployment name on EVM
};

const solanaContract: OmniPointHardhat = {
    eid: EndpointId.SOLANA_V2_MAINNET,
    address: 'YourSolanaProgramIdHereInBase58', // Base58 address format for Solana
};

// Define Execution Options for Solana (Compute Units & Lamports)
const SOLANA_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1,
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000,    // Solana Compute Units needed for destination execution
        value: 2500000, // Lamports to cover the potential ATA creation rent fee
    },
];

// Define Execution Options for the return trip to Chiliz (EVM Gas)
const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1, 
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000, // Standard EVM gas units to unlock tokens on Chiliz
        value: 0,
    },
];

// Export the Generated Configuration
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], // Options [To Solana SVM, To Chiliz EVM]
            ],
        ]),
    };
}
```

{% endcode %}

LayerZero の wire タスクはこれを読み取り、Base58 文字列をデコードし、32 バイトにパディングして、Chiliz OFTAdapter の `setPeer` 関数に安全に渡します。

## ステップ 3: デプロイのワークフロー

contract を記述し、`layerzero.config.ts` を準備したら、Chiliz OFTAdapter を deploy する時です。ステップ 1 ですでに Anchor を使って Solana のネイティブ OFT プログラムをビルドして deploy しているため、このステップでは Hardhat を使って bridge の EVM 側を deploy することに焦点を当てます。

### **Chiliz OFTAdapter contract の deploy**

Hardhat プロジェクトで、`deploy/` ディレクトリに `01_deploy_chiliz_solana_adapter.ts` という名前のデプロイスクリプトを作成します。このスクリプトは、既存のトークンアドレスと Chiliz Endpoint V2 アドレス（EID）を constructor に渡します。

{% 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();

    // The address of your existing ERC-20 token on Chiliz (18 decimals)
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // The Chiliz Mainnet Endpoint V2 Address
    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 (Owner)
        ],
        log: true,
        waitConfirmations: 2,
    });
};

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

{% endcode %}

### **Chiliz OFTAdapter の deploy**

{% hint style="info" %}
進める前に、以下を確認してください:

* 生成された Base58 Program ID を `layerzero.config.ts` ファイルにコピーしたこと。
* `hardhat.config.ts` に Chiliz Chain Mainnet 用の RPC URL と秘密鍵が正しく設定されていること。
  {% endhint %}

EVM Adapter を deploy するには、ターミナルで次のコマンドを実行します:

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

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

{% endcode %}

deploy が完了すると、Hardhat は Chiliz contract アドレスを `deployments/` フォルダに保存します。

この時点で、Chiliz Chain（EVM）と Solana（SVM）の両方にライブな contract がありますが、まだ互いを信頼していません。両者を引き合わせる時です！

## ステップ 4: Wiring と Peering

OFTAdapter contract と OFT プログラムが通信できるようにするには、両者を信頼できる peer として「wire」する必要があります。

私たちはまったく異なる 2 つの仮想マシン（EVM と SVM）をまたいで bridge しているため、設定には特別な注意が必要です。

{% hint style="info" %}
**EVM の gas と Solana の compute units**

ユーザーが Chiliz Chain から別の EVM チェーン（Base など）へトークンを bridge する場合、LayerZero Executor は `lzReceive` を呼び出すために EVM gas を必要とします。

しかし、Chiliz Chain から Solana へ bridge する場合、ターゲットチェーンは EVM gas を使用しません。[Compute Units と Lamports（$SOL の端数）を使用します](https://solana.com/docs/core/fees)。\
さらに、ユーザーがあなたのトークをまだ保有していない Solana ウォレットへトークンを bridge する場合、Executor はそのウォレット用に Associated Token Account（ATA）を作成するために Solana の「rent exemption」手数料を支払う必要があります。これには宛先で実際の $SOL の価値を投入する必要があります。
{% endhint %}

Executor が Solana 上でトークンを mint し、ATA を作成するのに十分な Compute Units と Lamports を確実に持てるようにするため、wiring の\_前に\_これらの上限を `layerzero.config.ts` ファイルで定義する必要があります。

ターミナルで自動 wire コマンドを実行します:

{% code lineNumbers="true" %}

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

{% endcode %}

これにより、必要な 6 つの設定トランザクションが準備されます:

1. `setSendLibrary`: 送信パケット用の MessageLib を割り当てます。
2. `setReceiveLibrary`: 受信パケット用の MessageLib を割り当てます。
3. `setConfig`: DVN と Executor を設定します。
4. `setConfig` : 受信検証用の DVN を設定します。
5. `setEnforcedOptions`: 一貫した実行パラメータを保証します（ユーザーが Solana の Compute Units と Lamport レントを賄うのに十分な金額を前払いすることを保証するために重要です）。
6. `setPeer`: Solana EID を宛先の Base58 Program ID にリンクします。

LayerZero V2 toolbox は面倒な作業を自動化します。Base58 の Solana アドレスをデコードし、必要な `bytes32` の EVM フォーマットにパディングし、`setPeer` と `setEnforcedOptions` トランザクションを両方のチェーンに送信します。

wiring トランザクションが確認されると、EVM から Solana への bridge がライブになり、安全に権限が付与されます。

あなたのトークンは、いよいよ EVM/SVM の壁を越える準備が整いました！

## ステップ 5: 運用とテスト

Chiliz Adapter が deploy され、Solana Native OFT が初期化され、両者が適切に wire されたことで、あなたのトークンはいよいよ EVM/SVM の壁を越える準備が整いました。最後のステップは、Chiliz Chain から Solana へのテスト転送を実行して追跡することです。

### 1) Solana へのクロスチェーンメッセージの送信

LayerZero V2 toolbox には、OFT 転送をコマンドラインから直接送信するための Hardhat タスクが含まれています。

宛先が標準的な 16 進数文字列である EVM から EVM への転送とは異なり、ここでの宛先は Base58 の Solana ウォレットアドレスです。LayerZero CLI は、メッセージペイロードのために Base58 から Bytes32 への変換を自動的に処理します。

ターミナルで次のコマンドを実行します:

{% 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" %}
ここで何が起こるのか？

1. スクリプトはクロスチェーン手数料を $CHZ で見積もります（EVM gas、verifier ネットワーク手数料、Solana 宛先手数料を賄います）。
2. Chiliz Adapter の `send()` 関数を呼び出します。
3. Adapter は 10 トークン（18 decimals）をロックします。最下位の 12 decimals を「dust」として切り捨て（Chiliz ウォレットに残します）、ペイロードを 6 `sharedDecimals` に縮小します。
4. LayerZero Endpoint が Solana Mainnet に向けてパケットを発行します。
   {% endhint %}

### 2) LayerZero Scan でのパケットの追跡

Solana への bridge では、まったく異なる 2 つのコンセンサスメカニズム間の変換と SVM のファイナリティの待機が伴うため、非同期的な遅延は正常です。

この過程をリアルタイムで追跡するには、CLI の出力に表示される LayerZero Scan リンクをクリックします。

このツールについて詳しくはこちら:

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

{% hint style="info" %}

#### Decimal の変換

Solana Native OFT は、bridge から届いた 6 decimals のペイロードを自動的に標準の SPL 9 decimals まで拡大しているため、Solana ウォレットはちょうど 10 個のトークン全体を受け取ります。
{% endhint %}

**4) 詰まったメッセージのトラブルシューティング**

トランザクションが Chiliz 上で確認済みとマークされているのに Solana 上で実行に失敗する場合、最も一般的な原因は Lamports 不足、または Compute Units エラーです。

* 宛先の Solana ウォレットがあなたの特定のトークン用の Associated Token Account（ATA）をまだ持っていなかった場合、LayerZero Executor はそれを作成するために Solana の「rent exemption」手数料を支払う必要がありました。
* `enforcedOptions` の `value` パラメータ（Lamports）がこのレントを賄うには低すぎる設定だった場合、または `gas`（Compute Units）が不十分だった場合、Executor は自腹を切ることを拒否し、メッセージは停滞します。
* 解決策: トークンが失われることはありません。詰まったメッセージは LayerZero Scan UI から手動で通すことができます。Solana ウォレットを接続し、ブロックエクスプローラー上で「Force Resume」または「Execute」ボタンをクリックし、ローカルの宛先手数料（Compute Units + $SOL での ATA レント）を自分で支払って mint を完了させます。


---

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

```
GET https://docs.chiliz.com/jp/kaihatsu/joukyu/omnichain-tokens/chiliz-kara-solana.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.
