
Passerelle
Send money home. Not fees.
About
The problem it solves Sending money from Europe to North Africa shouldn't cost 6-8% and take 3 days. Western Union and MoneyGram extract billions in fees from diaspora communities every year, money that should reach families, not middlemen. Passerelle lets you send USDC from any crypto wallet directly to a recipient's mobile money account (Orange Money, CIH Mobile, Wafacash) in minutes, for a fraction of the cost. - ~0.3% fees vs. 6-8% through traditional providers - Minutes, not days: stablecoin settlement is near-instant - Non-custodial escrow: funds are locked on-chain until the payout is confirmed, not held by a company - Recipients use mobile money: no crypto wallet or technical knowledge required on their end Built for the French-Moroccan corridor first, with the architecture to support any diaspora route worldwide. Use of AI tools and agents AI tools played a significant role in accelerating development across the stack, particularly given the tight hackathon timeline. Claude was the primary tool used throughout the project: for scaffolding the Solidity contracts, writing and iterating on the Next.js frontend, debugging the completeRemittance() revert, writing the test suite, and drafting documentation including the README. Most of the implementation was AI-assisted, partly due to time constraints and partly due to limited prior experience with Solidity. GitHub Copilot assisted with boilerplate-heavy frontend code: RainbowKit configuration, wagmi hooks, and repetitive TypeScript patterns. To be transparent: the product design, corridor selection, architecture decisions, and overall flow were made entirely independently. AI was brought in to execute and implement, but not to decide what to build or why.
How it's made
Challenges we ran into **Getting MockUSDC right** Circle doesn't offer a USDC faucet on Base Sepolia, which meant we needed a mintable stand-in for testing. The solution was straightforward — a custom ERC20 with a public mint() and faucet() function, but it took some iteration to make sure the decimal handling (6 decimals, matching real USDC) was consistent across the contract, the frontend, and the test suite. A mismatch here would have silently broken fee calculations. **Verifying contracts on Base Sepolia** BaseScan uses Etherscan's V2 API, and the verification flow isn't as well-documented as mainnet. Getting the Hardhat config and constructor arguments aligned took a few attempts, but once the V2 endpoint was correctly configured in hardhat.config.js, both contracts verified cleanly. **The completeRemittance() revert** The trickiest issue was a consistent on-chain revert when the liquidity provider tried to confirm a payout. The sender flow ( approve, create, escrow ) worked end to end, but completing the remittance from the LP dashboard kept failing silently. Tracking down the revert reason pointed to a caller address mismatch: the LP dashboard was calling completeRemittance() from a different wallet than the one assigned at creation time. A single-wallet demo setup (where the deployer is both owner and LP) resolved it for the demo corridor.