> ## Documentation Index
> Fetch the complete documentation index at: https://docs.powfi.alephium.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Staking avec parrainage et commission partenaire

> Attribuer des stakes à votre adresse partenaire avec stakeAlphWithReferral, et comment la commission partenaire est calculée et versée.

export const VersionBanner = ({network = 'mainnet', products = [], lang = 'en'}) => {
  const SDK_VERSION = '1.0.2';
  const ADDRESSES = {
    mainnet: {
      cpmm: {
        Router: 'ze15rnAwTyVCPnDhN7J8An3SvNeWBsZHAVMeBx1ehXeP',
        TokenPairFactory: '24CXRLvj1QiDH6riwr1EPERG7BcduHKZtktygbq97MfYb'
      },
      clmm: {
        PoolFactory: '24gqd4DMQXVzjm5QDAGxUtYupx3WM2PSu3vZUseuBCV9h',
        PositionManager: 'vFyKSqnJHS9MicrojBcLgztyRFqhS4hB349Ci3LJCELw'
      },
      staking: {
        XAlphToken: '225WevmFp5ZgzPsyVJTvyp2v2uyKrvp329HfrVmzffnWj',
        RewardFeeCollector: '22CE7vG6u64zjjsLZLxeJqQuPDydjPvbP9iG1d861j2G7'
      }
    },
    testnet: {
      cpmm: {
        Router: 'xaueT8kPMvpnaFJEfHv6CJLgqsSPpoNmHjF1QgTxoF9R',
        TokenPairFactory: '29hdd9b9Gp7oXuamwHKfUqBaRXP487HoeTcutS3RhZJEj'
      },
      clmm: {
        PoolFactory: 'z2QFT7qBQrfm8UwAYG3VHWoHs7B56ZDFNdSCcDu5j53m',
        PositionManager: '21p6egW8d6FEyVVuH17WqvHCARsCsD61GcBmeCr75XdGT'
      },
      staking: {
        XAlphToken: '23psDicimC5VdpM56wrgqgCzQzcyXWGCkQGSYWbtZAPRq',
        RewardFeeCollector: '29qQ1LPJ5uqawRviXLVDMeo19JUygRrNNTQy5RUBh817D'
      }
    }
  };
  const EXPLORERS = {
    mainnet: 'https://explorer.alephium.org/addresses/',
    testnet: 'https://testnet.alephium.org/addresses/'
  };
  const LABELS = {
    en: {
      sdk: 'SDK',
      network: 'Network',
      contracts: 'Contracts',
      all: 'All addresses',
      allNetworks: 'mainnet · testnet · devnet',
      devnet: 'Local deployment (addresses vary per devnet)'
    },
    zh: {
      sdk: 'SDK 版本',
      network: '网络',
      contracts: '合约',
      all: '全部地址',
      allNetworks: 'mainnet · testnet · devnet',
      devnet: '本地部署（每个 devnet 的地址不同）'
    },
    fr: {
      sdk: 'SDK',
      network: 'Réseau',
      contracts: 'Contrats',
      all: 'Toutes les adresses',
      allNetworks: 'mainnet · testnet · devnet',
      devnet: 'Déploiement local (adresses propres à chaque devnet)'
    }
  };
  const t = LABELS[lang] ?? LABELS.en;
  const contractsPage = lang === 'en' ? '/reference/contracts' : `/${lang}/reference/contracts`;
  const short = a => `${a.slice(0, 6)}…${a.slice(-4)}`;
  const entries = [];
  const addrs = ADDRESSES[network];
  if (addrs) {
    for (const p of products) {
      for (const [name, address] of Object.entries(addrs[p] ?? ({}))) entries.push({
        name,
        address
      });
    }
  }
  let contractsCell;
  if (network === 'devnet' && products.length > 0) {
    contractsCell = <span>{t.devnet}</span>;
  } else if (entries.length > 0) {
    contractsCell = entries.map(({name, address}, i) => <span key={name}>
        {i > 0 && <span className="mx-1 opacity-50">·</span>}
        {name}{' '}
        <a href={EXPLORERS[network] + address} target="_blank" rel="noreferrer" title={address}>
          <code>{short(address)}</code>
        </a>
      </span>);
  }
  const row = (label, value) => <div className="flex flex-wrap gap-x-2">
      <span className="font-semibold min-w-[5.5rem]">{label}</span>
      <span className="flex-1 min-w-0 break-words">{value}</span>
    </div>;
  return <div className="not-prose mb-6 rounded-xl border border-zinc-950/10 dark:border-white/10 bg-zinc-50 dark:bg-white/5 px-4 py-3 text-sm leading-6 text-zinc-700 dark:text-zinc-300">
      {row(t.sdk, <code>@alephium/powfi-sdk@{SDK_VERSION}</code>)}
      {row(t.network, network === 'all' ? t.allNetworks : network)}
      {contractsCell && row(t.contracts, <span>
            {contractsCell}
            <span className="mx-1 opacity-50">·</span>
            <a href={contractsPage}>{t.all} →</a>
          </span>)}
    </div>;
};

