> 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-base.md).

# Chiliz Chain から Base へ bridge する

既存のトークンを Chiliz Chain から Base へブリッジするには、2 つの個別の smart contract を作成して deploy する必要があります。トークンがすでに存在するチェーン（Chiliz Chain）上の OFT Adapter と、宛先チェーン（Base）上の Native OFT です。

{% hint style="info" %}
LayerZero は [OFT contract 用の独自の QuickStart](https://docs.layerzero.network/v2/developers/evm/oft/quickstart) のほか、[Chiliz Chain から別の EVM チェーンへ mint する方法](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart) を学べるチュートリアルを提供しています（Base などへの mint）。そのチュートリアルでは Optimism をターゲットチェーンとして使用していますが、[Base の詳細](https://docs.layerzero.network/v2/deployments/chains/base) に置き換えることができます。
{% endhint %}

## 前提条件

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

* Chiliz Chain 上の ERC20 トークン contract アドレス。
* Chiliz Chain と Base の両方で動作するように設定された Web3 ウォレット（MetaMask など）。
  * [Chiliz Chain の RPC 設定についてはこちらを参照してください](/jp/kaihatsu/kihon/chiliz-chain-setsuzoku/rpc-setsuzoku.md)。
  * [Base Mainnet の RPC 設定についてはこちらを参照してください](https://docs.base.org/base-chain/quickstart/connecting-to-base)。
* contract のデプロイ、およびメッセージ送信の gas 手数料を支払うのに十分な gas トークンを各チェーンに用意すること。
  * Chiliz Chain では CHZ トークン。
  * Base では ETH トークン。

dev 環境としては [Hardhat](https://hardhat.org/) と Node/npx を使用します。

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

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

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

`OFTAdapter` contract は、既存のトークンのロックボックスとして機能します。ユーザーがトークンを Chiliz Chain からブリッジで送り出す際、この contract は元の ERC20 トークンをロックします。

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 ChilizTokenAdapter is OFTAdapter {
    constructor(
        address _token,      // The address of your EXISTING Token on Chiliz Chain
        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 %}

これを Chiliz Chain Mainnet に deploy する際は、既存トークンの contract アドレスを `_token` として、Chiliz Endpoint V2 アドレス（`0x6F475642a6e85809B1c36Fa62763669b1b48DD5B`）を `_lzEndpoint` として渡す必要があります。

Chiliz Chain で利用可能なすべての endpoint はこちらを参照してください。

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

### Base 上の `OFT` の準備

トークンはまだ Base 上にネイティブには存在しないため、標準的な OFT contract を deploy する必要があります。この contract は、Chiliz にデプロイされた OFT Adapter から有効なメッセージを受け取ったときに新しいトークンを mint し、ユーザーが戻すブリッジを行ったときにそれらを burn する権限を持ちます。

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

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

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,   // The name of the token (Should match your Chiliz Token)
        string memory _symbol, // The symbol of the token (Should match your Chiliz Token)
        address _lzEndpoint,   // The LayerZero V2 Endpoint address on Base
        address _delegate      // The address capable of making configuration changes
    ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
ご覧のとおり、この contract は [LayerZero OFT contract](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFT.sol) を継承しており、上記と同じ理由で標準的な `Ownable.sol` contract も継承しています。
{% endhint %}

これを Base に deploy する際は、ユーザーの混乱を避けるため、`_name` と `_symbol` が Chiliz Chain 上の元のトークンと一致するようにしてください。Base Endpoint V2 アドレス（`0x1a44076050125825900e736c501f859c50fE728c`）を `_lzEndpoint` として渡します。

Base で利用可能なすべての endpoint はこちらを参照してください。

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

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

contract の準備ができたら、それらがどのように接続されるかを LayerZero のツールに伝える必要があります。これは Hardhat プロジェクトのルートに配置する `layerzero.config.ts` ファイルを使用して行います。

この設定ファイルは、クロスチェーンアーキテクチャの設計図として機能します。デプロイした smart contract を、それぞれの LayerZero Endpoint ID（EID）にマッピングし、それらの間の経路（接続）を定義します。

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

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

```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: 'ChilizTokenAdapter',
};

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

// Define standard EVM Gas Limits (Enforced Options)
const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1,  // Standard OFT Transfer
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000, // Safe baseline gas limit for minting/unlocking
        value: 0,    
    },
];

// Export the Generated Configuration
export default async function () {
    return {
        contracts: [
            { contract: chilizContract },
            { contract: baseContract },
        ],
        connections: await generateConnectionsConfig([
            [
                chilizContract,  // Source
                baseContract,    // Destination
                [['LayerZero Labs'], []], // Default DVN Configuration
                [1, 1],                   // Block confirmations
                [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Execution Options [To Chiliz, To Base]
            ],
        ]),
    };
}
```

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

contract を作成し、`layerzero.config.ts` を準備したら、いよいよ contract をそれぞれのネットワークに deploy します。LayerZero V2 ツールボックスは、デプロイを効率的に管理するために `hardhat-deploy` プラグインに依存しています。

プロジェクトの `deploy/` ディレクトリに 2 つのデプロイスクリプトを作成する必要があります。1 つは Chiliz Chain Mainnet 用、もう 1 つは Base Mainnet 用です。

### Chiliz Adapter のデプロイスクリプト

`deploy/` フォルダーに `01_deploy_chiliz_adapter.ts` という名前のファイルを作成します。このスクリプトは、既存のトークンアドレスと Chiliz Endpoint V2 アドレスを constructor に渡します。

```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
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // The Chiliz Mainnet Endpoint V2 Address
    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 (Owner)
        ],
        log: true,
        waitConfirmations: 2,
    });
};

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

### Base OFT のデプロイスクリプト

`deploy/` フォルダーに `02_deploy_base_oft.ts` という名前の 2 つ目のファイルを作成します。このスクリプトは、Base 上に新しい Native OFT を初期化します。

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

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

    // Token Details (Must match your Chiliz Token)
    const TOKEN_NAME = "My Token";
    const TOKEN_SYMBOL = "TKN";

    // The Base Mainnet Endpoint V2 Address 
    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 (Owner)
        ],
        log: true,
        waitConfirmations: 2,
    });
};

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

### デプロイの実行

`hardhat.config.ts` に、Chiliz Chain と Base の両方の RPC URL と秘密鍵が適切に設定されていることを確認してください。

rpc-setsuzoku.md

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

ターミナルで以下のコマンドを実行して contract を deploy します。

```bash
# 1. Deploy the Adapter to Chiliz Chain
npx hardhat deploy --network chiliz --tags ChilizTokenAdapter

# 2. Deploy the Native OFT to Base
npx hardhat deploy --network base --tags BaseTokenOFT
```

デプロイが完了すると、Hardhat は contract アドレスを `deployments/` フォルダーに保存します。次のステップで wiring コマンドを実行する際、LayerZero のツールがこれらのアドレスを自動的に読み込みます。

## ステップ 4: Wiring と Peering

この段階では、`ChilizTokenAdapter` と `BaseTokenOFT` の contract は各チェーンにデプロイされていますが、完全に分離されています。\
Base の contract がトークンを mint するよう指示するメッセージを受け取った場合、そのメッセージが悪意のある第三者ではなく、Chiliz 上の\_あなたの\_Adapter から確かに発信されたものであることを知る必要があります。

contract を peer として暗号学的に「wire（接続）」することで、この信頼関係を確立しなければなりません。

これは `wire` コマンドを実行することで行われ、Chiliz と Base の両方でトランザクションを生成して実行します。

{% hint style="info" %}
**内部では何が起きているのか？**

完全な LayerZero V2 経路設定には、実際には各チェーンで 6 つのトランザクションが必要です。

* `setSendLibrary`: メッセージの送信を担当する LayerZero MessageLib を割り当てます（例: V2 Send Library を使用するよう設定）。
* `setReceiveLibrary`: メッセージの受信を担当する MessageLib を割り当てます。（通常 `0` に設定される `gracePeriod` を含みます）。
* `setConfig`（Send Library）: 送信メッセージ用の特定の Decentralized Verifier Networks（DVN）と Executor を設定します。
* `setConfig`（Receive Library）: 受信メッセージの検証に必要な特定の DVN を設定します。
* `setEnforcedOptions`: 必要な実行 gas limit を設定します。ユーザーが Chiliz Chain からメッセージを送信する際、宛先の gas を前払いします。enforced options を設定することで、LayerZero Executor が Chiliz Chain 上でトランザクションを正常に処理するのに十分な gas を支払うことが保証されます。
* `setPeer`: 宛先の Endpoint ID（EID）を信頼できる contract アドレスにリンクします。Chiliz Chain の contract に Base の contract を信頼するよう、Base の contract に Chiliz Chain の contract を信頼するよう伝える必要があります。
  {% endhint %}

### Wire タスクの実行

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

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

ツールチェーンは必要なパラメーターを自動的に計算し、実行しようとしているトランザクションの表を提示し、deployer ウォレットを使用してそれらを Chiliz と Base に送信します。

両方のネットワークでトランザクションが確認されると、トークンブリッジは正式に稼働し、完全に設定されます！ これで Chiliz Adapter は Base に mint コマンドを送信する権限を持ち、Base は Chiliz に unlock コマンドを送り返す権限を持つようになります。

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

contract がデプロイされ、安全に wire で接続されたことで、トークンは omnichain になりました。最後のステップは、Chiliz Chain Mainnet から Base Mainnet へのクロスチェーン転送を実行することです。

### 1) クロスチェーン転送の実行

LayerZero V2 ツールボックスは、ターミナルから直接 OFT 転送をテストできる組み込みの Hardhat タスクを提供しています。このコマンドは、クロスチェーンの gas 手数料を見積もり、$CHZ（ソースチェーンのネイティブ gas トークン）でウォレットに課金し、転送を開始します。

{% hint style="info" %}
`ChilizTokenAdapter` は既存の Fan Tokens をロックするための権限を必要とするため、ERC-20 の `approve()` トランザクションが必要です。

LayerZero CLI はこれを検出し、メッセージを送信する前に approval を自動的に処理します。
{% endhint %}

以下のコマンドを実行します。

{% 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 %}

このコマンドが行うこと:

1. 設定内で Chiliz Mainnet（`30409`）と Base Mainnet（`30184`）を検索します。
2. LayerZero Executor が必要とするクロスチェーン手数料を見積もります。
3. Chiliz Adapter の `send()` 関数を呼び出します。
4. Adapter は 10 トークンをロックし、パケットを LayerZero Endpoint に送出します。

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

クロスチェーントランザクションは非同期です。Chiliz のトランザクションは数秒で確認されますが、メッセージはまだ Base 上で検証および実行される必要があります。

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

このツールについて詳しくはこちらをご覧ください。

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

## Gas Limit の設定

gas limit を設定することは非常に重要です。設定を怠ると、クロスチェーンメッセージが宛先ネットワークで失敗する可能性があります。

ユーザーがトークンを Chiliz Chain から Base へブリッジする際、\_両方の\_チェーンの gas 手数料を、Chiliz 上の単一のトランザクションで（`$CHZ` を使用して）前払いします。LayerZero はその手数料の一部を使用して、Base 上で mint トランザクションを実行するために実際に必要な ETH の gas を支払います。

LayerZero が宛先チェーンで `lzReceive` 関数を正常に処理するのに十分な gas を確保するには、Enforced Options を設定する必要があります。これらが設定されていない場合、宛先チェーンで「Out of Gas」エラーによりトランザクションが revert する可能性があります。

### **Options の設定**

このオプションは `layerzero.config.ts` ファイルで設定します。各経路の `enforcedOptions` ブロックを含めるように `connections` 配列を更新します。

{% code overflow="wrap" %}

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

// ... (contract definitions as before)

connections: [
    {
        from: 'ChilizTokenAdapter',
        to: 'BaseTokenOFT',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,        // 1 = Standard OFT Transfer (SEND)
                    optionType: 1,     // 1 = lzReceive Option
                    gas: 200000,       // Estimated gas limit to mint on Base
                },
                {
                    msgType: 2,        // 2 = OFT Transfer with payload (SEND_AND_CALL)
                    optionType: 1,
                    gas: 250000,       // Slightly higher gas limit for complex calls
                }
            ]
        },
    },
    {
        from: 'BaseTokenOFT',
        to: 'ChilizTokenAdapter',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,
                    optionType: 1,
                    gas: 200000,       // Estimated gas limit to unlock on Chiliz
                }
            ]
        },
    },
],
// ...
```

{% endcode %}

パラメーターの説明:

* `msgType: 1`: 標準的なトークン転送を表します。`msgType: 2` は「composed」呼び出し（例: トークンをブリッジし、ワンクリックで即座に staking する）に使用されます。
* `optionType: 1`: Executor に対して単に `lzReceive` 関数を実行するよう指示します。
* `gas: 200000`: 標準的な OFT の mint と unlock に対する安全な基準 gas limit です。デプロイした contract の具体的な gas 消費量に基づいて調整できます。

すでにチェーンを wire した後にこのオプションを設定した場合は、同じコマンドを使用して、オプションが反映された状態で再度 wire できます。

{% code overflow="wrap" %}

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

{% endcode %}

ツールは変更を自動的に検出し、Chiliz と Base の両方の contract に `setEnforcedOptions()` トランザクションを送信します。これにより、ユーザーがブリッジをトリガーするたびに、contract は宛先チェーンで少なくとも 200,000 gas ユニットを支払うことをユーザーに義務付け、信頼性の高い配信を保証します。


---

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