Romi is a simple, secure crypto wallet integrating multiple chains and tokens into a pair (Tok/Cha)
Romi watches your wallet and automatically converts any tokens you receive into the crypto you actually want, on the chain you prefer. Set your preferences once, and Romi handles the rest.
Romi simplifies dealing with different cryptocurrencies and blockchains:
Choose Your Preferences Tell Romi what token you want to end up with and which blockchain you prefer. That's it.
Automatic Swaps When someone sends you any supported token, Romi finds the best exchange rate and converts it automatically. No manual swapping needed.
Cross-Chain Delivery If you want your tokens on a different blockchain than where you received them, Romi handles the bridging automatically.
Romi is designed to be straightforward, especially for people new to crypto:
No Existing Wallet Required Don't have a crypto wallet? Romi creates one for you during signup thanks to Privy.
Simple Addresses Instead of long, confusing wallet addresses, you get a readable (and can choose) name like "yourname.romi.eth" that people can actually remember.
Clean Interface The app focuses on what you need to know, not technical details. Set your preferences and you're done.
Right now, Romi works with Base, Arbitrum, and Optimism networks, and supports USDC and WETH. The system is built to add more chains and tokens without effort.
Romi works well for people who:
The goal is for us handle the technical stuff automatically so users can focus on using their crypto rather than managing it.
🖥️ our stack Frontend: NextJS + Privy for SIWE
Wallet Abstraction: [Privy] – To onboard users without existing wallets and create embedded wallets for a seamless start
ENS Integration: [ENS + L2 Registration] – Automatically registers a human-readable ENS (e.g., username.toromi.eth) on supported L2s to make wallet identities memorable and social. We used durin.dev contracts as base to deploy the L2 Registry and Registar
On-chain Data: [The Graph] – For detecting token deposits in registered wallets
Swapping: [1inch API] – Best-route swaps to a destination token
Bridging: [Chainlink CCIP] – Cross-chain delivery of the final token
🧩 How It Works ( Wallet Registration: Users register their wallet and set a destination token and chain. This info is stored and used to determine routing logic later.
Monitoring Wallets: A backend monitor continuously queries The Graph to detect new incoming token balances for registered wallets.
Swap Execution: When a new deposit is detected, we call the 1inch API to find the best route to swap it into the user’s destination token.
Bridge to Final Chain: After swapping, we trigger Chainlink CCIP to bridge the destination token to the chain selected by the user during setup.
🧪 Improvements that could be made CCIP Limitations: Since CCIP doesn’t support all tokens or all routes, we currently only support 3 chains (Base, Optimism, Arbitrum) and 2 tokens. But the system is modula and easy to extend its feature like fallback swaps on destination chains for more supported tokens.
Real-Time Detection: The "monitoring" mechanism isn't webhook-based. It’s polling + caching Graph queries with some throttling. Not ideal for production, but fast enough for a hackathon. 🤝 Partners useful tools The Graph helped us avoid building custom indexers for wallet activity. Massive time saver.
1inch API gave us instant access to multiple DEXs with no need to write on-chain routing logic.
Chainlink CCIP gave us a secure and trusted way to bridge across chains without building our own bridge infra.
Privy: Made onboarding frictionless for non-Web3 users.