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

# Jetons

> Métadonnées des jetons issues de la liste de jetons Alephium, avec cache.

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={[]} lang="fr" />

```ts theme={null}
powfi.token // TokenModule
```

Le module de jetons récupère la liste de jetons JSON à `network.tokenListUrl` et la garde en cache mémoire pendant **un jour**. Les méthodes d'état de pool des modules CPMM et CLMM s'en servent pour associer un `TokenInfo` (symbole, décimales, logo) aux deux jetons du pool.

<Warning>
  `cpmm.getPoolState` et `clmm.getPoolState` **lèvent une erreur** si l'un des jetons du pool est absent de la liste de jetons. Pour travailler avec des jetons non listés, faites pointer `networkOverrides.tokenListUrl` vers une liste qui les inclut, ou lisez directement les contrats de pool via les [artefacts de contrats](/fr/reference/contracts).
</Warning>

## `TokenInfo`

Issu de `@alephium/token-list` :

```ts theme={null}
interface TokenInfo {
  id: string          // 64-hex token ID (ALPH = ALPH_TOKEN_ID, "00…00")
  name: string
  symbol: string
  decimals: number
  description: string
  logoURI: string
  originChain?: string
  unchainedLogoURI?: string
}
```

## Méthodes

### `getTokens()`

```ts theme={null}
getTokens(): Promise<TokenInfo[]>
```

Renvoie la liste en cache si elle est encore valide, sinon la récupère. Si la récupération échoue et qu'un cache périmé existe, la copie périmée est renvoyée (journalisée au niveau info). Sans cache, l'erreur est levée.

### `getTokenById(id)` / `getTokenBySymbol(symbol)`

```ts theme={null}
getTokenById(id: string): Promise<TokenInfo>
getTokenBySymbol(symbol: string): Promise<TokenInfo>
```

Lèvent `Unknown token, … not found in token list` en l'absence de correspondance. Les symboles sont comparés en respectant la casse, et la première correspondance l'emporte.

### `getTokenInfoBy(predicate)`

```ts theme={null}
getTokenInfoBy(fn: (token: TokenInfo) => boolean): Promise<TokenInfo | undefined>
```

### `fetchTokens()`

Force un rafraîchissement et remplace le cache. Le contenu est validé : il doit être de la forme `{ tokens: TokenInfo[] }`, avec `id`, `name`, `symbol`, `description`, `logoURI` de type chaîne et `decimals` entier dans `[0, 255]`. Tout le reste est rejeté.

## Exemple

```ts theme={null}
const tokens = await powfi.token.getTokens()
const ayin = await powfi.token.getTokenBySymbol('AYIN')
const stable = await powfi.token.getTokenInfoBy((t) => t.symbol.startsWith('USD'))
```


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