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

# Base から Chiliz Chain へ bridge する

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

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

## 前提条件

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

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

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

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

### Base 上の `OFTAdapter` の準備

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

`OFTAdapter` contract は、既存のトークンのためのロックボックスとして機能します。ユーザーがトークンを Base から bridge して移動すると、この contract が元の ERC20 トークンをロックします。

contracts フォルダに `BaseTokenAdapter.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 BaseTokenAdapter is OFTAdapter {
    constructor(
        address _token,      // The address of your EXISTING token on Base
        address _lzEndpoint, // The LayerZero V2 Endpoint address on Base
        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 %}

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

Chiliz Chain で利用可能なすべての endpoint はこちらで確認できます。

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

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

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

contracts フォルダに `ChilizTokenOFT.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 ChilizTokenOFT is OFT {
    constructor(
        string memory _name,   // The name of the token (Should match your Base token)
        string memory _symbol, // The symbol of the token (Should match your Base token)
        address _lzEndpoint,   // The LayerZero V2 Endpoint address on Chiliz Chain
        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 %}

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

Chiliz Chain で利用可能なすべての endpoint はこちらで確認できます。

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

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

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

この設定ファイルは、クロスチェーンアーキテクチャの設計図として機能します。deploy した 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 baseContract: OmniPointHardhat = {
    eid: EndpointId.BASE_V2_MAINNET,
    contractName: 'BaseTokenAdapter',
};

const chilizContract: OmniPointHardhat = {
    eid: EndpointId.CHILIZ_V2_MAINNET,
    contractName: 'ChilizNativeOFT',
};

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

// Export the Generated Configuration
export default async function () {
    return {
        contracts: [
            { contract: baseContract },
            { contract: chilizContract },
        ],
        // The generator automatically creates the A->B and B->A pathways!
        connections: await generateConnectionsConfig([
            [
                baseContract,      // Source
                chilizContract,    // Destination
                [['LayerZero Labs'], []], // Default DVN Configuration
                [1, 1],                   // Block Confirmations
                [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Execution Options [To Chiliz, To Base]
            ],
        ]),
    };
}
```

`[EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS]` という配列は、Chiliz へメッセージを配信する際に 200,000 gas ユニットを、Base へメッセージを戻す際にも同じく 200,000 gas ユニットを enforce するよう LayerZero Executor に指示します。

## ステップ 3: Deploy ワークフロー

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

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

### Base Adapter の Deploy スクリプト

`deploy/` フォルダに `01_deploy_base_adapter.ts` という名前のファイルを作成します。このスクリプトは、既存のトークンアドレスと Base 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 Base
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // The Base Mainnet Endpoint V2 Address
    const BASE_ENDPOINT_V2 = "0x1a44076050125825900e736c501f859c50fE728c";

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

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

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

### Chiliz Chain OFT の Deploy スクリプト

`deploy/` フォルダに `02_deploy_chiliz_oft.ts` という名前の 2 つ目のファイルを作成します。このスクリプトは Chiliz Chain 上で新しい 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 Base token)
    const TOKEN_NAME = "My Token";
    const TOKEN_SYMBOL = "TKN";

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

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

    await deploy('BaseTokenOFT', {
        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 = ['BaseTokenOFT'];
```

### Deploy の実行

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

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

[rpc-setsuzoku.md](/jp/kaihatsu/kihon/chiliz-chain-setsuzoku/rpc-setsuzoku.md)

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

```bash
# 1. Deploy the Adapter to Base
npx hardhat deploy --network chiliz --tags BaseTokenAdapter

# 2. Deploy the Native OFT to Chiliz Chain
npx hardhat deploy --network base --tags ChilizTokenOFT
```

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

## ステップ 4: Wiring と Peering

この段階では、`BaseTokenAdapter` と `ChilizTokenOFT` の contract は各チェーン上に deploy されていますが、完全に分離されています。\
Chiliz Chain の contract がトークンを mint するよう指示するメッセージを受信した場合、そのメッセージが悪意のあるアクターではなく、本当に *あなたの* Base 上の Adapter から発信されたものであることを知る必要があります。

contract を peer として暗号学的に「wiring」することで、この信頼を確立する必要があります。

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

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

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

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

### Wire タスクの実行

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

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

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

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

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

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

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

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

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

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

```bash
npx hardhat lz:oft:send --oapp-config layerzero.config.ts --from-eid 30184 --to-eid 30409 --amount 10
```

{% endcode %}

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

1. 設定内で Base Mainnet（`30184`）と Chiliz Mainnet（`30409`）を検索します。
2. LayerZero Executor が必要とするクロスチェーン手数料を見積もります。
3. Base 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 の設定は非常に重要です。設定を怠ると、クロスチェーンメッセージが宛先ネットワークで失敗する可能性があるためです。

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

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

### **Options の設定**

このオプションは `layerzero.config.ts` ファイルで設定します。`connections` 配列を更新して、各パスウェイに `enforcedOptions` ブロックを含めます。

{% code overflow="wrap" %}

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

// ... (contract definitions as before)

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

{% endcode %}

パラメータの説明:

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

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

{% code overflow="wrap" %}

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

{% endcode %}

ツールは変更を自動的に検出し、Base と Chiliz の両方の contract に `setEnforcedOptions()` トランザクションを送信します。これにより、ユーザーが bridge をトリガーするたびに、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/base-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.
