> For the complete documentation index, see [llms.txt](https://docs.qr.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.qr.xyz/qr-zh/ji-shu-nei-mu/architecture.md).

# 架构

> \[QR] 钱包内部是如何构建的——面向好奇者和开发者。

***

## 技术栈

| 组件       | 技术                                   |
| -------- | ------------------------------------ |
| **移动应用** | React Native + Expo                  |
| **状态管理** | Zustand                              |
| **Web3** | viem, permissionless.js              |
| **导航**   | expo-router                          |
| **区块链**  | ERC-4337 账户抽象（EVM 智能账户网络）            |
| **基础设施** | Bundler、Paymaster、多链 RPC             |
| **安全**   | 生物识别 + 安全隔区                          |
| **网络**   | EVM + Solana + Tron + Bitcoin + Dash |

***

## 模块化架构

\[QR] 钱包构建于一个 **模块化架构** —— 每个功能都被隔离在各自的模块中，并具有清晰的层次：

```
modules/{feature}/
├── domain/          ← 纯业务逻辑和类型
├── infrastructure/  ← API、存储、外部服务
├── application/     ← 状态管理和外观层
└── ui/              ← React 组件（UI）
```

### 层

| 层        | 职责          | 示例                                     |
| -------- | ----------- | -------------------------------------- |
| **领域**   | 类型、接口、业务规则  | `Swap.entity.ts`, `StakingPool`        |
| **基础设施** | API 调用和外部服务 | `SwapApi.ts`, `AlchemyPaymaster`       |
| **应用层**  | 状态、UI 逻辑、外观 | `useSwapFacade.ts`, `SponsoredTxStore` |
| **UI**   | 视觉组件        | `SwapScreen.tsx`、按钮、卡片                 |

### 导入规则

```
UI → 应用层 → 领域 & 基础设施 → 领域
```

UI 从不直接与基础设施对话——只通过应用层。领域是纯净的，零依赖。

***

## 链抽象

通过抽象层统一处理不同区块链：

```
┌──────────────────────────────────────────────────┐
│                   链核心                         │
│                                                   │
│  ┌─────┐ ┌──────┐ ┌────┐ ┌───────┐ ┌────┐       │
│  │ EVM │ │Solana│ │Tron│ │Bitcoin│ │Dash│       │
│  └─────┘ └──────┘ └────┘ └───────┘ └────┘       │
│                                                   │
│  ChainRegistry → ChainConfigProvider              │
│  统一接口 + 各链能力                               │
└──────────────────────────────────────────────────┘
```

* **ChainRegistry** — 所有受支持网络的注册表（可远程切换可见性）
* **ChainConfigProvider** — 每条链的配置和能力
* **TransactionService** — 按系列统一发送（EVM 智能账户、EOA、Solana、Tron、Bitcoin、Dash）
* **自定义 EVM 网络** — 用户添加的 RPC，无智能账户

智能账户（ERC-4337 LightAccount）仅用于受支持的 EVM 网络。Bitcoin、Dash、Avalanche 和 Taiko 使用传统账户。

***

## 账户抽象栈

```
┌──────────────────────────────────────────────┐
│                用户                           │
│          （生物识别 → 签名）                  │
└──────────────────┬───────────────────────────┘
                   ↓
┌──────────────────┴───────────────────────────┐
│          IAccountProvider                     │
│    构建 UserOperation                          │
│    (sender, nonce, callData, initCode)        │
└──────────────────┬───────────────────────────┘
                   ↓
┌──────────────────┴───────────────────────────┐
│          IPaymaster                           │
│    Gas 赞助                                   │
│    (paymasterAndData, gas estimates)          │
└──────────────────┬───────────────────────────┘
                   ↓
┌──────────────────┴───────────────────────────┐
│          IBundler                             │
│    提交到区块链                               │
│    (sendUserOperation → waitForReceipt)       │
└──────────────────┬───────────────────────────┘
                   ↓
┌──────────────────┴───────────────────────────┐
│          EntryPoint（链上）                   │
│    验证 → 执行 → 支付 Gas                     │
└──────────────────────────────────────────────┘
```

三个接口（`IAccountProvider`, `IPaymaster`, `IBundler`）将具体提供方抽象掉。目前使用 Alchemy，但该架构允许在不更改业务逻辑的情况下切换到任意提供方。

***

## 代币注册表

系统中所有代币的统一注册表：

```typescript
// 每个代币只描述一次
{
  symbol: 'USDC',
  name: '美元币',
  addresses: { base: '0x...', arbitrum: '0x...', polygon: '0x...' },
  decimals: { default: 6 },
  flags: { swappable: true, collateral: true, borrowable: true, stakable: true }
}
```

模块通过以下方式获取所需代币： **标志**:

* `swappable: true` → 兑换代币
* `collateral: true` → 借入抵押代币
* `borrowable: true` → 可借入代币
* `stakable: true` → 质押代币

这消除了重复——代币数据只被描述 **一次** 并在各处使用。

***

## 18 种语言

该应用已本地化为 18 种语言：

EN, RU, ES, FR, HI, ID, JA, KO, MS, PT, TH, TL, TR, UR, VI, ZH, AR, BN
