> 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-ru/pod-kapotom/architecture.md).

# Архитектура

> Как \[QR] wallet устроен изнутри — для любопытных и разработчиков.

***

## Технологический стек

| Компонент                 | Технология                                            |
| ------------------------- | ----------------------------------------------------- |
| **Мобильное приложение**  | React Native + Expo                                   |
| **Управление состоянием** | Zustand                                               |
| **Web3**                  | viem, permissionless.js                               |
| **Навигация**             | expo-router                                           |
| **Блокчейн**              | Абстракция аккаунта ERC-4337 (сети EVM Smart Account) |
| **Инфраструктура**        | Bundler, Paymaster, RPC для мультичейн                |
| **Безопасность**          | Биометрия + Secure Enclave                            |
| **Сети**                  | EVM + Solana + Tron + Bitcoin + Dash                  |

***

## Модульная архитектура

\[QR] wallet построен на **модульной архитектуре** — каждая функция изолирована в собственном модуле с четкими слоями:

```
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 никогда не обращается к Infrastructure напрямую — только через слой Application. Domain является чистым, без зависимостей.

***

## Абстракция цепочек

Работа с разными блокчейнами унифицирована через слой абстракции:

```
┌──────────────────────────────────────────────────┐
│                   Ядро цепочек                    │
│                                                   │
│  ┌─────┐ ┌──────┐ ┌────┐ ┌───────┐ ┌────┐       │
│  │ EVM │ │Solana│ │Tron│ │Bitcoin│ │Dash│       │
│  └─────┘ └──────┘ └────┘ └───────┘ └────┘       │
│                                                   │
│  ChainRegistry → ChainConfigProvider              │
│  Единый интерфейс + возможности для каждой сети   │
└──────────────────────────────────────────────────┘
```

* **ChainRegistry** — реестр всех поддерживаемых сетей (видимость можно переключать удалённо)
* **ChainConfigProvider** — конфигурация и возможности для каждой сети
* **TransactionService** — единая отправка для каждой семьи (EVM Smart Account, EOA, Solana, Tron, Bitcoin, Dash)
* **Пользовательские сети EVM** — RPC, добавленные пользователем, без Smart Account

Smart Account (ERC-4337 LightAccount) используется только в поддерживаемых сетях EVM. Bitcoin, Dash, Avalanche и Taiko используют классические аккаунты.

***

## Стек абстракции аккаунта

```
┌──────────────────────────────────────────────┐
│                Пользователь                   │
│           (биометрия → подпись)               │
└──────────────────┬───────────────────────────┘
                   ↓
┌──────────────────┴───────────────────────────┐
│          IAccountProvider                     │
│    Сформировать UserOperation                 │
│    (sender, nonce, callData, initCode)        │
└──────────────────┬───────────────────────────┘
                   ↓
┌──────────────────┴───────────────────────────┐
│          IPaymaster                           │
│    Спонсирование газа                         │
│    (paymasterAndData, gas estimates)          │
└──────────────────┬───────────────────────────┘
                   ↓
┌──────────────────┴───────────────────────────┐
│          IBundler                             │
│    Отправка в блокчейн                        │
│    (sendUserOperation → waitForReceipt)       │
└──────────────────┬───────────────────────────┘
                   ↓
┌──────────────────┴───────────────────────────┐
│          EntryPoint (on-chain)                │
│    Проверка → Выполнение → Оплата газа        │
└──────────────────────────────────────────────┘
```

Три интерфейса (`IAccountProvider`, `IPaymaster`, `IBundler`) абстрагируют конкретного провайдера. Сейчас используется Alchemy, но архитектура позволяет переключиться на любого провайдера без изменения бизнес-логики.

***

## Реестр токенов

Единый реестр для всех токенов в системе:

```typescript
// Каждый токен описывается один раз
{
  symbol: 'USDC',
  name: 'USD Coin',
  addresses: { base: '0x...', arbitrum: '0x...', polygon: '0x...' },
  decimals: { default: 6 },
  flags: { swappable: true, collateral: true, borrowable: true, stakable: true }
}
```

Модули получают нужные им токены через **flags**:

* `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
