This guide helps existing Hunty deployments migrate to the new network switching feature.
The network switching feature introduces:
- Runtime network selection (testnet/mainnet)
- Network-specific contract addresses
- Wallet network detection
- Visual network indicators
Old:
NEXT_PUBLIC_HUNTY_CORE_ADDRESS=CA...
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS=CA...
NEXT_PUBLIC_NFT_REWARD_ADDRESS=CA...New (Backwards Compatible):
# Network-specific (recommended)
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_TESTNET=CA...
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS_TESTNET=CA...
NEXT_PUBLIC_NFT_REWARD_ADDRESS_TESTNET=CA...
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_MAINNET=CA...
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS_MAINNET=CA...
NEXT_PUBLIC_NFT_REWARD_ADDRESS_MAINNET=CA...
# Legacy (still works, used as testnet fallback)
NEXT_PUBLIC_HUNTY_CORE_ADDRESS=CA...
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS=CA...
NEXT_PUBLIC_NFT_REWARD_ADDRESS=CA...The app now resolves contract addresses with this priority:
- Network-specific env var (e.g.,
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_TESTNET) - Legacy env var (e.g.,
NEXT_PUBLIC_HUNTY_CORE_ADDRESS) - used as testnet fallback - Empty string (will throw error when
getRequiredAddress()is called)
If you're only using testnet, rename your variables:
# Before
NEXT_PUBLIC_HUNTY_CORE_ADDRESS=CAxxxTestnet
# After
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_TESTNET=CAxxxTestnetIf you want to support both networks:
# Testnet
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_TESTNET=CAxxxTestnet
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS_TESTNET=CAxxxTestnet
NEXT_PUBLIC_NFT_REWARD_ADDRESS_TESTNET=CAxxxTestnet
# Mainnet
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_MAINNET=CAxxxMainnet
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS_MAINNET=CAxxxMainnet
NEXT_PUBLIC_NFT_REWARD_ADDRESS_MAINNET=CAxxxMainnetIf you don't have mainnet contracts yet:
- Deploy your Soroban contracts to mainnet
- Update environment variables with mainnet addresses
- Test thoroughly on mainnet with small amounts
Add new environment variables in your dashboard:
- Go to Project Settings → Environment Variables
- Add the new network-specific variables
- Redeploy
Update your Dockerfile or docker-compose.yml:
ENV NEXT_PUBLIC_HUNTY_CORE_ADDRESS_TESTNET=${HUNTY_CORE_TESTNET}
ENV NEXT_PUBLIC_HUNTY_CORE_ADDRESS_MAINNET=${HUNTY_CORE_MAINNET}-
Local Testing:
npm run dev # Visit http://localhost:3000/settings # Try switching networks
-
Verify Contract Loading:
import { getContracts } from "@/lib/contracts/config" console.log(getContracts())
-
Check Network Detection:
- Connect wallet
- Switch app network
- Verify mismatch warnings appear
Update your CI/CD pipeline to include network variables:
# .github/workflows/deploy.yml
env:
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_TESTNET: ${{ secrets.HUNTY_CORE_TESTNET }}
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_MAINNET: ${{ secrets.HUNTY_CORE_MAINNET }}
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS_TESTNET: ${{ secrets.REWARD_MGR_TESTNET }}
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS_MAINNET: ${{ secrets.REWARD_MGR_MAINNET }}
NEXT_PUBLIC_NFT_REWARD_ADDRESS_TESTNET: ${{ secrets.NFT_REWARD_TESTNET }}
NEXT_PUBLIC_NFT_REWARD_ADDRESS_MAINNET: ${{ secrets.NFT_REWARD_MAINNET }}If you need to rollback:
The new code is backwards compatible. Old variables work as testnet fallbacks:
# These still work (treated as testnet)
NEXT_PUBLIC_HUNTY_CORE_ADDRESS=CA...
NEXT_PUBLIC_REWARD_MANAGER_ADDRESS=CA...
NEXT_PUBLIC_NFT_REWARD_ADDRESS=CA...git revert <network-switching-commit>
npm install
npm run buildCause: Network-specific env vars not set
Solution:
# Set for active network
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_TESTNET=CA...
# or
NEXT_PUBLIC_HUNTY_CORE_ADDRESS_MAINNET=CA...Cause: localStorage blocked or disabled
Solution:
- Check browser privacy settings
- Enable cookies/localStorage
- Use incognito mode to test
Cause: Wallet on different network than app
Solution:
- Switch wallet network in wallet settings
- Or switch app network in Settings page
- Week 1: Deploy with testnet only
- Week 2: Add mainnet contracts (disabled in UI)
- Week 3: Enable mainnet switching for beta users
- Week 4: Full rollout
testnet.hunty.app→ Locked to testnetapp.hunty.app→ Locked to mainnet- Lock network by not including the NetworkSwitcher component
// lib/featureFlags.ts
export const ENABLE_NETWORK_SWITCHING =
process.env.NEXT_PUBLIC_ENABLE_NETWORK_SWITCHING === "true"
// In Settings page
{ENABLE_NETWORK_SWITCHING && <NetworkSwitcher />}- Network switch events
- Network mismatch warnings shown
- Failed transactions by network
- User distribution (testnet vs mainnet)
import { analytics } from "@/lib/analytics"
// Track network switches
setSorobanNetworkType(newNetwork)
analytics.track("network_switched", {
from: currentNetwork,
to: newNetwork,
timestamp: Date.now()
})
// Track network mismatches
if (mismatch) {
analytics.track("network_mismatch_detected", {
appNetwork: mismatch.appNetwork,
walletNetwork: mismatch.walletNetwork,
provider: walletProvider
})
}Before going live:
- All contract addresses set for both networks
- Testnet contracts functional
- Mainnet contracts functional
- Network switching works locally
- Network switching works in staging
- Visual indicators display correctly
- Wallet network detection works
- Mismatch warnings appear
- Transactions succeed on testnet
- Transactions succeed on mainnet
- User preference persists
- Cross-tab synchronization works
- Mobile responsive
- Dark mode compatible
- Display migration notice in UI
- Provide clear instructions
- Monitor support channels
- Have rollback plan ready
- Document breaking changes
- Provide code examples
- Host Q&A session
- Update all documentation
- Monitor error rates
- Track network switching
- Collect user feedback
- Fix critical issues
- Optimize network detection
- Improve error messages
- Add more visual indicators
- Consider UX improvements
- Evaluate mainnet adoption
- Plan additional features
- Update documentation
- Share lessons learned
Contact the development team or open an issue on GitHub.
Last Updated: January 2025