<VersionBanner network="mainnet" products={['staking']} lang="fr" />

Les partenaires peuvent amener des stakers sur Powfi et toucher une part du rendement que ces stakers perçoivent. L'attribution se fait on-chain via l'argument `referral` du stake. La commission est calculée hors chaîne et versée par l'équipe Powfi.

<Warning>
  **Contactez l'équipe Powfi avant d'utiliser une adresse de parrainage.** Le contrat accepte n'importe quelle adresse comme `referral`, mais la commission n'est versée qu'aux partenaires ayant un accord avec l'équipe. Cet accord fixe votre adresse partenaire, votre taux de commission, la période de règlement et le mode de paiement. Les stakes marqués avec une adresse que l'équipe ne connaît pas peuvent ne pas donner droit à une commission.
</Warning>

## Fonctionnement

<Steps>
  <Step title="Enregistrer votre adresse partenaire auprès de l'équipe">
    Convenez de l'adresse partenaire que vous utiliserez, de votre taux de commission (y %) et du calendrier de règlement.
  </Step>

  <Step title="Staker avec votre adresse comme referral">
    Votre frontend ou votre intégration appelle `stakeAlphWithReferral` avec votre adresse partenaire. Utilisez la même adresse pour chaque stake.
  </Step>

  <Step title="Le rendement revient à vos stakers">
    Le taux de change du xALPH augmente à mesure que les récompenses du protocole sont distribuées. Vos stakers perçoivent ce rendement comme tout détenteur de xALPH.
  </Step>

  <Step title="Règlement et paiement">
    À chaque période, l'équipe calcule le rendement généré par le xALPH qui vous est attribué et vous en verse y % en ALPH.
  </Step>
</Steps>

## Staker avec un parrainage

```ts theme={null}
import { Powfi } from '@alephium/powfi-sdk'
import { ONE_ALPH } from '@alephium/web3'

const powfi = Powfi.load({ networkId: 'mainnet', signer }) // the staker's wallet
const PARTNER_ADDRESS = '<your registered partner address>'

const result = await powfi.staking.stakeAlphWithReferral(100n * ONE_ALPH, PARTNER_ADDRESS)
console.log(result.txId)
```

