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

# 网络与配置

> 内置网络、覆盖端点，以及合约地址的解析方式。

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

## 内置网络

`Powfi.load({ networkId })` 会从以下配置（`defaultNetworks`）中选择一个：

| `networkId` | 节点 | 浏览器 API | 代币列表 |
| - | - | - | - |
| `mainnet` | `https://node.mainnet.alephium.org` | `https://backend.mainnet.alephium.org` | `alephium/token-list` → `tokens/mainnet.json` |
| `testnet` | `https://node.testnet.alephium.org` | `https://backend.testnet.alephium.org` | `h0ngcha0/token-list` → `testnet.json` |
| `devnet` | `http://127.0.0.1:22973` | `http://localhost:9090` | `http://127.0.0.1:4000/token-list/devnet.json` |

未知的 `networkId` 会抛出 `Network <id> not found`。

## 覆盖端点

用 `networkOverrides` 替换除 `id` 以外的任意字段：

```ts theme={null}
const powfi = Powfi.load({
  networkId: 'mainnet',
  networkOverrides: {
    nodeUrl: 'https://my-node.example.com',
    nodeApiKey: process.env.ALEPHIUM_API_KEY,
    tokenListUrl: 'https://cdn.example.com/my-token-list.json'
  }
})
```

`Network` 字段：

<ParamField path="id" type="NetworkId" required>
  `'mainnet' | 'testnet' | 'devnet'`。同时决定端点和打包的合约部署。
</ParamField>

<ParamField path="name" type="string">显示名称。</ParamField>
<ParamField path="nodeUrl" type="string">全节点 REST 端点。</ParamField>
<ParamField path="nodeApiKey" type="string">可选，发送给节点的 API key。</ParamField>
<ParamField path="explorerApiUrl" type="string">浏览器后端端点（供 `powfi.explorerProvider` 使用）。</ParamField>
<ParamField path="explorerUrl" type="string">浏览器网页地址，用于生成链接。</ParamField>
<ParamField path="tokenListUrl" type="string">JSON 代币列表，格式为 `{ tokens: TokenInfo[] }`。</ParamField>

## 合约地址

每个模块都会针对所选的 `networkId`，从 SDK 打包的部署文件（`cpmm/deployments`、`clmm/deployments`、`staking/deployments`）中加载合约 ID：

| 模块 | 配置类型 | 加载自 |
| - | - | - |
| CPMM | `CpmmConfig` | `Router`、`TokenPairFactory` |
| CLMM | `ClmmConfig` | `PoolFactory`、`PositionManager`、`DexAccountRoot` |
| 质押 | `StakingConfig` | `XAlphToken`、`AlphUnstakeVault`、`RewardFeeCollector` |

如果要让某个模块指向不同的部署（分叉链或你自己的 devnet），请在加载后覆盖其配置：

```ts theme={null}
powfi.cpmm.setConfig({ groupIndex: 0, factoryId: '...', routerId: '...' })
powfi.clmm.setConfig({ groupIndex: 0, factoryId: '...', positionManagerId: '...', defaultConfigIndex: 0n, accountRoot: '...' })
powfi.staking.setConfig({ /* StakingConfig */ })
```

读取当前生效的配置：`powfi.cpmm.getConfig()`、`powfi.clmm.getClmmConfig()`、`powfi.staking.getConfig()`。

<Warning>
  各模块的 getter 命名不一致。在 `ClmmModule` 上，`getConfig()` 会**重新读取打包的部署文件**，并忽略 `setConfig` 设置的覆盖值；读取当前生效的配置请用 `getClmmConfig()`。`CpmmModule` 则相反：`getConfig()` 返回当前生效的配置，`getCpmmConfig()` 重新读取部署文件。
</Warning>

## 分组与地址

Alephium 被分片为多个地址分组，每个模块的所有 Powfi 合约都位于同一个分组（`config.groupIndex`）。池、头寸和金库的 ID 是在该分组中推导出的子合约 ID，因此可以离线计算：

```ts theme={null}
powfi.cpmm.getPoolId(tokenA, tokenB)               // CPMM pair (also the LP token ID)
powfi.clmm.getPoolId(tokenA, tokenB, configIndex)  // CLMM pool
powfi.clmm.getPositionId(poolId, owner, tickLower, tickUpper)
```

**无分组地址**（没有 `:group` 后缀的新式地址）通过 `normalizeAddress(address, group)` 规范化，必要时追加 `:<group>`。SDK 内部会对 sender、owner、recipient 和 fee recipient 参数执行此操作。

## 本地 devnet

SDK 的集成测试运行在本地 Alephium devnet 上：

```bash theme={null}
cd powfi-sdk
docker compose -f docker/docker-compose.yml up -d
```

使用 `networkId: 'devnet'` 时，SDK 连接 `127.0.0.1:22973` 并使用 devnet 部署。devnet 上的解除质押解锁期是 1 分钟，而不是 30 天。


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