Интеграция WalletConnect в мобильное криптоприложение
WalletConnect — открытый протокол для связи мобильных кошельков с DApp. Пользователь сканирует QR-код или переходит по deep link — и получает безопасное зашифрованное соединение между кошельком и веб-приложением. Без хранения приватных ключей на сервере DApp.
WalletConnect v2: что изменилось
WalletConnect v1 был deprecated в 2023 году. v2 (теперь называется Web3Modal SDK / AppKit) работает через централизованный relay-сервер WalletConnect, но вся криптография end-to-end. Ключевые отличия от v1:
- Поддержка нескольких сетей в одной сессии (multi-chain)
- Обязателен Project ID с
cloud.walletconnect.com - Протокол Sign API v2 вместо Legacy API
- Namespace-based запросы:
eip155:1для Ethereum mainnet,solana:mainnetдля Solana
Реализация на iOS (Swift)
Официальный SDK — WalletConnectSwiftV2. Подключаем через SPM:
// Package.swift или Xcode Package Manager
.package(url: "https://github.com/WalletConnect/WalletConnectSwift-v2", from: "1.9.0")
Инициализация:
Networking.configure(
groupIdentifier: "group.com.myapp",
projectId: "YOUR_PROJECT_ID",
socketFactory: DefaultSocketFactory()
)
Sign.configure(crypto: DefaultCryptoProvider())
Обработка входящих пропоузалов сессии:
Sign.instance.sessionProposalPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] proposal in
// Показываем пользователю список запрошенных методов и сетей
self?.showApprovalAlert(proposal: proposal)
}
.store(in: &cancellables)
При одобрении — создаём namespace объект с поддерживаемыми методами (eth_sendTransaction, personal_sign, eth_signTypedData) и вызываем Sign.instance.approve(proposalId:namespaces:).
Обработка запросов на подпись
После установки сессии DApp отправляет запросы. Самый частый — personal_sign:
Sign.instance.sessionRequestPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] request in
switch request.method {
case "personal_sign":
let params = try? request.params.get([String].self)
let message = params?[0] ?? ""
// Показываем пользователю что подписывается
self?.showSignRequest(message: message, request: request)
case "eth_sendTransaction":
// Показываем детали транзакции
break
default:
// Отклоняем неизвестные методы
Task { try await Sign.instance.respond(
topic: request.topic,
requestId: request.id,
response: .error(.methodNotFound)
)}
}
}
.store(in: &cancellables)
Важно: никогда не подписывать автоматически — каждый запрос на подпись требует явного подтверждения пользователя.
Deep link для мобильного использования
WalletConnect поддерживает два режима: QR-код (для десктопных DApp) и Universal Link / Custom URL Scheme (для мобильных DApp). Для wallet-to-wallet соединения пользователь нажимает кнопку в DApp мобильного браузера, его перебрасывает в кошелёк через deep link с wc:// URI.
Обрабатываем URI в SceneDelegate / @main App:
.onOpenURL { url in
if url.scheme == "wc" {
Task { try await Sign.instance.pair(uri: WalletConnectURI(string: url.absoluteString)!) }
}
}
Android
Для Android используем WalletConnect Android Core (com.walletconnect:android-core) + sign библиотеку. API схожее, но event-driven через CoreClient.Wallet.setWalletDelegate(delegate).
Тестирование
WalletConnect предоставляет тестовый DApp на lab.web3modal.com — хороший инструмент для проверки всех методов подписи без реального блокчейна. Для транзакций используем тестовые сети (Sepolia, Mumbai).
Сроки: базовая интеграция WalletConnect v2 с personal_sign и eth_sendTransaction — 1-2 недели. Полная поддержка multi-chain, eth_signTypedData v4, отзыв сессий и UI состояний подключения — 3-4 недели.







