> 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/solana-kara-chiliz.md).

# Solana から Chiliz Chain へ bridge する

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

*なお、LayerZero は OFT contract 向けに独自の QuickStart を提供しています。*

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

## 前提条件

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

したがって、以下の環境が必要になります。

* 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)。
* Chiliz Chain とのやり取り用: Node/npx と Hardhat。
  {% endhint %}

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

* Chiliz Chain へ bridge したい既存の SPL Token の mint address。
* 各チェーン用の Web3 ウォレット:
  * 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/)。
  * Chiliz Chain 用: [Chiliz Chain RPC 構成](/jp/kaihatsu/kihon/chiliz-chain-setsuzoku/rpc-setsuzoku.md)を備えた MetaMask ウォレット。
* contract のデプロイ、およびメッセージ送信の gas fee を支払うのに十分な gas トークンを各チェーン上に保有していること。
  * Solana 上: SOL トークン。
  * Chiliz Chain 上: CHZ トークン。

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

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

Ethereum Virtual Machine（EVM）は Solana とは異なる方法でトークンの計算を扱うため、トークンが bridge を渡る前に小数精度を揃える必要があります。

* Solana（ソース）: ネイティブの SPL Token は通常 9 桁の小数精度を持ちます。
* Chiliz Chain（宛先）: 標準的な ERC-20 トークン（および新しい宛先 OFT）は通常 18 桁の小数を使用します。

変換せずに 9 桁の小数のペイロードを Solana から Chiliz へ直接送信した場合、EVM contract は金額を誤って解釈し、宛先チェーンでごく微小なトークンの端数が mint される結果となります。

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

* ユーザーが Solana から 1.00 SPL トークンを bridge すると、Solana Adapter はその数値を 6 桁の小数にスケールダウンします（SPL トークンの下位 3 桁の小数を「dust」として扱い、ユーザーのウォレットに安全に残します）。
* 6 桁の小数のメッセージペイロードが bridge を渡って送信されます。
* Chiliz Chain Native OFT は 6 桁の小数の数値を受け取り、ERC-20 トークンをユーザーの EVM ウォレットに mint する前に、ローカルの 18 桁の小数へとスケール\_アップ\_します。

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

### Solana Program の開発

トークンはすでに Solana 上に存在するため、新しいトークン contract を作成する必要はありません。代わりに、Rust で記述された Solana OFT Adapter Program をデプロイします。この program は分散型ロックボックスとして機能し、ユーザーがトークンを Chiliz Chain へ bridge する際に SPL トークンを安全に保持し、ユーザーが bridge して戻す際にそれらを解放します。

LayerZero は、ビルド済みで監査済みの contract を備えた Anchor workspace を提供しているため、Rust のロジックをゼロから記述する必要はありません。

#### **1. LayerZero Solana SDK のクローン**

まず、Solana OFT Adapter のサンプルを含む公式の LayerZero 開発者ツールリポジトリをクローンします。

ターミナルを開いて、次を実行します。

{% code overflow="wrap" %}

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

{% endcode %}

#### **2. Solana Adapter Program のビルド**

このディレクトリは、Native OFT と OFT Adapter の両方の実装を含む Anchor workspace です。固有の Solana Program ID を生成するために、Rust program をビルドする必要があります。

{% code overflow="wrap" %}

```bash
anchor build
```

{% endcode %}

ビルドが完了したら、次を実行して新しい Program ID を取得します。

{% code overflow="wrap" %}

```bash
anchor keys list
```

{% endcode %}

{% hint style="warning" %}
デプロイ前に、新しい Program ID で `Anchor.toml` ファイルと `programs/oft-adapter/src/lib.rs` ファイル内の `declare_id!` マクロを更新する必要があります。
{% endhint %}

#### **3. Solana Mainnet へのデプロイ**

Solana CLI が Mainnet 用に構成されていること、およびローカルウォレットがデプロイサイズとストレージレントをカバーするのに十分な $SOL を保有していることを確認してください。

{% code overflow="wrap" %}

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

{% endcode %}

#### **4. OFT Adapter の初期化**

新しい Mint の作成を必要とする Native OFT とは異なり、Adapter の初期化は、新しくデプロイした Program ID を既存の SPL Token Mint Address にリンクするだけです。

LayerZero SDK は、この初期化をコマンドラインから処理するための Hardhat タスクを提供しています。Solana LayerZero Endpoint（`30168`）が構成されていることを確認してから、次を実行します。

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

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

{% endcode %}

ここには重要なパラメータがあります。

* `--mint`: これは、bridge したい SPL トークンの正確な Base58 Mint Address でなければなりません。Adapter は、このトークン専用の escrow アカウントを作成します。
* `--shared-decimals 6`: これは、Adapter が EVM に送信する前にペイロードをどのようにスケールするかを規定します。Solana トークンが 9 桁の小数を持つ場合、ここで shared decimals を 6 のままにすることで、オーバーフローの問題なく bridge を安全に渡って変換されることが保証されます。

