Wallet Spring Cleaning for Solana Mobile โ Reclaim SOL from empty token accounts
Every token account on Solana costs ~0.002 SOL in rent. If you've airdropped, swapped, or experimented with tokens, your wallet likely has dozens of empty accounts holding your SOL hostage.
RentQuest scans your wallet, identifies reclaimable accounts, and batch-closes them โ returning your SOL with satisfying animations and achievement unlocks.
Token Account A: 0 USDC โ 0.00203928 SOL locked
Token Account B: 0 BONK โ 0.00203928 SOL locked
Token Account C: 0 JUP โ 0.00203928 SOL locked
... ร 50 accounts = 0.10+ SOL lost!
RentQuest makes wallet cleanup:
- Safe โ Only closes zero-balance accounts you own
- Fast โ Batches up to 8 closures per transaction
- Fun โ Gamified with achievements and animations
| Feature | Description |
|---|---|
| ๐ Smart Scan | Detects empty SPL Token & Token-2022 accounts |
| ๐ MWA Integration | Secure signing via Phantom, Solflare, etc. |
| โก Batch Close | Up to 8 accounts per transaction |
| ๐ฎ Achievements | Unlock badges as you clean |
| ๐ History | Track all recovery operations |
| ๐ Multi-Cluster | Mainnet, Devnet, or custom RPC |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ UI Layer โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โOnboardingโ โ Scan โ โ Progress โ โ History โ โ
โ โ Screen โ โ Screen โ โ Screen โ โ Screen โ โ
โ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โ
โ โโโโโโโโโโโโโโดโโโโโโโโโโโโโดโโโโโโโโโโโโโ โ
โ โ โ
โ MainViewModel โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Domain Layer โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ โ
โ โ ScanTokenAccountsโ โBatchCloseAccountsโ โExecuteClose โ โ
โ โ UseCase โ โ UseCase โ โTransactions โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Data Layer โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ SolanaRpc โ โ MwaClient โ โ DataStoreManager โ โ
โ โ Client โ โ โ โ โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- Android Studio Hedgehog (2023.1.1) or later
- JDK 17+
- Android SDK 34
- A Solana mobile wallet (Phantom, Solflare, Ultimate, etc.)
# Clone the repository
git clone https://github.com/your-org/RentQuest.git
cd RentQuest
# Build debug APK
./gradlew assembleDebug
# Install on connected device
./gradlew installDebug
# Run tests
./gradlew test- Open app โ Settings โ Switch to Devnet
- Get Devnet SOL from a faucet
- Create test token accounts
- Scan and close!
The app uses strict safety checks before closing any account:
fun isClosable(account: TokenAccount): Boolean {
// โ
Amount must be exactly zero
if (account.amount != 0L) return false
// โ
User must be the owner
if (account.owner != connectedWallet) return false
// โ
No close authority restrictions
if (account.closeAuthority != null &&
account.closeAuthority != account.owner) return false
return true
}- All transactions signed locally via Mobile Wallet Adapter
- No private keys ever leave the wallet app
- Each transaction is individually confirmed on-chain
app/src/main/java/com/rentquest/app/
โโโ data/
โ โโโ local/
โ โ โโโ DataStoreManager.kt # Preferences & history
โ โโโ rpc/
โ โ โโโ RpcModels.kt # JSON-RPC DTOs
โ โ โโโ SolanaRpcClient.kt # HTTP client
โ โโโ solana/
โ โ โโโ SolanaUtils.kt # Base58, PublicKey
โ โ โโโ TransactionBuilder.kt # TX construction
โ โโโ wallet/
โ โโโ MwaClient.kt # Mobile Wallet Adapter
โโโ domain/
โ โโโ model/
โ โ โโโ WalletModels.kt # Session, Cluster
โ โ โโโ TokenModels.kt # TokenAccount, ScanResult
โ โ โโโ TransactionModels.kt # CloseTransaction, Status
โ โ โโโ AchievementModels.kt # Gamification
โ โโโ usecase/
โ โโโ ScanTokenAccountsUseCase.kt
โ โโโ BatchCloseAccountsUseCase.kt
โ โโโ ExecuteCloseTransactionsUseCase.kt
โโโ ui/
โโโ components/
โ โโโ Animations.kt # Loot & achievements
โ โโโ CommonComponents.kt # Buttons, cards, states
โโโ navigation/
โ โโโ Navigation.kt # Screen definitions
โโโ screens/
โ โโโ OnboardingScreen.kt
โ โโโ ConnectScreen.kt
โ โโโ ScanScreen.kt
โ โโโ CloseProgressScreen.kt
โ โโโ HistoryScreen.kt
โ โโโ SettingsScreen.kt
โโโ theme/
โ โโโ Color.kt
โ โโโ Theme.kt
โ โโโ Type.kt
โโโ viewmodel/
โ โโโ MainViewModel.kt
โโโ MainActivity.kt
| Badge | Name | Requirement |
|---|---|---|
| ๐งน | First Sweep | Close your first account |
| ๐จ | Dust Buster | Close 10 accounts |
| ๐งโ๐ง | The Janitor | Close 50 accounts |
| Component | Technology |
|---|---|
| Language | Kotlin 1.9.21 |
| UI | Jetpack Compose + Material 3 |
| Architecture | MVVM + Clean Architecture |
| Wallet | Mobile Wallet Adapter 2.0.3 |
| Network | OkHttp 4.12.0 |
| Serialization | kotlinx-serialization-json |
| Storage | DataStore Preferences |
| Build | Gradle 8.2 + AGP 8.2.0 |
# Unit tests
./gradlew test
# With coverage
./gradlew testDebugUnitTestCoverage| Module | Coverage |
|---|---|
| Use Cases | ~90% |
| Transaction Builder | ~85% |
| Solana Utils | ~95% |
MIT License โ see LICENSE file.
Contributions welcome! Please read CONTRIBUTING.md first.
Built for the Solana Mobile ecosystem
Reclaim your rent. Clean your wallet. Level up.