Le staker ne paie rien de plus pour le parrainage. La transaction est identique à `stakeAlph` (elle joint `amount + MINIMAL_CONTRACT_DEPOSIT` d'ALPH) et le staker reçoit la même quantité de xALPH.

<Note>
  Le frontend officiel de Powfi n'accepte pas encore de paramètre de parrainage. Pour vous attribuer des stakes, créez votre propre page de staking ou intégration qui appelle `stakeAlphWithReferral`.
</Note>

### Ce que le contrat fait de `referral`

* **Aucune validation, aucun enregistrement on-chain.** `XAlphToken.stake(amount, referral)` accepte n'importe quelle adresse et se contente de l'enregistrer dans l'événement `Staked`.
* **L'adresse de parrainage ne reçoit aucun jeton.** Comme rien ne lui est transféré, elle n'apparaît pas dans la vue de transaction de l'explorateur. Elle n'est visible que dans l'événement.
* **Le stake doit provenir d'un wallet.** `stake` exige que l'appelant soit une adresse d'actifs (wallet) : un contrat ne peut donc pas staker au nom d'un utilisateur.
* L'événement est `Staked(to, referral, alphAmount, xAlphAmount)` : staker, parrain, ALPH déposé, xALPH minté.

## Vérifier l'attribution

N'importe qui peut vérifier à quel parrain un stake a été attribué en lisant les événements de la transaction depuis un nœud :

```ts theme={null}
const xAlphAddress = powfi.staking.getConfig().xAlphTokenAddress
const { events } = await powfi.nodeProvider.events.getEventsTxIdTxid(txId)

// Staked is the first event declared by XAlphToken (eventIndex 0)
const staked = events.find((e) => e.contractAddress === xAlphAddress && e.eventIndex === 0)
const [to, referral, alphAmount, xAlphAmount] = staked!.fields.map((f) => f.value)
```

Les adresses sans groupe peuvent apparaître avec un suffixe `:<group>` dans l'événement. Il s'agit de la même adresse.

## Calcul de la commission

Pour chaque période de règlement :

1. **xALPH attribué** : somme des `xAlphAmount` de tous les événements `Staked` dont le `referral` est votre adresse.
2. **Hausse du taux** : `yieldRateDelta = taux(fin de période) − taux(fin de la période précédente)`, avec `taux = totalDepositedAlph / totalXAlphSupply` (voir [Staking](/fr/modules/staking)).
3. **Rendement brut** : `xALPH attribué × yieldRateDelta`, en ALPH.
4. **Votre commission** : `rendement brut × y %`.

Ce qui influe sur les montants :

* **Seul le xALPH minté au moment du stake compte.** Les transferts et unstakes ultérieurs de xALPH ne sont pas suivis.
* **Staker ne fait pas bouger le taux.** Les nouveaux stakes mintent du xALPH au taux courant. Le taux n'augmente que lorsque des récompenses sont déposées.
* **Le rendement dépend des revenus du protocole.** Le taux augmente quand `RewardFeeCollector.distributeRewards()` s'exécute. Il distribue `totalDepositedAlph × rewardRate × temps écoulé / 1 an` (un taux annuel), plafonné par l'ALPH que le collecteur détient grâce aux frais de trading. Les parts de la trésorerie et du burn sont prélevées d'abord, et le reste fait monter le taux du xALPH. Si le volume de trading est faible, le rendement à partager l'est aussi.

## Paiement

La commission est un montant dû calculé hors chaîne, pas un transfert on-chain déclenché par le stake. L'équipe la verse en ALPH depuis la trésorerie, selon votre accord. Comme toutes les données d'entrée (les événements `Staked` et le taux du xALPH) sont publiques on-chain, vous pouvez recalculer votre commission de façon indépendante. Demandez à l'équipe la page de vérification qui liste vos règlements.

## Commission de parrainage et frais d'intégrateur

Ce sont deux mécanismes distincts :

| | Commission de parrainage (cette page) | [Frais d'intégrateur](/fr/guides/integrator-fees) |
| - | - | - |
| S'applique à | Staking (`stakeAlphWithReferral`) | Swaps (`cpmm.swap`, `clmm.swap`) |
| Qui paie | Powfi, sur le rendement du protocole | L'utilisateur, en plus du swap |
| Calcul | Hors chaîne, par période de règlement | On-chain, montant fixé par l'intégrateur |
| Versement | Par l'équipe, selon l'accord | Immédiat, dans la même transaction |
| Accord avec l'équipe requis | Oui | Non |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.