この初期化トランザクションが Solana 上で確認されると、Adapter は稼働状態になり、SPL トークンを安全にロックする準備が整います！

### Chiliz Contract の開発

Solana SPL トークンは Chiliz Chain 上にはまだ存在しないため、標準的な Native `OFT` contract をデプロイする必要があります。この contract は minter として機能します。Solana Adapter から検証済みのメッセージを受け取ると、対応する ERC-20 トークンを mint します。ユーザーが Solana へ bridge して戻すと、それらを burn します。

{% hint style="info" %}
「The Shared Decimals Challenge」で説明したとおり、Solana Adapter は送信前にペイロードを 6 桁の小数へとスケールダウンします。

LayerZero の EVM 実装は、カスタムのスケーリングロジックを記述する必要がないように作られています。デフォルトでは、`OFT.sol` contract は 18 桁のローカル小数と 6 桁の shared decimals を使用します。Solana から到着する 6 桁の小数のペイロードを自動的に検出し、ERC-20 トークンをユーザーのウォレットに mint する前に、標準的な 18 桁の小数形式（$$ $1 \times 10^{18}$ $$）へとスケールアップします。
{% endhint %}

#### Chiliz Chain への OFT のデプロイ

Hardhat プロジェクトの `contracts/` フォルダーに `ChilizNativeOFT.sol` という名前の新しいファイルを作成します。

{% code lineNumbers="true" %}

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;

import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

