ShapeShift mobile app supports WalletConnect v2 for connecting to dApps on both Android and iOS.
dApp → WalletConnect Modal → wc:// URI → ShapeShift Mobile → WebView → ShapeShift Web → WalletConnect Session
The ShapeShift mobile app is a WebView wrapper around app.shapeshift.com. When a user connects via WalletConnect:
- dApp generates WalletConnect pairing URI:
wc://topic@2?relay-protocol=irn&symKey=... - Mobile app receives the deep link via Android/iOS intent system
- Deep link handler (
src/App.tsx:125-132) converts to:shapeshift://wc?uri=wc%3A%2F%2F... - WebView navigates to:
https://app.shapeshift.com/#/wc?uri=... - Web app handles the actual WalletConnect protocol via
@walletconnect/ethereum-provider
For details on the web side implementation, see: Web WalletConnect README
Registered Schemes:
wc://- WalletConnect protocol scheme (appears in "Open with" dialog)shapeshift://- App-specific scheme
Implementation:
- Intent filters defined via Expo config plugin:
plugins/withWalletConnectScheme.js - Plugin runs during
expo prebuildto modifyAndroidManifest.xml - Both schemes route to the same deep link handler
User Experience: When users connect from dApps with older WalletConnect modals on Android:
- User clicks "Connect Wallet"
- Android shows "Open with" dialog
- ShapeShift appears in the list
- User selects ShapeShift
- Connection completes
Registered Schemes:
shapeshift://- App-specific schemecom.shapeShift.shapeShift://- Bundle identifier scheme
Implementation:
- URL types defined in
ios/ShapeShift/Info.plist - iOS uses WalletConnect Cloud Registry for wallet discovery (not raw
wc://scheme)
# Verify wc:// scheme is registered
adb shell pm query-activities -a android.intent.action.VIEW -d "wc://test"
# Test deep link
adb shell "am start -a android.intent.action.VIEW -d 'wc://test@2?relay=irn'"
# Verify shapeshift:// still works
adb shell pm query-activities -a android.intent.action.VIEW -d "shapeshift://test"# Test shapeshift:// scheme
xcrun simctl openurl booted "shapeshift://wc?uri=wc%3A%2F%2Ftest"plugins/withWalletConnectScheme.js- Expo config plugin for Android intent filterapp.json- Plugin registrationsrc/App.tsx(lines 125-132) - Deep link handlerios/ShapeShift/Info.plist- iOS URL schemes
android/app/src/main/AndroidManifest.xml- Generated byexpo prebuild- Contains both
wc://andshapeshift://intent filters
# Start Metro bundler
npx expo start --clear
# Press 's' for development build
# Press 'a' for Android or 'i' for iOS# Regenerate native files
npx expo prebuild --clean
# Build Android
npx expo run:android
# Build iOS
npx expo run:ios# Android
eas build -p android --profile production
# iOS
eas build -p ios --profile production# Clean prebuild and check console output
npx expo prebuild --clean --platform android
# Look for: "✅ Added wc:// intent filter to AndroidManifest"# Check if app is installed
adb shell pm list packages | grep shapeshift
# Verify intent filters
adb shell pm dump com.shapeshift.droid_shapeshift | grep -A 10 "intent-filter"
# Test with simple URI
adb shell "am start -a android.intent.action.VIEW -d 'wc://test'"- Check Metro bundler is running
- Check WebView console via chrome://inspect
- Verify settings are loaded (EXPO_PUBLIC_SHAPESHIFT_URI)
- Web WalletConnect README - Web app implementation details
- Issue #86 - Original Android deep linking issue