# Bridge de Chiliz Chain vers Base

Pour relier un jeton existant de Chiliz Chain à Base, vous devez գրել et déployer deux contrats intelligents distincts : un OFT Adapter sur la chaîne où le jeton existe déjà (Chiliz Chain), et un Native OFT sur la chaîne de destination (Base).

{% hint style="info" %}
Notez que LayerZero fournissent [leur propre QuickStart pour les contrats OFT](https://docs.layerzero.network/v2/developers/evm/oft/quickstart), ainsi qu’un tutoriel pour apprendre à [frapper depuis Chiliz Chain vers une autre chaîne EVM](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart) comme Base. Ce tutoriel utilise Optimism comme chaîne cible, mais vous pouvez le remplacer par [les détails de Base](https://docs.layerzero.network/v2/deployments/chains/base).
{% endhint %}

## Prérequis

Ce guide nécessite ce qui suit :

* Une adresse de contrat de jeton ERC20 sur Chiliz Chain.
* Un portefeuille Web3 (comme MetaMask) configuré pour fonctionner à la fois avec Chiliz Chain et Base.
  * [Voir ici pour la configuration RPC de Chiliz Chain](/fr-ai/develop/basics/connect-to-chiliz-chain/connect-using-rpc.md).
  * [Voir ici pour la configuration RPC de Base Mainnet](https://docs.base.org/base-chain/quickstart/connecting-to-base).
* Assez de jetons de gaz sur chaque chaîne pour payer les déploiements des contrats ainsi que les frais de gaz pour l’envoi des messages.
  * Sur Chiliz Chain : des jetons CHZ.
  * Sur Base : des jetons ETH.

Nous allons utiliser [Hardhat](https://hardhat.org/) comme environnement de développement, ainsi que Node/npx.

## Étape 1 : développement du contrat

### Préparation de l’ `OFTAdapter` sur Chiliz Chain

{% hint style="warning" %}
Il s’agit d’une étape préparatoire, ne le déployez pas tout de suite !\
Vous le déploierez à l’étape 3.
{% endhint %}

Le `OFTAdapter` le contrat agit comme un coffre-fort pour votre jeton existant. Lorsque des utilisateurs transfèrent leurs jetons hors de Chiliz Chain, ce contrat verrouille les jetons ERC20 d’origine.

Créez un nouveau fichier nommé `ChilizTokenAdapter.sol` dans votre dossier contracts :

```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,      // L’adresse de votre jeton EXISTANT sur Chiliz Chain
        address _lzEndpoint, // L’adresse du endpoint LayerZero V2 sur Chiliz
        address _delegate    // L’adresse capable d’effectuer des modifications de configuration (généralement votre portefeuille)
    ) OFTAdapter(_token, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
Comme vous pouvez le voir, ce contrat étend le [contrat LayerZero OFT Adapter](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFTAdapter.sol), ainsi qu’un contrat standard `Ownable.sol` pour attribuer les clés d’administration. Vous avez besoin des deux afin que vous seul puissiez relier les chaînes en toute sécurité.
{% endhint %}

Lors du déploiement sur Chiliz Chain Mainnet, vous devez transmettre l’adresse du contrat de votre jeton existant comme `_token` et l’adresse du Chiliz Endpoint V2 (`0x6F475642a6e85809B1c36Fa62763669b1b48DD5B`) en tant que `_lzEndpoint`.

Voir ici tous les endpoints disponibles pour Chiliz Chain :

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

### Préparation de l’ `OFT` sur Base

Comme le jeton n’existe pas encore nativement sur Base, vous devez déployer un contrat OFT standard. Ce contrat a l’autorité de frapper de nouveaux jetons lorsqu’il reçoit un message valide de l’OFT Adapter déployé sur Chiliz, et de les brûler lorsque les utilisateurs effectuent le retour.

Créez un nouveau fichier nommé `BaseTokenOFT.sol` dans votre dossier contracts :

```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,   // Le nom du jeton (doit correspondre à votre jeton Chiliz)
        string memory _symbol, // Le symbole du jeton (doit correspondre à votre jeton Chiliz)
        address _lzEndpoint,   // L’adresse du endpoint LayerZero V2 sur Base
        address _delegate      // L’adresse capable d’effectuer des modifications de configuration
    ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {}
}
```

{% hint style="info" %}
Comme vous pouvez le voir, ce contrat étend le [contrat LayerZero OFT](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFT.sol) ainsi qu’un contrat standard `Ownable.sol` pour les mêmes raisons que celles citées ci-dessus.
{% endhint %}

Lors du déploiement sur Base, assurez-vous que le `_name` et le `_symbol` correspondent à votre jeton d’origine sur Chiliz Chain afin d’éviter de semer la confusion chez les utilisateurs. Passez l’adresse du Base Endpoint V2 (`0x1a44076050125825900e736c501f859c50fE728c`) comme `_lzEndpoint`.

Voir tous les endpoints disponibles pour Base ici :

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

## Étape 2 : configuration LayerZero

Une fois vos contrats prêts, vous devez indiquer à l’outillage LayerZero comment ils se connectent. Cela se fait à l’aide d’un `layerzero.config.ts` fichier situé à la racine de votre projet Hardhat.

Ce fichier de configuration agit comme le plan de votre architecture inter-chaînes. Il associe vos contrats intelligents déployés à leurs identifiants de endpoint LayerZero (EID) respectifs et définit les voies (connexions) entre eux.

Le [Générateur de configuration simple](https://docs.layerzero.network/v2/tools/simple-config) est la méthode recommandée pour générer la configuration de câblage, car il automatise le câblage bidirectionnel et applique en coulisses les configurations de sécurité recommandées.

Créez ou mettez à jour votre fichier `layerzero.config.ts` à la racine de votre projet Hardhat :

```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';

// Définir les contrats
const chilizContract: OmniPointHardhat = {
    eid: EndpointId.CHILIZ_V2_MAINNET,
    contractName: 'ChilizTokenAdapter',
};

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

// Définir les limites de gas EVM standard (options imposées)
const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
    {
        msgType: 1,  // Transfert OFT standard
        optionType: ExecutorOptionType.LZ_RECEIVE,
        gas: 200000, // Limite de gaz de base sûre pour frapper/déverrouiller
        value: 0,    
    },
];

// Exporter la configuration générée
export default async function () {
    return {
        contracts: [
            { contract: chilizContract },
            { contract: baseContract },
        ],
        connections: await generateConnectionsConfig([
            [
                chilizContract,  // Source
                baseContract,    // Destination
                [['LayerZero Labs'], []], // Configuration DVN par défaut
                [1, 1],                   // Confirmations de blocs
                [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Options d’exécution [vers Chiliz, vers Base]
            ],
        ]),
    };
}
```

## Étape 3 : flux de déploiement

Avec vos contrats écrits et votre `layerzero.config.ts` préparé, il est temps de déployer les contrats sur leurs réseaux respectifs. La boîte à outils LayerZero V2 s’appuie sur le plugin `hardhat-deploy` pour gérer les déploiements efficacement.

Vous devrez créer deux scripts de déploiement dans le `deploy/` répertoire : un pour le Chiliz Chain Mainnet et un pour le Base Mainnet.

### Le script de déploiement de l’Adapter Chiliz

Créez un fichier nommé `01_deploy_chiliz_adapter.ts` dans votre `deploy/` dossier. Ce script transmet l’adresse de votre jeton existant et l’adresse du Chiliz Endpoint V2 au constructeur.

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

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

    // L’adresse de votre jeton ERC-20 existant sur Chiliz
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // L’adresse de l’endpoint Mainnet V2 Chiliz
    const CHILIZ_ENDPOINT_V2 = "0x6F475642a6e85809B1c36Fa62763669b1b48DD5B";

    console.log("Déploiement de l’OFTAdapter sur Chiliz Mainnet...");

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

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

### Le script de déploiement de l’OFT Base

Créez un second fichier nommé `02_deploy_base_oft.ts` dans votre `deploy/` dossier. Ce script initialise le nouvel OFT natif sur Base.

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

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

    // Détails du jeton (doivent correspondre à votre jeton Chiliz)
    const TOKEN_NAME = "My Token";
    const TOKEN_SYMBOL = "TKN";

    // L’adresse Base Mainnet Endpoint V2 
    const BASE_ENDPOINT_V2 = "0x1a44076050125825900e736c501f859c50fE728c";

    console.log("Déploiement du Native OFT sur 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'];
```

### Exécution des déploiements

Assurez-vous que votre `hardhat.config.ts` a les URL RPC et les clés privées correctement configurées pour Chiliz Chain et Base.

{% content-ref url="/pages/3ac5a1d75a9bf8f85d711fe8048e5c87f03af7f5" %}
[Se connecter via RPC](/fr-ai/develop/basics/connect-to-chiliz-chain/connect-using-rpc.md)
{% endcontent-ref %}

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

Exécutez les commandes suivantes dans votre terminal pour déployer les contrats :

```bash
# 1. Déployer l’Adapter sur Chiliz Chain
npx hardhat deploy --network chiliz --tags ChilizTokenAdapter

# 2. Déployer l’OFT natif sur Base
npx hardhat deploy --network base --tags BaseTokenOFT
```

Une fois les déploiements terminés, Hardhat enregistrera les adresses des contrats dans un `deployments/` dossier. L’outillage LayerZero lira automatiquement ces adresses lorsque nous exécuterons la commande de liaison à l’étape suivante.

## Étape 4 : câblage et pairage

À ce stade, vos `ChilizTokenAdapter` et le `BaseTokenOFT` les contrats sont déployés sur chaque chaîne, mais ils sont complètement isolés.\
Si le contrat Base reçoit un message lui indiquant de frapper des jetons, il doit savoir que le message provient réellement de *votre* l’Adapter sur Chiliz, et non d’un acteur malveillant.

Vous devez établir cette confiance en « reliant » cryptographiquement les contrats entre eux en tant que pairs.

Cela se fait en exécutant la commande `wire` , qui générera et exécutera des transactions sur Chiliz et Base.

{% hint style="info" %}
**Que se passe-t-il en coulisses ?**

Une configuration complète de voie LayerZero V2 nécessite en réalité 6 transactions sur chaque chaîne :

* `setSendLibrary`: assigne la MessageLib LayerZero responsable de l’envoi des messages (par exemple, la configurer pour utiliser la bibliothèque d’envoi V2).
* `setReceiveLibrary`: assigne la MessageLib responsable de la réception des messages. (Inclut un `gracePeriod`, généralement défini sur `0`).
* `setConfig` (Send Library) : définit les Decentralized Verifier Networks (DVN) et les Executors spécifiques pour les messages sortants.
* `setConfig` (Receive Library) : définit les DVN spécifiques requis pour vérifier les messages entrants.
* `setEnforcedOptions`: définit les limites de gaz d’exécution requises. Lorsqu’un utilisateur envoie un message depuis Chiliz Chain, il paie le gaz de destination à l’avance. La définition d’options imposées garantit qu’il paie suffisamment de gaz pour que le LayerZero Executor traite avec succès la transaction sur Chiliz Chain.
* `setPeer`: associe un ID de endpoint de destination (EID) à une adresse de contrat de confiance. Vous devez indiquer au contrat de Chiliz Chain de faire confiance au contrat Base, et au contrat Base de faire confiance au contrat de Chiliz Chain.
  {% endhint %}

### Exécution de la tâche de câblage

Exécutez la commande suivante dans votre terminal :

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

La chaîne d’outils calculera automatiquement les paramètres requis, vous présentera un tableau des transactions qu’elle s’apprête à exécuter et les soumettra à Chiliz et Base à l’aide de votre portefeuille de déploiement.

Une fois les transactions confirmées sur les deux réseaux, votre passerelle de jetons est officiellement en ligne et entièrement configurée ! L’Adapter Chiliz est désormais autorisé à envoyer des commandes de frappe à Base, et Base est autorisé à renvoyer des commandes de déverrouillage à Chiliz.

## Étape 5 : fonctionnement et tests

Une fois vos contrats déployés et reliés de manière sécurisée, votre jeton est désormais omnichaîne. La dernière étape consiste à effectuer un transfert inter-chaînes de Chiliz Chain Mainnet vers Base Mainnet.

### 1) Exécution du transfert inter-chaînes

La boîte à outils LayerZero V2 fournit une tâche Hardhat intégrée pour tester les transferts OFT directement depuis votre terminal. Cette commande estimera les frais de gaz inter-chaînes, débitera votre portefeuille en $CHZ (le jeton de gaz natif de la chaîne source) et lancera le transfert.

{% hint style="info" %}
Comme le `ChilizTokenAdapter` a besoin d’une autorisation pour verrouiller vos Fan Tokens existants, une transaction ERC-20 `approve()` est requise.

Le CLI LayerZero détecte cela et gère automatiquement l’approbation avant d’envoyer le message.
{% endhint %}

Exécutez la commande suivante :

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

Ce que fait cette commande :

1. Recherche le Chiliz Mainnet (`30409`) et le Base Mainnet (`30184`) dans votre configuration.
2. Estime les frais inter-chaînes requis par l’Executor LayerZero.
3. Appelle la `send()` fonction sur votre Chiliz Adapter.
4. L’Adapter verrouille 10 jetons et émet un paquet vers le Endpoint LayerZero.

### 2) Suivi du paquet sur LayerZero Scan

Les transactions inter-chaînes sont asynchrones. Bien que votre transaction Chiliz se confirme en quelques secondes, le message doit encore être vérifié et exécuté sur Base.

Pour suivre ce parcours en temps réel, cliquez sur le lien LayerZero Scan qui apparaît dans la sortie du CLI.

En savoir plus sur cet outil ici :

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

## Configuration des limites de gas

Il est très important de définir des limites de gas, car l’omission de cette étape peut faire échouer vos messages inter-chaînes sur le réseau de destination.

Lorsqu’un utilisateur transfère un jeton de Chiliz Chain vers Base, il paie les frais de gaz pour *les deux* chaînes à l’avance dans une seule transaction sur Chiliz (en utilisant `$CHZ`). LayerZero utilise ensuite une partie de ces frais pour payer le gaz ETH réel nécessaire à l’exécution de la transaction de frappe sur Base.

Pour garantir que LayerZero dispose de suffisamment de gas pour traiter avec succès la `lzReceive` fonction sur la chaîne de destination, vous devez définir des options imposées. Si elles ne sont pas définies, la transaction peut être annulée sur la chaîne de destination en raison d’une erreur « Out of Gas ».

### **Configuration des options**

Cette option est configurée dans votre `layerzero.config.ts` fichier. Mettez à jour le `connections` tableau pour inclure le `enforcedOptions` bloc pour chaque voie :

{% code overflow="wrap" %}

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

// ... (définitions de contrats comme précédemment)

connections: [
    {
        from: 'ChilizTokenAdapter',
        to: 'BaseTokenOFT',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,        // 1 = Transfert OFT standard (SEND)
                    optionType: 1,     // 1 = option lzReceive
                    gas: 200000,       // Limite de gaz estimée pour frapper sur Base
                },
                {
                    msgType: 2,        // 2 = Transfert OFT avec charge utile (SEND_AND_CALL)
                    optionType: 1,
                    gas: 250000,       // Limite de gas légèrement plus élevée pour les appels complexes
                }
            ]
        },
    },
    {
        from: 'BaseTokenOFT',
        to: 'ChilizTokenAdapter',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,
                    optionType: 1,
                    gas: 200000,       // Limite de gaz estimée pour déverrouiller sur Chiliz
                }
            ]
        },
    },
],
// ...
```

{% endcode %}

Explication des paramètres :

* `msgType: 1`: Représente un transfert de jeton standard. `msgType: 2` est utilisé pour les appels « composés » (par exemple, transférer un jeton et le staker immédiatement en un seul clic).
* `optionType: 1`: demande à l’Executor d’exécuter simplement la `lzReceive` fonction.
* `gas: 200000`: Une limite de gas de base sûre pour les frappes et déverrouillages OFT standards. Vous pouvez l’ajuster en fonction de la consommation réelle de gas de vos contrats déployés.

Si vous avez défini cette option après avoir déjà relié les chaînes, vous pouvez relier à nouveau avec les options désormais en place en utilisant la même commande :

{% code overflow="wrap" %}

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

{% endcode %}

L’outillage détectera automatiquement les changements et soumettra une `setEnforcedOptions()` transaction vers vos contrats sur Chiliz et Base. Désormais, chaque fois qu’un utilisateur déclenche un pont, les contrats exigeront que l’utilisateur paie au moins 200 000 unités de gaz sur la chaîne de destination, garantissant une livraison fiable.


---

# Agent Instructions: 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/fr-ai/develop/advanced/use-omnichain-tokens/bridging-from-chiliz-chain-to-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.