contract ChilizNativeOFT is OFT {
    constructor(
        string memory _name,    // The name of the token (Should match your Solana SPL Token)
        string memory _symbol,  // The symbol of the token (Should match your Solana SPL Token)
        address _lzEndpoint,    // The LayerZero V2 Endpoint address on Chiliz
        address _delegate       // The address capable of making configuration changes
    ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% endcode %}

まだデプロイしないでください！ ただし、以下の点を念頭に置いてください。

* ユーザーに統一された体験を提供するため、`_name` と `_symbol` のパラメータが元の Solana SPL トークンと正確に一致していることを確認してください。
* Chiliz Mainnet にデプロイする際は、`_lzEndpoint` として Chiliz Endpoint V2 アドレス（`0x6F475642a6e85809B1c36Fa62763669b1b48DD5B`）を渡します。

## ステップ 2: LayerZero の構成

Solana Adapter が初期化され、Chiliz Native OFT がデプロイの準備ができたので、両者間の接続を構成する必要があります。

ここでの主な課題はアドレスのフォーマットです。LayerZero のクロスチェーンメッセージングでは、すべての peer アドレスを `bytes32` としてフォーマットする必要があります。LayerZero V2 Hardhat ツールボックスは、Base58 の Solana Adapter Program ID をデコードし、標準的な EVM 形式にパディングすることで、これを自動的に処理します。

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

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 solanaContract: OmniPointHardhat = {
    eid: EndpointId.SOLANA_V2_MAINNET,
    address: 'YourSolanaAdapterProgramIdHereInBase58', 
    // NOTE: Non-EVMs use 'address' instead of 'contractName'
};

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

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

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

// Export the Generated Configuration
export default async function () {
    return {
        contracts: [
            { contract: solanaContract },
            { contract: chilizContract },
        ],
        connections: await generateConnectionsConfig([
            [
                solanaContract, 
                chilizContract,
                [['LayerZero Labs'], []], 
                [1, 1], 
                [EVM_ENFORCED_OPTIONS, SOLANA_ENFORCED_OPTIONS], // Options [To Chiliz EVM, To Solana SVM]
            ],
        ]),
    };
}
```

{% endcode %}

このジェネレーターは、Solana Base58 アドレスを Chiliz smart contract が必要とする EVM `bytes32` パディングへと自動的に変換する処理を扱います。

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

この段階で、Solana Adapter はすでにコンパイル、デプロイ、初期化されています（ステップ 1 で扱ったとおり）。次に、bridge の EVM 側、つまり Native OFT を Chiliz Chain にデプロイする必要があります。

Hardhat を使用して、この contract を Chiliz Mainnet にプッシュします。

### **1. Chiliz Native OFT デプロイスクリプト**

Hardhat プロジェクトの `deploy/` ディレクトリに、`01_deploy_chiliz_native_oft.ts` という名前のデプロイスクリプトを作成します。このスクリプトは、Chiliz 上で新しい ERC-20 トークンを初期化します。

{% code lineNumbers="true" %}

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

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

    // Token Details (Must strictly match your existing Solana SPL Token)
    const TOKEN_NAME = "My Solana Token";
    const TOKEN_SYMBOL = "SOLTKN";

    // The Chiliz Mainnet Endpoint V2 Address
    const CHILIZ_ENDPOINT_V2 = "0x6F475642a6e85809B1c36Fa62763669b1b48DD5B";

    console.log("Deploying Native OFT to Chiliz Mainnet...");

    await deploy('ChilizNativeOFT', {
        from: deployer,
        args: [
            TOKEN_NAME,         // _name
            TOKEN_SYMBOL,       // _symbol
            CHILIZ_ENDPOINT_V2, // _lzEndpoint
            deployer            // _delegate (Owner)
        ],
        log: true,
        waitConfirmations: 2,
    });
};

export default deployOFT;
deployOFT.tags = ['ChilizNativeOFT'];
```

{% endcode %}

### **2. Solana Program のデプロイ**

簡単な確認として、Solana Adapter は初回デプロイに Hardhat を使用しません。以下をすでに完了しているはずです。

1. `anchor build` と `anchor deploy` を実行して、Rust program を Solana Mainnet にプッシュした。
2. `lz:oft-adapter-solana:init` タスクを実行して、Adapter を既存の SPL Token Mint にリンクした。
3. 得られた Base58 Program ID を `layerzero.config.ts` ファイルにコピーした。

### **3. Chiliz デプロイの実行**

`hardhat.config.ts` ファイルに、`chiliz` ネットワーク用の RPC URL と private key が正しく構成されていることを確認してください。

Native OFT をデプロイするには、ターミナルで次のコマンドを実行します。

{% code lineNumbers="true" %}

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

{% endcode %}

デプロイが完了すると、Hardhat は新しく mint された Chiliz contract アドレスを `deployments/` フォルダーに保存します。これで Solana（SVM）と Chiliz Chain（EVM）の両方にライブ contract が揃いましたが、両者はまだ互いに通信する権限を持っていません。

## ステップ 4: 配線とピアリング

この時点で、Solana 上に Rust Adapter Program が、Chiliz Chain 上に Native EVM OFT があります。両者が安全に通信できるようにするには、信頼できる peer として両者を「配線」する必要があります。

逆方向の bridge と同様に、私たちは 2 つのまったく異なる Virtual Machine（SVM と EVM）を扱っています。このため、Enforced Options（Gas Limit）を正しく構成することが、トランザクションが宛先チェーンで停止しないようにするうえで重要です。

### **Chiliz（EVM）用の「Enforced Options」**

ユーザーが SPL トークンを Solana から Chiliz へ bridge すると、LayerZero Executor は、ERC-20 トークンを mint するために Chiliz contract 上の `lzReceive` 関数を呼び出す EVM gas を必要とします。

逆に、戻りの行程（Chiliz から Solana へ戻る）では、Executor は SPL トークンをアンロックし、場合によっては Associated Token Account（ATA）のレントを支払うために、Solana Compute Units と Lamports を必要とします。

### **構成の更新**

Executor が両方向に十分な gas を持つことを保証するため、配線の前に `layerzero.config.ts` ファイルにこれらの上限を定義する必要があります。

config ファイル内の `connections` 配列を更新して、以下の `enforcedOptions` を含めます。

{% code lineNumbers="true" %}

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

// ... (contracts array from Step 3)

    connections: [
        // Pathway 1: Solana -> Chiliz (The primary route)
        {
            from: 'YourSolanaAdapterProgramIdHereInBase58',
            to: 'ChilizNativeOFT',
            config: {
                enforcedOptions: [
                    {
                        msgType: 1, // Standard OFT Transfer
                        optionType: ExecutorOptionType.LZ_RECEIVE,
                        gas: 200000, // Standard EVM Gas to mint tokens on Chiliz
                        value: 0,    // No native drop needed on Chiliz EVM
                    }
                ]
            },
        },
        // Pathway 2: Chiliz -> Solana (The return trip)
        {
            from: 'ChilizNativeOFT',
            to: 'YourSolanaAdapterProgramIdHereInBase58',
            config: {
                enforcedOptions: [
                    {
                        msgType: 1, 
                        optionType: ExecutorOptionType.LZ_RECEIVE,
                        gas: 200000,    // Solana Compute Units for the unlock
                        value: 2500000, // Lamports (covers the ATA rent fee if needed)
                    }
                ]
            },
        },
    ],
// ...
```

{% endcode %}

### **Wire タスクの実行**

構成が保存されると、LayerZero V2 ツールボックスがピアリングのプロセスを自動化します。Base58 の Solana アドレスをデコードし、必要な `bytes32` EVM 形式にパディングして、構成トランザクションを Solana Mainnet と Chiliz Mainnet の両方に送信します。

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

{% code lineNumbers="true" %}

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

{% endcode %}

{% hint style="info" %}
CLI はトランザクションの確認を求めてきます。構成済みの Solana ウォレットを使用してソーストランザクションを送信し（$SOL の費用がかかります）、Hardhat を使用して Chiliz 宛先トランザクションを送信します（$CHZ の費用がかかります）。
{% endhint %}

Chiliz 側では、LayerZero Hardhat ツールボックスが、必要な 6 つの構成トランザクションを自動的に生成して実行します。

1. `setSendLibrary`: メッセージ送信用の V2 MessageLib を割り当てます。
2. `setReceiveLibrary`: メッセージ受信用の MessageLib を割り当てます。
3. `setConfig`（Send Library）: DVN と Executor を構成します。
4. `setConfig`（Receive Library）: インバウンド検証用の DVN を構成します。
5. `setEnforcedOptions`: 一貫した実行パラメータを保証します（特に、戻りの行程に十分な Solana Compute Units が支払われるようにします）。
6. `setPeer`: Chiliz EID を Solana Adapter の Base58 Program ID（`bytes32` に変換されたもの）に暗号的にリンクします。

Solana SDK は、SVM 側の同等のプログラム的命令を内部で処理します。

両方のトランザクションが確認されると、Solana から Chiliz への bridge が正式に稼働し、安全に権限付与された状態になります！

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

Solana Adapter がデプロイされ、Chiliz Native OFT が初期化され、両者が適切に配線されたことで、SPL Token は正式に SVM/EVM の境界を越える準備が整いました。最後のステップは、Solana から Chiliz Chain へのテスト転送を実行して追跡することです。

### **1) Solana ウォレットの準備**

Adapter にアローワンスを付与するために、事前に個別の `approve()` トランザクションを実行する必要がある EVM とは異なり、Solana はトークンのアプルーバルと転送を同じトランザクション命令内で処理します。

ただし、ローカルの Solana ウォレット（プロジェクトで構成されているもの）が、bridge しようとしている SPL トークンの残高を実際に保有していること、およびソーストランザクション手数料と LayerZero クロスチェーンメッセージ手数料を支払うのに十分な $SOL を保有していることを確認する必要があります。

**2) Chiliz へのクロスチェーンメッセージの送信**

LayerZero V2 ツールボックスには、ソースチェーンが Solana の場合でも、コマンドラインから直接 OFT 転送を送信するための Hardhat タスクが含まれています。

Solana 間の転送とは異なり、ここでの宛先は標準的な EVM の 16 進数ウォレットアドレス（例: `0x123...`）です。LayerZero CLI は、ペイロードのパディングとバイト変換を自動的に処理します。

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

{% code lineNumbers="true" %}

```bash
npx hardhat lz:oft:send \
  --oapp-config layerzero.config.ts \
  --from-eid 30168 \
  --to-eid 30409 \
  --to <YOUR_CHILIZ_EVM_WALLET_ADDRESS> \
  --amount 10
```

{% endcode %}

{% hint style="info" %}
ここで何が起こるのでしょうか？

1. スクリプトがクロスチェーン手数料を `$SOL` で見積もります。
2. ウォレットから 10 SPL トークンを Solana Adapter の escrow アカウントへ転送するトランザクションを構築します。
3. Adapter が 9 桁の小数の SPL トークン金額を 6 桁の shared decimals へとスケールダウンします。
4. LayerZero Endpoint が Chiliz Mainnet に向けてパケットを発行します。
   {% endhint %}

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

Solana からの bridge は、2 つのまったく異なるコンセンサスメカニズム間の変換と、EVM 上で実行する前に SVM 上でトランザクションをファイナライズすることを伴うため、非同期の遅延が発生するのは正常です。

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

このツールの詳細はこちらをご覧ください。

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

{% hint style="info" %}
Chiliz Native OFT は、6 桁の小数のペイロードを EVM 標準の 18 桁の小数へと自動的にスケールアップしているため、ちょうど 10 個の完全なトークンを受け取ります。
{% endhint %}

### **4) 停止したメッセージのトラブルシューティング**

トランザクションが Solana 上で確認済みとマークされたものの Chiliz 上での実行に失敗する場合、最もよくある原因は EVM の Out-of-Gas エラーです。

* `enforcedOptions`（ステップ 5 で構成）内の `gas` パラメータが、Chiliz ネットワークが `lzReceive` の mint 関数を処理するには低く設定されすぎていた場合、LayerZero Executor はメッセージの配信に失敗します。
* 修正: トークンを失うことはありません。停止したメッセージは、LayerZero Scan UI 経由で手動でプッシュできます。EVM ウォレットを Chiliz Chain に接続し、block explorer 上の「Force Resume」または「Execute」ボタンをクリックして、自分で Chiliz gas fee を支払って 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/solana-kara-chiliz.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.
