Skip to content

mattcrypto12/RentQuest

Repository files navigation

RentQuest ๐Ÿงน๐Ÿ’ฐ

Wallet Spring Cleaning for Solana Mobile โ€” Reclaim SOL from empty token accounts

Android Kotlin Solana MWA

๐ŸŽฏ What is RentQuest?

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.

๐Ÿ’ก The Problem

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!

โœจ The Solution

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

๐Ÿ“ฑ Features

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

๐Ÿ—๏ธ Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       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     โ”‚ โ”‚              โ”‚ โ”‚                      โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿš€ Quick Start

Prerequisites

  • Android Studio Hedgehog (2023.1.1) or later
  • JDK 17+
  • Android SDK 34
  • A Solana mobile wallet (Phantom, Solflare, Ultimate, etc.)

Build & Run

# 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

Test on Devnet

  1. Open app โ†’ Settings โ†’ Switch to Devnet
  2. Get Devnet SOL from a faucet
  3. Create test token accounts
  4. Scan and close!

๐Ÿ”’ Security

Account Safety

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
}

Transaction Security

  • All transactions signed locally via Mobile Wallet Adapter
  • No private keys ever leave the wallet app
  • Each transaction is individually confirmed on-chain

๐Ÿ“ Project Structure

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

๐ŸŽฎ Achievements

Badge Name Requirement
๐Ÿงน First Sweep Close your first account
๐Ÿ’จ Dust Buster Close 10 accounts
๐Ÿง‘โ€๐Ÿ”ง The Janitor Close 50 accounts

๐Ÿ› ๏ธ Tech Stack

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

๐Ÿงช Testing

# Unit tests
./gradlew test

# With coverage
./gradlew testDebugUnitTestCoverage

Test Coverage

Module Coverage
Use Cases ~90%
Transaction Builder ~85%
Solana Utils ~95%

๐Ÿ“„ License

MIT License โ€” see LICENSE file.


๐Ÿค Contributing

Contributions welcome! Please read CONTRIBUTING.md first.


๐Ÿ”— Links


Built for the Solana Mobile ecosystem
Reclaim your rent. Clean your wallet. Level up.

About

Android app for reclaiming SOL from empty Solana token accounts

Resources

License

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages