# Bridge de Base vers Chiliz Chain

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

{% 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 de Base vers une autre chaîne EVM](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart) comme Chiliz Chain. Ce tutoriel utilise Optimism comme chaîne cible, mais vous pouvez le remplacer par [les détails de Chiliz Chain](https://docs.layerzero.network/v2/deployments/evm-chains/chiliz-mainnet-oft-quickstart).
{% endhint %}

## Prérequis

Ce guide nécessite ce qui suit :

* Une adresse de contrat de jeton ERC20 sur Base.
* Un portefeuille Web3 (comme MetaMask) configuré pour fonctionner à la fois avec Base et Chiliz Chain.
  * [Voir ici pour la configuration RPC de Base Mainnet](https://docs.base.org/base-chain/quickstart/connecting-to-base).
  * [Voir ici pour la configuration RPC de Chiliz Chain](/fr-ai/develop/basics/connect-to-chiliz-chain/connect-using-rpc.md).
* 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 Base : des jetons ETH.
  * Sur Chiliz Chain : des jetons CHZ.

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 Base

{% 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 les utilisateurs transfèrent leurs jetons depuis Base, ce contrat verrouille les jetons ERC20 d’origine.

Créez un nouveau fichier nommé `BaseTokenAdapter.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 BaseTokenAdapter is OFTAdapter {
    constructor(
        address _token,      // L’adresse de votre jeton EXISTANT sur Base
        address _lzEndpoint, // L’adresse du LayerZero V2 Endpoint sur Base
        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 Base Mainnet, vous devez passer l’adresse du contrat de votre jeton existant en tant que `_token` et l’adresse Base Endpoint V2 (`0x1a44076050125825900e736c501f859c50fE728c`) en tant que `_lzEndpoint`.

Voir ici tous les endpoints disponibles pour Chiliz Chain :

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

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

Comme le jeton n’existe pas encore nativement sur Chiliz Chain, 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 du OFT Adapter déployé sur Base, et de les brûler lorsque les utilisateurs effectuent le retour du bridge.

Créez un nouveau fichier nommé `ChilizTokenOFT.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 ChilizTokenOFT is OFT {
    constructor(
        string memory _name,   // Le nom du jeton (doit correspondre à votre jeton Base)
        string memory _symbol, // Le symbole du jeton (doit correspondre à votre jeton Base)
        address _lzEndpoint,   // L’adresse du LayerZero V2 Endpoint sur Chiliz Chain
        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 Chiliz Chain, assurez-vous que les `_name` et le `_symbol` correspondent à votre jeton d’origine sur Base afin d’éviter toute confusion chez les utilisateurs. Passez l’adresse Chiliz Chain Endpoint V2 (`0x6F475642a6e85809B1c36Fa62763669b1b48DD5B`) comme `_lzEndpoint`.

Voir ici tous les endpoints disponibles pour Chiliz Chain :

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

## É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 baseContract: OmniPointHardhat = {
    eid: EndpointId.BASE_V2_MAINNET,
    contractName: 'BaseTokenAdapter',
};

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

// 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 gas d’exécution
        value: 0,    // Native drop (0 pour les transferts standards)
    },
];

// Exporter la configuration générée
export default async function () {
    return {
        contracts: [
            { contract: baseContract },
            { contract: chilizContract },
        ],
        // Le générateur crée automatiquement les voies A->B et B->A !
        connections: await generateConnectionsConfig([
            [
                baseContract,      // Source
                chilizContract,    // Destination
                [['LayerZero Labs'], []], // Configuration DVN par défaut
                [1, 1],                   // Confirmations de bloc
                [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Options d’exécution [vers Chiliz, vers Base]
            ],
        ]),
    };
}
```

Le tableau `[EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS]` indique à l’Executor LayerZero d’imposer 200 000 unités de gas lors de la livraison du message vers Chiliz, et identiquement 200 000 unités de gas lors du retour du message 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 de votre projet : un pour Base Mainnet et un pour Chiliz Chain Mainnet.

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

Créez un fichier nommé `01_deploy_base_adapter.ts` dans votre `deploy/` dossier. Ce script transmet l’adresse de votre jeton existant et l’adresse Base 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 Base
    const TOKEN_ADDRESS = "0xYourTokenAddressHere"; 
    
    // L’adresse Base Mainnet Endpoint V2
    const BASE_ENDPOINT_V2 = "0x1a44076050125825900e736c501f859c50fE728c";

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

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

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

### Le script de déploiement OFT de Chiliz Chain

Créez un second fichier nommé `02_deploy_chiliz_oft.ts` dans votre `deploy/` dossier. Ce script initialise le nouveau Native OFT sur Chiliz Chain.

```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 Base)
    const TOKEN_NAME = "My Token";
    const TOKEN_SYMBOL = "TKN";

    // L’adresse Chiliz Chain Mainnet Endpoint V2 
    const CHILIZ_ENDPOINT_V2 = "0x6F475642a6e85809B1c36Fa62763669b1b48DD5B";

    console.log("Déploiement du Native OFT sur Base Mainnet...");

    await deploy('BaseTokenOFT', {
        from: deployer,
        args: [
            TOKEN_NAME,           // _name
            TOKEN_SYMBOL,         // _symbol
            CHILIZ_ENDPOINT_V2,   // _lzEndpoint
            deployer              // _delegate (propriétaire)
        ],
        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 Base et Chiliz Chain.

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

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

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

```bash
# 1. Déployer l’Adapter sur Base
npx hardhat deploy --network chiliz --tags BaseTokenAdapter

# 2. Déployer le Native OFT sur Chiliz Chain
npx hardhat deploy --network base --tags ChilizTokenOFT
```

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 `BaseTokenAdapter` et le `ChilizTokenOFT` contrats sont déployés sur chaque chaîne, mais ils sont complètement isolés.\
Si le contrat Chiliz Chain reçoit un message lui ordonnant de frapper des jetons, il doit savoir que le message provient bien de *votre* Adapter sur Base, 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 gas d’exécution requises. Lorsqu’un utilisateur envoie un message depuis Base, il paie à l’avance le gas de la destination. La définition d’options imposées garantit qu’il paie suffisamment de gas pour que l’Executor LayerZero puisse traiter avec succès la transaction sur Chiliz Chain.
* `setPeer`: associe un EID de destination à une adresse de contrat de confiance. Vous devez indiquer au contrat Base de faire confiance au contrat Chiliz Chain, et au contrat Chiliz Chain de faire confiance au contrat Base.
  {% 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 bridge de jeton est officiellement en service et entièrement configuré ! L’Adapter Base est désormais autorisé à envoyer des commandes de frappe à Chiliz Chain, et Chiliz Chain est autorisé à envoyer des commandes de déverrouillage vers Base.

## Étape 5 : fonctionnement et tests

Avec 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 à exécuter un transfert inter-chaînes de Base Mainnet vers Chiliz Chain 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 gas inter-chaînes, débitera votre portefeuille en $ETH (le jeton de gas natif sur la chaîne source, Base) et initiera le transfert.

Exécutez la commande suivante :

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

Ce que fait cette commande :

1. Recherche Base Mainnet (`30184`) et Chiliz Mainnet (`30409`) dans votre configuration.
2. Estime les frais inter-chaînes requis par l’Executor LayerZero.
3. Appelle la `send()` fonction sur votre Adapter Base.
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 Base vers Chiliz Chain, il paie les frais de gas pour *les deux* chaînes à l’avance dans une seule transaction sur Base (en utilisant `$ETH`). LayerZero utilise ensuite une partie de ces frais pour payer le gas ETH réel nécessaire à l’exécution de la transaction de frappe sur Chiliz Chain.

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: 'BaseTokenAdapter',
        to: 'ChilizTokenOFT',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,        // 1 = Transfert OFT standard (SEND)
                    optionType: 1,     // 1 = option lzReceive
                    gas: 200000,       // Limite de gas estimée pour frapper sur Chiliz Chain
                },
                {
                    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: 'ChilizTokenOFT',
        to: 'BaseTokenAdapter',
        config: {
            enforcedOptions: [
                {
                    msgType: 1,
                    optionType: 1,
                    gas: 200000,       // Limite de gas estimée pour déverrouiller sur Base
                }
            ]
        },
    },
],
// ...
```

{% 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 à vos contrats sur Base et Chiliz. Désormais, chaque fois qu’un utilisateur déclenche un bridge, les contrats exigeront que l’utilisateur paie au moins 200 000 unités de gas 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-base-to-chiliz-chain.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.
