Problem Statement :
Currently in countries like India, the cryptocurrency adoption is very low. You cannot but any products/services with crypto, so we are stuck with centralised fiat, But that's going to change now.
[Note: P2P crypto to fiat exchanges in India is a mess - it took me an hour last time to get the crypto for the hackathon staking.]
Solution
FullOnCrypto solves this problem by delegating the fiat INR payment to others(resolvers) and settle them in DAI(crypto) + fee in eth(crypto).
BASE MAINET CONTRACT:
PaymentEscrow contract: 0x7e7E2bBB58C1F7C710005797C48705747877C647
BASE TESTNET CONTRACT:
PaymentEscrow contract: 0x0C446A3e9c245E255D7d9cE994cd5321BA4E52A4
1-Inch APIs used:
- Balances API - To fetch he current users token balances to be displayed in the profile page.
- Token API - To fetch the token metadata to display the logo of the token. Used both common tokens API and specific token API for DAI.
- Spot Price API - To fetch the INR price of the token.
- Gas price API - To show the current GAS proce of the BASE chain to the users and resolvers.
🏗️ Architecture
This monorepo contains three main applications:
📱 Frontend (fulloncrypto-web/
)
- Tech Stack: React, TypeScript, ethers.js
- Purpose: User interface for creating and managing crypto payment requests
- Features:
- QR code scanning for UPI payments
- MetaMask wallet integration
- Payment request management
- Real-time crypto balances
- Gas price monitoring
- resolver features for commiting and settlement of UPI payment
🔗 Backend API (fulloncrypto-nodejs/
)
- Tech Stack: Node.js, Express, MongoDB
- Purpose: Backend API for user management and payment data
- Features:
- User authentication (traditional & wallet-based)
- Payment request storage and indexing
- UPI ID mapping for smart contracts, storing paymentCriticalData off-chain in MongoDB
- CORS-enabled API endpoints
📜 Smart Contracts (fulloncrypto-contract/
)
- Tech Stack: Solidity, Hardhat, OpenZeppelin
- Purpose: Escrow contracts on Base blockchain
- Features:
- Payment escrow with DAI deposits
- Commitment-based payment flow
- Automatic crypto release upon UPI confirmation
- Gas-optimized for Base network
Blockers faced during hackathon:
- [HIGH] [Mocked] - Verifying the the UPI transactionId status on-chain using oracle. But i need to have a PaymentGateway lisence to get access to the transactionStatus API, So it is mocked with a regex for now.
- [HIGH] [Fixed] - Generating a UPI QR code on behalf of a merchant, here when creating a payment request you want the upi QR to have the destination UPI-address of the merchant. Currently no paymentGateway provides this functionality but i solved it using barebones mobile upi deep-link. eg: upi://pay?pa=<UPI_ID>&pn=<NAME>&am=<AMOUNT>&cu=INR&tn=<NOTE>
- [HIGH] [Fixed] - Merchant UPI address is a payment-critical-data and cannot be stored in public blockchain, so i used mongoDB off-chain storage.
- [HIGH] [FIXED] - Double payment by resolvers was a concern, so i introduced a 5-min commitment window. First a resolver should commit to a payment on blockchain by paying gas and the settke it in 5-mins.
Note: For building this project, I've used assistance of AI to fine-tune the code and the UI styles and documentation