SKILL.md — MCW Setup & Operations Guide
Полное руководство по локальной разработке, конфигурации и деплою MultiCurrencyWallet.
Quick Start (Local Dev)
# 1. Установить зависимости
npm install
# 2. Запустить dev-сервер (testnet, localhost:9001)
npm run dev
# 3. Открыть браузер
open http://localhost:9001
Dev-сервер использует testnet конфиг. MetaMask нужно переключить на Sepolia/BSC Testnet.
Config System
Конфиги выбираются через CONFIG env variable при сборке.
src/front/config/
├── mainnet/ # Production config
│ ├── evmNetworks.js — chainId, networkVersion, chainName для каждой EVM-сети
│ ├── web3.js — RPC endpoint URLs
│ ├── api.js — Explorer API keys, WalletConnect Project ID, Infura key
│ └── link.js — Block explorer URLs для отображения
└── testnet/ # Testnet config (same structure)
Добавить новую EVM chain:
mainnet/web3.js— добавьnewchain_provider: 'https://rpc.newchain.io'mainnet/evmNetworks.js— добавь объект сcurrency, chainId, networkVersion, chainName, rpcUrls, blockExplorerUrlsmainnet/link.js— добавь explorer URLmainnet/api.js— добавьnewchainscanURL иnewchain_ApiKey- Повтори для
testnet/ - Проверь RPC:
curl -X POST <rpcUrl> -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
Текущие активные chains (mainnet): ETH, BNB, MATIC, ARBETH, AURETH, XDAI, AVAX, MOVR, ONE, AME
API Keys & Secrets
Все ключи зашиты в конфиге и попадают в бандл — это нормально для open-source crypto wallet.
| Ключ | Файл | Значение |
|---|---|---|
| WalletConnect Project ID | mainnet/api.js → WalletConnectProjectId | a23677c4af3139b4eccb52981f76ad94 |
| Infura API Key | mainnet/api.js → InfuraApiKey | fdd4494101ed4a28b41bb66d7fe9c692 |
| Etherscan V2 API Key | mainnet/api.js → etherscan_V2ApiKey | GK6YHJ5NMEF67R4FTRNQS2EK3HRBP5VVHW |
| BSCScan API Key | mainnet/api.js → bscscan_ApiKey | WI4QEJSV19U3TF2H1DPQ2HR6712HW4MYKJ |
GitHub Actions secret: buildbot — SSH ключ для деплоя в swaponline.github.io репозиторий.
Build Commands
npm run dev # Dev server: testnet, localhost:9001 (hot reload)
npm run build:mainnet # Production build (mainnet config, NODE_ENV=production)
npm run build:testnet # Testnet build (for WordPress plugin testnet widget)
npm run build:wordpress # WordPress plugin ZIP (mainnet + testnet widgets)
Webpack конфиг: webpack/webpack.config.js (common + dev/prod overlays).
Важно: webpack/rules/jsx.js должен использовать babel-loader (НЕ esbuild-loader — ломает react-css-modules).
Testing
# Unit tests (Jest, jsdom environment)
npm run test:unit
npx jest tests/unit/walletConnect.test.ts # 39 тестов WalletConnectProviderV2
npx jest tests/unit/appsCatalog.test.ts # Тесты каталога dApps
# E2E smoke tests (требует запущенного dev-сервера на :9001)
npm run dev &
npm run test:e2e_apps_smoke # 9 Puppeteer тестов Apps
E2E тесты медленные (~66 сек): Puppeteer запускает Chromium, 9 тестов последовательно, каждый ждёт React init.
Deployment
Автоматический деплой: push в master → GitHub Actions → build mainnet → push в swaponline.github.io.
Ручная проверка после деплоя:
curl -sf https://swaponline.github.io | grep -c "root" && echo "✅ site up" || echo "❌ site down"
GitHub Actions workflows:
| Workflow | Триггер | Что делает |
|---|---|---|
deploymaster.yml | push to master | Mainnet build → GitHub Pages |
deploy.yml | push to master | WordPress plugin ZIP → farm.wpmix.net |
appsSmoke.yml | changes in Apps/** | 9 E2E Puppeteer тестов |
rpc-healthcheck.yml | cron (каждые 6ч) | Проверка всех 10 RPC endpoints |
Rollback:
git revert HEAD && git push # Или: git reset --hard HEAD~1 && git push --force
Wallet Connection Stack
MCW использует Reown AppKit + Wagmi v2 + Viem для подключения внешних кошельков.
@reown/appkit — UI модал (MetaMask, WalletConnect, injected wallets)
@reown/appkit-adapter-wagmi — мост AppKit ↔ wagmi
wagmi v2 + viem — EVM wallet state hooks, type-safe RPC
web3 v1.10 — atomic swap механика (отдельно от wallet connection)
Инициализация AppKit: src/front/shared/lib/appkit.ts
Хелпер для подключения: src/front/shared/helpers/metamask.ts
Header chip: src/front/shared/components/Header/WalletChip/index.tsx
dApp Bridge (walletBridge)
Wallet может работать как EIP-1193 провайдер для внешних dApps через iframe + postMessage.
src/front/shared/pages/Apps/
├── appsCatalog.ts — каталог dApps (URL, название, иконка, walletBridge: 'eip1193')
├── walletBridge.ts — EIP-1193 bridge (postMessage с iframe)
└── images/ — PNG иконки для карточек dApps
Добавить новый dApp:
appsCatalog.ts— добавить объект вAPPSмассивEXTERNAL_ALLOWED_HOSTS— добавить hostnametests/e2e/appsSmoke.test.js— добавить вAPPSмассив (ручная синхронизация!)- Добавить
images/{app-id}.png - Убедиться что dApp поддерживает bridge client (
wallet-bridge-init.jsв head)
Atomic Swap Architecture
src/core/
├── swap.app/ — центральный синглтон, соединяет все сервисы
├── swap.auth/ — деривация ключей (BIP44) для каждого блокчейна
├── swap.room/ — libp2p pubsub (P2P order book)
├── swap.orders/ — управление ордерами
├── swap.swaps/ — blockchain-specific swap instances
└── swap.flows/ — HTLC протоколы (BTC↔ETH и другие пары)
P2P signaling сервер: star.wpmix.net (WebRTC STAR transport).
WordPress Plugin
MCW можно встраивать в WordPress как виджет:
npm run build:wordpress # Создаёт dist/wordpress-plugin/*.zip
Deploy: GitHub Actions deploy.yml пушит ZIP в farm.wpmix.net/updates/ и обновляет mcw-info.json.
Плагин доступен на: https://farm.wpmix.net
Pre-push Hook
.git/hooks/pre-push выполняет перед каждым push:
- TypeScript compile check (
tsc --noEmit) - ESLint на изменённых
.ts/.tsxфайлах (no-unused-vars, no-debugger, eqeqeq) - Prettier
--checkна изменённых файлах
При ошибке: npx prettier --write <file> для авто-форматирования.
Key File Locations
| Что | Путь |
|---|---|
| Точка входа React | src/front/client/index.tsx |
| AppKit init | src/front/shared/lib/appkit.ts |
| Redux store | src/front/shared/redux/ |
| EVM chain конфиг | src/front/config/mainnet/evmNetworks.js |
| Header | src/front/shared/components/Header/Header.tsx |
| WalletChip | src/front/shared/components/Header/WalletChip/index.tsx |
| Apps каталог | src/front/shared/pages/Apps/appsCatalog.ts |
| walletBridge | src/front/shared/pages/Apps/walletBridge.ts |
| Webpack config | webpack/webpack.config.js |
| Jest config | jest.config.js |
Обновлено: 2026-03-04